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 模板版变量的加载过程 和 新增网站配置项怎么全局使用的更多相关文章

  1. linux内核启动以及文件系统的加载过程

    Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令,就进入 Linux 内核启动阶段.普通 Linux 内核的启动过程也可以分为两个阶段.本文以项目中使用的 lin ...

  2. insmod模块加载过程代码分析1【转】

    转自:http://blog.chinaunix.net/uid-27717694-id-3966290.html 一.概述模块是作为ELF对象文件存放在文件系统中的,并通过执行insmod程序链接到 ...

  3. JVM之类加载器、加载过程及双亲委派机制

    JVM 的生命周期 虚拟机的启动 Java 虚拟机的启动是通过引导类加载器(bootstrap class loader)创建一个初始类(initial class)来完成的,这个类是由虚拟机的具体实 ...

  4. <JVM中篇:字节码与类的加载篇>03-类的加载过程(类的生命周期)详解

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  5. Inside Flask - flask 扩展加载过程

    Inside Flask - flask 扩展加载过程 flask 扩展(插件)通常是以 flask_<扩展名字> 为扩展的 python 包名,而使用时,可用 import flask. ...

  6. JVM——类的加载过程

    附一张图方便理解,一个类的执行过程 类的加载过程,简明的来说 类装饰器就是寻找类的字节码文件并构造出类在JVM内部表示的对象组件.在Java中,类装载器把一个类装入JVM中,要经过以下步骤: 装载:查 ...

  7. Java 类的加载过程(阿里面试题)

    问以下程序打印出什么内容: 问题及解析如下: /** * 加载方法不等于执行方法,初始化变量则会赋值 * 类加载顺序应为 加载静态方法-初始化静态变量-执行静态代码块 * 实例化时 先加载非静态方法- ...

  8. (转)JVM类生命周期概述:加载时机与加载过程

    原文地址: http://blog.csdn.net/justloveyou_/article/details/72466105 JVM类加载机制主要包括两个问题:类加载的时机与步骤 和 类加载的方式 ...

  9. java中类的加载过程和对象的创建过程

    1.类加载过程 首先,jvm在执行时,遇到一个新的类,会先去内存的方法区中去寻找该类的.class文件,如果找到了就直接运行,如果没有找到,则会去硬盘中去寻找该类的.class文件,并将该类文件加载到 ...

随机推荐

  1. JQuery序列化表单serialize() 以及 serializeArray()

    都是利用form表单传递数据的 1.serialize()方法 描述:序列化表单内容为字符串,用于Ajax请求. 数据类似于这种: FirstName=Bill&LastName=Gates  ...

  2. CDH5.7.2离线部署笔记

    1.部署基本信息说明: 1.1.主机信息 操作系统:选择CentOS6.7 x86-64版本 MEM:64GB,CPU: E5-2630 v3 @ 2.40GHz, DISK:2TB*4(数据节点存储 ...

  3. MapReduce基本流程与设计思想初步

    1.MapReduce是什么? MapReduce是一种编程模型,用于大规模数据集的并行运算.它借用了函数式的编程概念,是Google发明的一种数据处理模型. 主要思想为:Map(映射)和Reduce ...

  4. Windows下用cpu模式跑通目标检测py-faster-rcnn 的demo.py

    关键字:Windows.cpu模式.Python.faster-rcnn.demo.py 声明:原文发表在博客园,未经允许不得转载!!!本篇blog过程已经多名读者实践验证,有人反馈报错TypeErr ...

  5. MongoDB 最初级步骤

    对库TEST下的LOG聚集集合中的inserttim字段加索引 步骤(注意:前四步步骤不能错,错了不行): 一,打开F:\mongodb\bin\mongo.exe,也可以用cmd命令指到这个exe执 ...

  6. Git操作(及操作github)

    一.git操作: 1.创建一个项目: 2.打开项目,在项目目录下右键单击--打开 git bash: 3.初始化项目仓库  创建项目仓库 命令:   git init ; git status 查看文 ...

  7. vue2.0:(七)、vue-resource

    本篇文章开始前,先介绍下什么是vue-resource,并且现在还有一个axios. Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的DOM选择器,就没有必 ...

  8. specrate 与specspeed 的区别

    What is the difference between a "rate" and a "speed" metric?There are several d ...

  9. 安卓中Paint类和Canvas类的方法汇总

    Paint类的常用的方法 1.setColor方法,用于设置画笔的颜色,public void setColor(int color)//参数color为颜色值,也可以使用Color类定义的颜色Col ...

  10. 小目标 | Power BI新人快速上手手册

    · 适用人群:数据分析专业人士,在数据分析方向需求发展人士 · 应用场景:数据汇报.数据可视化展现.数据建模分析 · 掌握难度:★★★★☆ 本期讲师 『PowerPivot工坊』公众号提供Power ...