多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 知识点 1、编程思路 2、工作准备 3、菜单改写 4、首页最新文章 5、热门文章 6、本站置顶 7、修改文章列表页 8、操作动态调用模型模板 [TOC] ## 一、编程思路 一个CMS,有多个模型,如文章、图片、视频等,模型是后台添加的 如果要设置自定义标签,按之前操作,就会新建多个文件,如Article.php、Photo.php、Video.php等 这样很麻烦,中间还要修改字段、数据表等等信息,不便于拓展 所以,我们只新建一个taglib文件,如Def.php 其中的数据表、字段、数量等信息,以变量形式出现 公共标签,获取不同模型的数据 这样,自定义标签,就不会受不同模型、不同数据表、不同字段等因素影响 便于拓展,使用也方面,文件也简单 ## 二、工作准备 ### 1、复制Article.php 位置:\application\index\taglib\Article.php 改名:Def.php 修改相应代码 ### 2、修改配置文件 修改标签预加载 位置:\application\config.php 代码: ~~~ 'template' => [ 'taglib_pre_load' => 'app\index\taglib\Article', ], 改成 'template' => [ 'taglib_pre_load' => 'app\index\taglib\Def', ], ~~~ ## 三、菜单改写 所有页面都要调用分类菜单,所以修改比较简单,只需修改模板中调用方式 标签定义、标签申明都不用修改 ~~~ <ul class="down-menu nav-menu"> <li class="current-menu-item"><a rel="nofollow" href="/"><i class="fa fa-home"></i> 首页</a></li> {def:menu name="vo"} <li> <a href="javascript:(0)"> {$vo.catname}</a> <ul class="sub-menu"> {volist name="vo.son" id="voson"} <li><a href="{:url('category',['id'=>$voson.id])}"> {$voson.catname}</a></li> {/volist} </ul> </li> {/def:menu} </ul> ~~~ ## 四、首页最新文章 ### (一)标签定义 增加两个属性table(数据表)、field(表字段),方便多模型调用 ~~~ protected $tags = [ 'menu' => ['attr' => 'name', 'close' => 1], //0闭合标签 ,1不闭合(默认) 'hot' => ['attr' => 'catid,num,name,table,field', 'close' => 1], 'recommend' => ['attr' => 'catid,num,name,table,field', 'close' => 1], 'list' => ['attr' => 'catid,num,name,table,field', 'close' => 1], 'page' => ['attr' => 'catid', 'close' => 1], //实际不使用,仅供教学参考 ]; ~~~ ### (二)标签申明 ~~~ public function tagList($tag, $content) { $table = $tag['table']; $field = $tag['field']; //首页cid=0,num>0 ; 分类页cid>0,num=0 if(empty($tag['catid']) || $tag['catid']=='0'){ $num = $tag['num']; $php = <<<php <?php \$list = think\Db::name('$table')->field('$field')->limit("$num")->order('listorder desc')->cache('$table_index',config('cache.expire'))->select(); \$__LIST__ = \$list; ?> php; }else{ $num = 0; $where = "catid=" . $tag['catid']; $php = <<<php <?php \$list = think\Db::name('$table')->where("$where")->field('$field')->limit("$num")->order('listorder desc')->paginate(); \$__LIST__ = \$list; ?> php; } $name = $tag['name']; $parse = $php; $parse .= '{volist name="__LIST__" id="' . $name . '"}'; $parse .= $content; $parse .= '{/volist}'; return $parse; } ~~~ ### (三)标签调用 ~~~ {def:list name="vo" catid="0" num="2" table="article" field="id,catid,title,thumb,description,inputtime,views"} <article class="post type-post status-publish format-standard hentry"> <figure class="thumbnail"> <a href="{:url('info',['id'=>$vo.id])}"> <img src="__UPLOADS__/{$vo.thumb}" alt="{$vo.title}"></a> <span class="cat"> <a href="{:url('category',['id'=>$vo.catid])}">{$vo.catid|getCatInfoById=catname}</a></span> </figure> <header class="entry-header"> <h2 class="entry-title"><a href="{:url('info',['id'=>$vo.id])}" rel="bookmark">{$vo.title}</a></h2> </header> <div class="entry-content"> <div class="archive-content">{$vo.description}</div> <br/> <span class="title-l"></span> <span class="entry-meta"> <span class="date">{$vo.inputtime}&nbsp;</span> <span class="views"> 阅读 {$vo.views}&nbsp;</span> <span class="comment"><a href="{:url('info',['id'=>$vo.id])}"> <i class="fa fa-comment-o"></i> 查看评论</a></span> </span> <div class="clear"></div> </div> <span class="entry-more"> <a href="{:url('info',['id'=>$vo.id])}" rel="bookmark">阅读全文</a></span> </article> {/def:list} ~~~ ## 五、热门文章 ### (一)标签定义 增加两个属性table(数据表)、field(表字段),方便多模型调用 ~~~ protected $tags = [ 'menu' => ['attr' => 'name', 'close' => 1], //0闭合标签 ,1不闭合(默认) 'hot' => ['attr' => 'catid,num,name,table,field', 'close' => 1], 'recommend' => ['attr' => 'catid,num,name,table,field', 'close' => 1], 'list' => ['attr' => 'catid,num,name,table,field', 'close' => 1], 'page' => ['attr' => 'catid', 'close' => 1], //实际不使用,仅供教学参考 ]; ~~~ ### (二)标签申明 ~~~ public function tagHot($tag, $content) { $table = $tag['table']; $field = $tag['field']; //可为空,则查询所有字段 if(empty($tag['catid']) || $tag['catid']=='0'){ $where = ''; }else{ $where = "catid=" . $tag['catid']; } if(empty($tag['num']) || $tag['num']=='0'){ $num = 8; }else{ $num = $tag['num']; } $cache = 'hot_' . $tag['catid']; $php = <<<php <?php \$hot = think\Db::name('$table')->where("$where")->field('$field')->limit('$num')->order('views desc')->cache("$cache",config('cache.expire'))->select(); \$__LIST__ = \$hot; ?> php; $name = $tag['name']; $parse = $php; $parse .= '{volist name="__LIST__" id="' . $name . '"}'; $parse .= $content; $parse .= '{/volist}'; return $parse; } ~~~ ### (三)标签调用 ~~~ <aside class="widget widget_hot_post"> <h3 class="widget-title"><i class="fa-bars fa"></i>热门文章</h3> <div id="hot_post_widget"> <ul> {def:hot name="vo" catid="0" num="8" table="article" field="id,title"} <li><span class="li-icon li-icon-{$key+1}">{$key+1}</span><a href="{:url('info',['id'=>$vo.id])}">{$vo.title}</a></li> {/def:hot} </ul> </div> </aside> ~~~ ## 六、本站置顶 ### (一)标签定义 增加两个属性table(数据表)、field(表字段),方便多模型调用 ~~~ protected $tags = [ 'menu' => ['attr' => 'name', 'close' => 1], //0闭合标签 ,1不闭合(默认) 'hot' => ['attr' => 'catid,num,name,table,field', 'close' => 1], 'recommend' => ['attr' => 'catid,num,name,table,field', 'close' => 1], 'list' => ['attr' => 'catid,num,name,table,field', 'close' => 1], 'page' => ['attr' => 'catid', 'close' => 1], //实际不使用,仅供教学参考 ]; ~~~ ### (二)标签申明 ~~~ public function tagRecommend($tag, $content) { $table = $tag['table']; $field = $tag['field']; if(empty($tag['catid']) || $tag['catid']=='0'){ $where = 'recommend=1'; }else{ $where = "recommend=1 and catid=" . $tag['catid']; } if(empty($tag['num']) || $tag['num']=='0'){ $num = 3; }else{ $num = $tag['num']; } $cache = 'recommend_' . $tag['catid']; $php = <<<php <?php \$recommend = think\Db::name('$table')->where("$where")->field('$field')->limit('$num')->order('listorder desc')->cache("$cache",config('cache.expire'))->select(); \$__LIST__ = \$recommend; ?> php; $name = $tag['name']; $parse = $php; $parse .= '{volist name="__LIST__" id="' . $name . '"}'; $parse .= $content; $parse .= '{/volist}'; return $parse; } ~~~ ### (三)标签调用 ~~~ {block name="sidebar"} <aside class="widget widget_hot_commend"> <h3 class="widget-title"><i class="fa-bars fa"></i>本站推荐</h3> <div id="hot" class="hot_commend"> <ul> {def:recommend name="vo" catid="0" num="3" table="article" field="id,title,thumb,views"} <li> <figure class="thumbnail"><a href="{:url('info',['id'=>$vo.id])}"><img src="__UPLOADS__/{$vo.thumb}" alt="{$vo.title}"></a></figure> <div class="hot-title"><a href="{:url('info',['id'=>$vo.id])}">{$vo.title}</a></div> <div class="views">阅读 {$vo.views}</div> <i class="fa-thumbs-o-up fa"> 0</i> </li> {/def:recommend} </ul> <div class="clear"></div> </div> </aside> ~~~ ## 六、本站置顶 ### (一)标签定义 增加两个属性table(数据表)、field(表字段),方便多模型调用 ~~~ protected $tags = [ 'menu' => ['attr' => 'name', 'close' => 1], //0闭合标签 ,1不闭合(默认) 'hot' => ['attr' => 'catid,num,name,table,field', 'close' => 1], 'recommend' => ['attr' => 'catid,num,name,table,field', 'close' => 1], 'list' => ['attr' => 'catid,num,name,table,field', 'close' => 1], 'page' => ['attr' => 'catid', 'close' => 1], //实际不使用,仅供教学参考 ]; ~~~ ### (二)标签申明 ~~~ public function tagRecommend($tag, $content) { $table = $tag['table']; $field = $tag['field']; if(empty($tag['catid']) || $tag['catid']=='0'){ $where = 'recommend=1'; }else{ $where = "recommend=1 and catid=" . $tag['catid']; } if(empty($tag['num']) || $tag['num']=='0'){ $num = 3; }else{ $num = $tag['num']; } $cache = 'recommend_' . $tag['catid']; $php = <<<php <?php \$recommend = think\Db::name('$table')->where("$where")->field('$field')->limit('$num')->order('listorder desc')->cache("$cache",config('cache.expire'))->select(); \$__LIST__ = \$recommend; ?> php; $name = $tag['name']; $parse = $php; $parse .= '{volist name="__LIST__" id="' . $name . '"}'; $parse .= $content; $parse .= '{/volist}'; return $parse; } ~~~ ### (三)标签调用 ~~~ <aside class="widget widget_hot_commend"> <h3 class="widget-title"><i class="fa-bars fa"></i>本站推荐</h3> <div id="hot" class="hot_commend"> <ul> {def:recommend name="vo" catid="0" num="3" table="article" field="id,title,thumb,views"} <li> <figure class="thumbnail"><a href="{:url('info',['id'=>$vo.id])}"><img src="__UPLOADS__/{$vo.thumb}" alt="{$vo.title}"></a></figure> <div class="hot-title"><a href="{:url('info',['id'=>$vo.id])}">{$vo.title}</a></div> <div class="views">阅读 {$vo.views}</div> <i class="fa-thumbs-o-up fa"> 0</i> </li> {/def:recommend} </ul> <div class="clear"></div> </div> </aside> ~~~ ## 七、修改文章列表页 主要修改模板代码 ~~~ {block name="main"} {def:list name="vo" catid="$id" num="0" table="article" field="id,catid,title,thumb,description,inputtime,views"} <article class="post type-post status-publish format-standard hentry"> <figure class="thumbnail"> <a href="{:url('info',['id'=>$vo.id])}"> <img src="__UPLOADS__/{$vo.thumb}" alt="{$vo.title}"></a> <span class="cat"> <a href="{:url('category',['id'=>$vo.catid])}">{$vo.catid|getCatInfoById=catname}</a></span> </figure> <header class="entry-header"> <h2 class="entry-title"><a href="{:url('info',['id'=>$vo.id])}" rel="bookmark">{$vo.title}</a></h2> </header> <div class="entry-content"> <div class="archive-content">{$vo.description}</div> <br/> <span class="title-l"></span> <span class="entry-meta"> <span class="date">{$vo.inputtime}&nbsp;</span> <span class="views"> 阅读 {$vo.views}&nbsp;</span> <span class="comment"><a href="{:url('info',['id'=>$vo.id])}"> <i class="fa fa-comment-o"></i> 查看评论</a></span> </span> <div class="clear"></div> </div> <span class="entry-more"> <a href="{:url('info',['id'=>$vo.id])}" rel="bookmark">阅读全文</a></span> </article> <div class="layui-box layui-laypage layui-laypage-molv" style="float:right;"> {$__LIST__->render()} </div> {/def:list} {/block} ~~~ ## 八、操作动态调用模型模板 思路:不同模型的文章,调用不同的模板,如:文章就调用文章模型的模板、图片就调用图片模型的模板、视频就调用视频模型的模板 实现:链接处传参,两个,一个是文章ID、一个是分类ID,根据catid查询模型,然后根据模型调用对应的模板 ### 1、添加链接 传参2个:一个是文章ID、一个是分类ID 文章ID:用于查询具体信息 分类ID:用于查询模型,调用对应的模板 ~~~ <a href="{:url('info',['id'=>$vo.id,'catid'=>$vo.catid])}" rel="bookmark">{$vo.title}</a> ~~~ ### 2、修改操作 列表页操作 ~~~ public function category(){ $id = input('id'); //分类ID $this->assign('id',$id); $template = getModInfoById($id,'category_template'); return view('../application/index/view/default/index/' . $template); } ~~~ 内容页操作 ~~~ public function info(){ $id = input('id',0);//ID $catid = input('catid',0);//分类ID $modelInfo = getModInfoById($catid); $info = Db::name($modelInfo['tablename'])->where('id',$id)->find(); $catinfo = getCatInfoById($catid); $p_catname = getCatInfoById($catinfo['parentid'],'catname'); $this->assign('info',$info); $this->assign('catid',$catid); $this->assign('catname',$catinfo['catname']); $this->assign('p_catname',$p_catname); return view('../application/index/view/default/index/' . $modelInfo['show_template']); } ~~~