页面是几块拼的 · Views 找 Id · ViewRef · 按钮 · Rule 判断题 · 三种变色 + 答错过的地方
前面学的视图、角色、公式都是在 C8 网页里点出来的;这一课改的是服务器上的 4 个文件,位置 D:\C8\WebAccess\Site。
| 文件 | 管什么 |
|---|---|
Site.xml | 页面上放什么:哪些数据、哪些按钮、谁能看 |
Site.js | 点了按钮、改了字段之后做什么 |
Site.css | 长什么样:颜色、字号 |
en.js | 页面上显示的文字:内部名 → 显示名 |
| 写法 | 意思 | 例子 |
|---|---|---|
Child: | 顺着箭头走 | 站在里布衬,Child:ProductType → 辅料 |
Parent: | 逆着箭头回去,找谁指着我 | 站在辅料,Parent:ProductType → 里布衬、金属扣… |
Index: | 一串里按位置挑一个,从 0 数 | Child:ProductColors/Index:0 → 第 1 个配色 |
打开任何页面,点底栏 Views,上方会列出拼成这个页面的每一块,每块第一行写着 Id / Type / Module。
| 显示的 | 是什么 |
|---|---|
Id | 这一块的名字 |
Type | 它挂在哪个 NodeRef Type="…" 下面 |
Module | 写在哪:Site=我们改过的;Apparel、SiteAdmin 等=系统原厂 |
| xsi:type | 页面上长什么样 |
|---|---|
Tabs | 一排标签页 |
Table | 一张清单表 |
Form | 新建 / 编辑时弹出来填的窗口 |
ViewRef=一行一个标签:Tabs 块里写几行 ViewRef Id="…",页面上就有几个标签,每个标签放 Id 叫那个名字的表。它跟 ref 一个道理:存别人的编号,顺着指过去(ref 指一行数据,ViewRef 指一个页面块)。

| 想改的地方 | 找哪一块 |
|---|---|
| 一排标签(加 / 删 / 换顺序) | xsi:type="Tabs" 那块,改里面的 ViewRef |
| 一张表(数据范围、操作栏按钮) | xsi:type="Table" 那块 |
| 表里的列 | Card / Heading |
<!-- … --> 包起来=注释掉,不生效,以后好恢复。| 在哪出现 | 是什么 | |
|---|---|---|
| Node | Debug、数据库 | 一行数据 |
| NodeRef | Site.xml | 「在系统原来那份定义上加东西」。原文件用 <Node> 写完整定义,我们不动它;Site.xml 用 <NodeRef> 只写要加的 |
<Node> 去写会把原页面整个覆盖掉。写在 <Actions> 里的 Action,出现在页面的「操作」栏。现成的有 New 新建、NewFrom 从…新建、Copy 复制、Edit 编辑、Delete 删除、MoveUp / MoveDown 上移下移。
| 时间点 | 挂什么 | 例子 |
|---|---|---|
| 点了保存、还没发给服务器 | OnAction | 存之前把日期填成今天 |
| 服务器存完、结果回到页面 | PostAction | 存完把另一块表格刷新 |
口诀:On=存之前插一手,Post=存完再补一刀。
一个按钮靠 3 个名字把文件串起来,一个字母都不能差:
| 管什么 | 同一个名字写在 |
|---|---|
| 显示什么字 | Site.xml 的 Action Id ↔ en.js |
| 点了跑哪段 | Site.xml 的 OnAction="Site.函数名" ↔ Site.js 的函数名 |
| 改哪个属性 | Site.js 里照抄的属性内部名 ↔ 网页上建属性时起的名 |
en.js 里分区写:包在 "View" 下面的是页面 / 标签页的名字,包在 "Action" 下面的是按钮的名字。en.js 里没写,页面上就直接显示内部名。
| 步 | 做什么 |
|---|---|
| ① | en.js 里 Ctrl+F 搜页面上看到的中文 |
| ② | 搜到 "内部名": "中文",冒号左边就是 Id |
| ③ | 往上看它被 "View" 还是 "Action" 包着 → 页面还是按钮 |
| ④ | 拿 Id 去 Site.xml 搜,找到它的定义 |
\u65b0\u589e 这种编码,搜中文会搜不到。Rule 只有成立和不成立两种结果,挂在哪,决定成立以后发生什么。
| 挂在哪 | 成立以后 | 例子 |
|---|---|---|
| 列(Heading)里,带 Class | 这一格换样式 | 状态=紧急 → 红 |
| 按钮里,判断数据 | 按钮能用 | 未发送并且新建 → 能删 |
| 按钮里,判断角色 | 这个人能用 | Admin 或创新洞察部门 → 能新增 |


两种写法,效果一样:
| 填空式 | 公式式(Exp) |
|---|---|
Id1="C8_Style_Status" | attr('C8_Style_Status') |
Op="EQ" | == |
Value="C8_StyleStatus:紧急" | 'C8_StyleStatus:紧急' |
<Rule Class="Red" Exp="attr('C8_Style_Status')=='C8_StyleStatus:紧急'"/>
| 写法 | 意思 |
|---|---|
attr('列名') | 取这一行这一列的值(列名填内部名) |
&& | 并且,两个都成立才算(文件里写成 &&) |
|| | 或者,一个成立就算 |
currentRoleName() | 当前登录这个人的角色名 |
leftstr(x,4) / rightstr(x,5) | 取左边前 4 个字 / 右边后 5 个字(一次放进整个部门的角色) |
Site.xml 里只写样式名 Class="名字";颜色在 Site.css 里写 .名字 { background-color: … }(前面的点是 CSS 固定写法)。又是靠同名对上。
| 变什么 | Site.xml 写在哪 | 条件 |
|---|---|---|
| 整行 | Relationship 里的 <Rule Class=…/> | 有 |
| 一格 | Heading 里的 <Rule Class=…/> | 有 |
| 表头 | Heading 上直接写 Class="…" | 没有,永远 |
同一条 Rule,从 Relationship 挪到 Heading,就从整行变色变成只变一格。先看它在哪一层,就知道它管哪一块。


表头那条 CSS 写成 .tableView>thead>tr>th.名字:> 读「里面的」,意思是只给表格表头里带这个名字的格子上色。
thisNode() 说成「这一行的名称 / URL」:它是这一行本身;要名字得再 .attr("Node Name"),取到的是值。uniqueKey("HB") 前面用过 2 次,第 3 次答成 001/002:一次只吐一个号,这次是 3 → 003。Class、结尾少了 ":引号一定成对,少一个整个文件可能加载不了。