thinkcmf5 模板版变量的加载过程 和 新增网站配置项怎么全局使用
1、模板全局配置是怎么加载的
在 HomeBaseController.php 的 fech方法
$more = $this->getThemeFileMore($template);
用
echo ThemeModel::getLastSql(); 输出sql语句 :SELECT `more` FROM `cmf_theme_file` WHERE `theme` = 'w0s' AND ( `is_public` = 1 OR `file` = 'portal/index' ) 获取了声明公共配置和当前模板文件的模板配置。 可见,不管当前theme下那个模板文件配置,只要is_public=1,就可以加载vars 和 widgets 。 全局配置里的变量和控件就是这样加载的。。。。。 getThemeFileMore函数源码:
/**
* 获取模板文件变量
* @param string $file
* @param string $theme
* @return array
*/
private function getThemeFileMore($file, $theme = "")
{ //TODO 增加缓存
$theme = empty($theme) ? cmf_get_current_theme() : $theme; // 调试模式下自动更新模板
if (APP_DEBUG) {
$themeModel = new ThemeModel();
$themeModel->updateTheme($theme);
} $themePath = config('cmf_theme_path');
$file = str_replace('\\', '/', $file);
$file = str_replace('//', '/', $file);
$file = str_replace(['.html', '.php', $themePath . $theme . "/"], '', $file); $files = Db::name('theme_file')->field('more')->where(['theme' => $theme])->where(function ($query) use ($file) {
$query->where(['is_public' => 1])->whereOr(['file' => $file]);
})->select();
echo ThemeModel::getLastSql();
$vars = [];
$widgets = [];
foreach ($files as $file) {
$oldMore = json_decode($file['more'], true);
if (!empty($oldMore['vars'])) {
foreach ($oldMore['vars'] as $varName => $var) {
$vars[$varName] = $var['value'];
}
} if (!empty($oldMore['widgets'])) {
foreach ($oldMore['widgets'] as $widgetName => $widget) { $widgetVars = [];
if (!empty($widget['vars'])) {
foreach ($widget['vars'] as $varName => $var) {
$widgetVars[$varName] = $var['value'];
}
} $widget['vars'] = $widgetVars;
$widgets[$widgetName] = $widget;
}
}
} return ['vars' => $vars, 'widgets' => $widgets];
}
2、新增网站配置项怎么全局使用
目前cmf5的后台配置并没有网站设置里并没有包含:公司名称,地址,电话,手机,在线客服等公司信息,两种方式可以实现这些配置项:
一是在声明了is_public=1的模板里增加模板变量(例如:config.json,head模板,foot模板)。 优点:无需修改源程序,升级不用担心覆盖,缺点:这些信息属于网站信息,应该独立于模板之外,否则换模板的话还需要重新设置。
二是在后台网站设置里增加新的配置项目。无须担心换模板,需要修改控制器基类,升级就会被覆盖,每次升级都需要修改一下。
这里使用第二种方法
app\admin\controller 新增ComSettingController.php
namespace app\admin\controller; use cmf\controller\AdminBaseController;
use think\Validate; class ComSettingController extends AdminBaseController
{ /**
* 公司信息配置
* @adminMenu(
* 'name' => '公司信息配置',
* 'parent' => 'admin/Setting/default',
* 'display'=> true,
* 'hasView'=> true,
* 'order' => 10,
* 'icon' => '',
* 'remark' => '公司信息配置',
* 'param' => ''
* )
*/
public function index()
{
$comSetting = cmf_get_option('com_setting');
$this->assign($comSetting);
return $this->fetch();
} /**
* 公司信息配置
* @adminMenu(
* 'name' => '公司信息配置提交保存',
* 'parent' => 'index',
* 'display'=> false,
* 'hasView'=> false,
* 'order' => 10000,
* 'icon' => '',
* 'remark' => '公司信息配置提交保存',
* 'param' => ''
* )
*/
public function indexPost()
{
$post = array_map('trim', $this->request->param()); //这里判断数据有效 cmf_set_option('com_setting', $post); $this->success("保存成功!");
} }
后台菜单增加对应菜单

这样就新增了 com_setting配置项
怎么使用???
(1)在对应controller里增加 例如:indexController,只能在当前模板使用
$comSetting = cmf_get_option('com_setting');
$this->assign(‘com_info’.$comSetting);
这样就可以在模板index.html 使用 com_info.company 来显示公司名称
(2)要想全局使用,需要加到controller的基类 HomeBaseController里,在simplewind\cmf\controller目录下
public function _initialize()
{
// 监听home_init
hook('home_init');
parent::_initialize();
$siteInfo = cmf_get_site_info();
View::share('site_info', $siteInfo);
$comSetting = cmf_get_option('com_setting');
View::share('com_info', $comSetting);
}
这样就可以在任何模板里使用 com_info.company
thinkcmf5 模板版变量的加载过程 和 新增网站配置项怎么全局使用的更多相关文章
- linux内核启动以及文件系统的加载过程
Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令,就进入 Linux 内核启动阶段.普通 Linux 内核的启动过程也可以分为两个阶段.本文以项目中使用的 lin ...
- insmod模块加载过程代码分析1【转】
转自:http://blog.chinaunix.net/uid-27717694-id-3966290.html 一.概述模块是作为ELF对象文件存放在文件系统中的,并通过执行insmod程序链接到 ...
- JVM之类加载器、加载过程及双亲委派机制
JVM 的生命周期 虚拟机的启动 Java 虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实 ...
- <JVM中篇:字节码与类的加载篇>03-类的加载过程(类的生命周期)详解
笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...
- Inside Flask - flask 扩展加载过程
Inside Flask - flask 扩展加载过程 flask 扩展(插件)通常是以 flask_<扩展名字> 为扩展的 python 包名,而使用时,可用 import flask. ...
- JVM——类的加载过程
附一张图方便理解,一个类的执行过程 类的加载过程,简明的来说 类装饰器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: 装载:查 ...
- Java 类的加载过程(阿里面试题)
问以下程序打印出什么内容: 问题及解析如下: /** * 加载方法不等于执行方法,初始化变量则会赋值 * 类加载顺序应为 加载静态方法-初始化静态变量-执行静态代码块 * 实例化时 先加载非静态方法- ...
- (转)JVM类生命周期概述:加载时机与加载过程
原文地址: http://blog.csdn.net/justloveyou_/article/details/72466105 JVM类加载机制主要包括两个问题:类加载的时机与步骤 和 类加载的方式 ...
- java中类的加载过程和对象的创建过程
1.类加载过程 首先,jvm在执行时,遇到一个新的类,会先去内存的方法区中去寻找该类的.class文件,如果找到了就直接运行,如果没有找到,则会去硬盘中去寻找该类的.class文件,并将该类文件加载到 ...
随机推荐
- compass初探
1.安装compass: sudo gem install compass 如果你用的是Windows系统,那么要省略前面的sudo. 2.项目初始化 接下来,(首先要进入目标目录.)要创建一个你的C ...
- hdu4570-区间dp
这道题的题意不是一般的难懂啊,各种查字典都没理解,还是没忍住去看了别人的博客,没想到题很简单,1-n内划分若干个区间,使的每个区间和最小,每个区间的区间和是:区间开头的数*2^区间长度. 区间dp # ...
- Jmeter4.0----响应断言(6)
1.说明 一个HTTP请求发出去,怎么判断执行的任务是否成功呢?通过检查服务器响应数据,是否返回预期想要的数据,如果是,判断任务成功,反之任务失败. 作用:判断请求是否成功 2.步骤 第一步:添加 “ ...
- 044 Wildcard Matching 通配符匹配
实现一个支持 '?' 和 '*' 的通配符匹配.'?' 匹配任何单个字符.'*' 匹配任何数量的字符 (包括0个).匹配应覆盖 整个 输入字符串(而不是部分).这个函数原型为:bool isMatch ...
- 程序运行过程中遇到“ORA-03114: not connected to ORACLE”的问题解决
c#,winform程序,数据批量入oracle库时用到DataAdaper的.FillSchema函数,如:da.FillSchema(dt2, SchemaType.Mapped); 程序运行一段 ...
- 牛客网Java刷题知识点之为什么static成员方法不能是抽象方法,其必须实现
不多说,直接上干货! static修饰的方法我们称之为静态方法,我们通过类名对其进行直接调用.由于它在类加载的时候就存在了,它不依赖于任何实例,所以static方法必须实现,也就是说它不能是抽象方法.
- Java基础:(四)继承
一.访问权限 java中有三个访问权限修饰符private:protected:public和一个默认default(不加修饰符). 如果子类的方法覆盖了父类的方法,那么子类中该方法的访问级别不允许低 ...
- linux-2.6.22.6/Makefile:416: *** mixed implicit and normal rules: deprecated syntax
今天在按照韦东山大哥的教程流程编译内核的时候出现了这个问题 linux-2.6.22.6/Makefile:416: *** mixed implicit and normal rules: ...
- Android方法数methods超过65536
当Android App中的方法数超过65535时,如果往下兼容到低版本设备时,就会报编译错误: Cannot fit requested classes in a single dex file. ...
- Layer:如何调用layer.open打开的的iframe窗口中的JS?
layer.open({type: 2,content: 'test/iframe.html',success: function(layero, index){ var body = layer.g ...