声明:由于本人确实需要这些信息,又担心原网站挂掉,导致我无法维护自己系统,因此复制这些,如有侵权,请告知。感谢系统相关人员:
网址:http://os.opensns.cn/book/index/read/id/2.html
系统机制
开启调试模式
1.在OpenCenter中开启调试模式,只需要将/index.php中
define (
'APP_DEBUG'
, true);
将此处设为true即可。
开启调试之后将关闭模板缓存,会大幅降低程序的运行速度。
开启调试之后,空白的广告位会显示占位符。
2.开启页面trace,跟踪错误
【后台】-【系统】-【网站配置】-系统配置-是否显示页面Trace(是否显示页面Trace信息)
选择 开启
保存
3.调试中的变量输出
php文件中
dump(
$xxx
)
模板文件中
{:dump(
$xxx
)}
SEO规则
在控制器中允许开发者设置页面的title,keywords和description。
如果需要SEO规则即时生效,必须清空全站缓存!否则设置无任何效果。
注意,写法需要按照SEO说明中的形式书写,因为系统对此处进行了永久性的缓存。而缓存仅针对当前页面的控制器信息,并不会根据当前页面的参数来调整。也就是说,缓存的是规则,不是实际的信息。
正确的缓存方式应该为
最常见的错误的缓存方式
详情请参考用户手册中seo设置。
SEO的优先级为:
后台SEO中设置的(应用名称,控制器,方法)三属性全的seo规则>控制器中setTitle等方式设置的规则>后台SEO中设置的三属性不全的SEO规则。
只要seo规则中,找不到三属性对应的seo规则,系统就会用程序控制器中的setTitle来设置规则。如果程序控制器中set的某个规则为空,会使用三属性不全的seo规则来填充。
左侧为三属性全的,右侧为三属性不全的
前台模块子导航响应式导航自动生成Widget
注:本文版本较老,适用于V1版本,部分适用于V2版本,建议阅读SubMenuWidget最新代码
鉴于子导航内的导航在v1的开发过程中,因为程序员对bs的理解不够深入,产生了多个不符合规范的导航,所以在v1.0.2之后的开发版中,新增了一个专门用于子导航生成的widget——SubMenuWidget,该组件最早被用于博客模块。
组件特性:
1.支持二级导航
2.支持左右两栏
3.支持小图标
4.支持选中状态
一般的导航场景只需要使用SubMenuWidget即可使用。程序员无需再写前台代码,此思想有点类似adminbuilder
组件调用方式:
Widget调用与普通组件无异
例如在博客中,只需如下调用
{:W('Common/SubMenu/render',array($sub_menu,'home','博客',''))}
参数1:菜单数据来源
参数2:当前选中项,对应数据源定义的tab,组件会自动点亮对应tab的顶级导航
参数3:当前模块名
参数5:导航栏ID,一般情况下留空即可
其他的应该都好理解的,这里重点讲一下数据源的定义
在组件中,官方定义了一个$tpl作为数据源的例子。如果不确定或者忘记定义方式,可以将此变量名改为menu_list,前台不需要传递数据源就能看到一个导航菜单的例子。
Application\Common\Widget\SubMenuWidget.class.php
$tpl = array(
'left' =>
array(
array('tab' => 'home', 'title' => '顶级菜单A', 'href' => U('blog/index/index'), 'icon' => 'home'),
array('tab' => 'category_1', 'title' => '顶级菜单B', 'href' => U('blog/article/lists', array('category' => 1))),
array('tab' => 'chuangye', 'title' => '顶级菜单C', 'href' => U('blog/article/lists', array('category' => 42)),
'children' => array(
array('tab' => 'child_1', 'title' => '子菜单1', 'href' => U('blog/index/index'), 'icon' => 'home'),
array('tab' => 'child_2', 'title' => '子菜单2', 'href' => U('blog/article/lists', array('category' => 1)))
)
)
),
'right' =>
array(
array('tab' => 'user', 'title' => '用户', 'href' => U('blog/index/index'), 'icon' => 'user',
'children' => array(
array('tab' => 'child_1', 'title' => '个人中心', 'href' => U('blog/index/index'), 'icon' => 'home'),
array('tab' => 'child_2', 'title' => '注销', 'href' => U('blog/article/lists', array('category' => 1)))
)
),
array('title' => '我的财富:20'),
array('title' => '我的订单', 'href' => U('blog/article/lists'))
)
);
如上代码所示,该代码段定义了如下一个示例导航
数据结构是由数组定义的,结构如下
+Sub_menu
+left
+顶级菜单项(tab,title,href,icon)
-二级菜单项
-right
+顶级菜单项(tab,title,href,icon)
-二级菜单项
看完之后,可以将tpl改回tpl,这样组件可以接收前台的数据源。
我们强烈建议数据源的定义放在 模块名Index的_initialize函数中。可参考Blog模块。
Application\Blog\Controller\BlogController.class.php
$sub_menu =
array(
'left' =>
array(
array('tab' => 'home', 'title' => '首页', 'href' => U('blog/index/index')),
),
);
$category = D('Category')->getTree();
$this->assign('categories', $category); //栏目
foreach ($category as $cat) {
$sub_menu['left'][] = array('tab' => 'cat_' . $cat['id'], 'title' => $cat['title'], 'href' => U('blog/article/lists', array('category' => $cat['id'])));
}
$this->assign('sub_menu', $sub_menu);
示例代码定义了一个简单的导航效果如图
官方建议在此做上缓存,因为导航在每个页面都需要调用。
点赞插件的使用
{:Hook(
'support'
,
array
(
'table'
=>
'weibo'
,
'row'
=>
[
'id'
],
'app'
=>
'Weibo'
,
'uid'
=>
[
'uid'
],’jump’=>’no’))}
需要注意的是,app一般填写调用的应用名
table一般填写有需要赞的对象所在的表
row一般填写所赞对象的id
jump一般填写no,则表示点击消息跳转的链接为来源链接,如果不填写此变量,则默认会跳转到一个约定的URL,URL生成规则如下
U($appname . '/Index/' . $table . 'Detail', array('id' => $row))
如app=Weibo table=weibo row=1
则生成 U(‘Weibo/Index/weiboDetail’,array(‘id’=>1));