在thinkcmf5中实现为各个分类下的文章添加自定义字段的想法
来源:互联网 发布:windows media play 编辑:程序博客网 时间:2024/06/11 10:30
前言
这里只是自己的一个想法。此想法只完成了里面的一部分。记于此,希望有同样需求的同学们共同讨论和学习。
我也是刚学习使用这个框架。在学习使用的过程中有这样的一个需求。我的某一个文章分类下面的文章需要添加两个字段(原价、现价),我想很多同学都有这样的需求吧。要是能向onethink那样为模型添加字段就好了。那就自己来实现吧。想一想实现步骤。
1、在分类里添加此分类下的文章需要自定义的字段;
2、在添加文章选择分类的时候查看此分类下是否有自定义的字段,有就展示出来。
我去,这么简单!!!
1 设计
还记得我们在使用thinkcmf的是候的模板设计功能么(有点启发了)。模版里的json文件就是用来控制模版的设计的。那么我们也用一个数组或对象(我们暂时把它命名为selfFields)来定义我们自定义的文章分类字段,在添加文章的时候,当我们选择了文章分类后,就通过这个分类对应的这个selfFields来生成自定义字段的html,然后再把html插入到分类的后面。好像很完美呀!
2 实现
2.1 selfFields的添加和存储
首先selfFields肯定是要在添加分分类的时候生成的。那我们就来看看分类表的结构把。
看到那个more字段了么?我是想要什么就有什么呀。那就把它放在这里吧。其结构如下:
{"thumbnail":"portal\/20171102\/6676d62fca5e4080d338b044c30aca45.jpg","self_field":{ //此分类下的文章自定义字段 "old_price":{ "title":"原价", "value":"", "type":"text", "tip":"", "rule":{ "require":true } }, "now_price":{ "title":"现价", "value":"", "type":"text", "tip":"", "rule":{ "require":true } } }}
2.1.1 前端添加
好吧,虽然有点扯。先就这样吧。
文件\thinkcmf\public\themes\admin_simpleboot3\portal\admin_category\add.html修改两处
<div class="col-md-2"> <div class="list-group"> <a class="list-group-item" href="#A" data-toggle="tab">基本属性</a> <a class="list-group-item" href="#B" data-toggle="tab">SEO设置</a> <a class="list-group-item" href="#C" data-toggle="tab">模板设置</a> <!--添加的1--> <a class="list-group-item" href="#D" data-toggle="tab">自定义字段</a> </div> </div> <!--添加的2--> <div class="tab-pane" id="D"> <div class="form-group"> <div class="form-group"> <label for="input-seo_title-1">自定义字段</label> <div> <input type="text" class="form-control" id="input-seo_title-1" name="more[self_field]"> </div> </div> </div> </div>
2.1.2后端
文件\thinkcmf\app\portal\controller\AdminCategoryController.php
public function addPost() { $portalCategoryModel = new PortalCategoryModel(); $data = $this->request->param(); //--start--添加代码--- $self_field=json_decode(htmlspecialchars_decode($data['more']['self_field']),true); if ($self_field){ $data['more']['self_field']=$self_field; }else{ unset( $data['more']['self_field']); } //----end----添加代码--- $result = $this->validate($data, 'PortalCategory'); if ($result !== true) { $this->error($result); } $result = $portalCategoryModel->addCategory($data); if ($result === false) { $this->error('添加失败!'); } $this->success('添加成功!', url('AdminCategory/index')); }
到此分类这面的工作好像就完了,当然分类修改就不多说了。
2.2 在添加文章的时候插入自定义的分类字段
我们在添加文章的时候,当选完分类的时候,通过Ajax从后端获取到生好的html字符串,然后插入到分类字段的后面。
2.2.1 前端
文件\thinkcmf\public\themes\admin_simpleboot3\portal\admin_article\add.html
function doSelectCategory() { var selectedCategoriesId = $('#js-categories-id-input').val(); openIframeLayer("{:url('AdminCategory/select')}?ids=" + selectedCategoriesId, '请选择分类', { area: ['700px', '400px'], btn: ['确定', '取消'], yes: function (index, layero) { //do something var iframeWin = window[layero.find('iframe')[0]['name']]; var selectedCategories = iframeWin.confirm(); if (selectedCategories.selectedCategoriesId.length == 0) { layer.msg('请选择分类'); return; } $('#js-categories-id-input').val(selectedCategories.selectedCategoriesId.join(',')); $('#js-categories-name-input').val(selectedCategories.selectedCategoriesName.join(' ')); //console.log(layer.getFrameIndex(index)); //只需要添加下面这一段 只需要添加下面这一段 只需要添加下面这一段 //选择分类后 就需要动态获取 需要加载的此分类的自定义的文章字段 $.post('{:url("AdminCategory/getCategorySelfFieldHtml")}', {id:selectedCategories.selectedCategoriesId.join(',')}, function (data) { $('.self-field').remove(); $('#js-categories-name-input').parent().parent().after(data); } ); //只需要添加上面这一段 只需要添加上面这一段 只需要添加上面这一段 layer.close(index); //如果设定了yes回调,需进行手工关闭 } }); }</script>
2.2.2 后端生成html
在上面我们是在AdminCategory/getCategorySelfFieldHtml中获取的html。 $.post('{:url("AdminCategory/getCategorySelfFieldHtml")}'
那我们就去后端实现它吧!!
文件\thinkcmf\app\portal\controller\AdminCategoryController.php添加方法
public function getCategorySelfFieldHtml() { $ids = $this->request->param('id'); $ids=explode(',',$ids); $portalCategoryModel = new PortalCategoryModel(); $categoryData=$portalCategoryModel->field('id,more')->find($ids[0])->toArray(); if (!empty($categoryData['more']['self_field'])){ //下面有一个类 我要去实现它 $categoryHtmleService= new \app\portal\service\CategoryHtmleService(); $categoryHtml=$categoryHtmleService->getCategorySelfFieldHtml($categoryData['more']['self_field']); return $categoryHtml; } }
添加\thinkcmf\app\portal\service\CategoryHtmleService.php
<?php// +----------------------------------------------------------------------// | jaydon// +----------------------------------------------------------------------// | Copyright// +----------------------------------------------------------------------// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )// +----------------------------------------------------------------------// | Author: Jaydon <jaydonran@163.com>// +----------------------------------------------------------------------namespace app\portal\service;class CategoryHtmleService{ public function getCategorySelfFieldHtml($self_fields){ $htmlString=''; foreach ($self_fields as $key=>$self_field){ switch ($self_field['type']){ case "text": $htmlString.=$this->parseText($self_field,$key); //这次就实现这个方法吧 下面的慢慢去实现吧 break; case "textarea": $htmlString.=$this->parseTextarea($self_field,$key); break; case "date": $htmlString.=$this->parseDate($self_field,$key); break; case "datetime": $htmlString.=$this->parseDatetime($self_field,$key); break; case "image": $htmlString.=$this->parseImage($self_field,$key); break; case "photos": $htmlString.=$this->parsePhotos($self_field,$key); break; case "number": $htmlString.=$this->parseNumber($self_field,$key); break; case "location": $htmlString.=$this->parseLocation($self_field,$key); break; case "file": $htmlString.=$this->parseFilet($self_field,$key); break; case "color": $htmlString.=$this->parseColor($self_field,$key); break; case "array": $htmlString.=$this->parseArray($self_field,$key); break; case "select": $htmlString.=$this->parseSelect($self_field,$key); break; case "slide": $htmlString.=$this->parseSlide($self_field,$key); break; } } return $htmlString; } /** * 拼接textl类型的html 注意name的拼接 name="post[more][self_fields][$key] * @param $self_field * @param $key * @return string */ public function parseText($self_field,$key){ true === $self_field['rule']['require'] ? $required='required' : $required=''; $htmlString=" <tr class='self-field'><th>".$self_field['title']."<span class=\"form-required\">*</span></th><td><input class=\"form-control\" type=\"text\" name=\"post[more][self_fields][$key]\"".$required." $required value=\"\" placeholder=\"".$self_field['tip']."\"/></td></tr>"; return $htmlString; }}
到此好像就完成了。
test
提交的数据
存入了数据库
至于文章编辑的时候,就是先把自定义的html生成,而且把value也生成在里面即可。
以上就是我的一些想法,写得不好 ,还望各位大神指点。
- 在thinkcmf5中实现为各个分类下的文章添加自定义字段的想法
- 在DTCoreText 中添加自定义的文章头,自定义View
- 使用 WordPress 自定义字段功能为文章添加下载按钮
- dedecms自定义字段的添加及如何实现在栏目页首页的调用
- EXTJS 实现TabPanel 并在各个Tab页中添加js写的panel
- 在drupal7中动态的为某个内容类型添加字段
- 添加jira的自定义字段
- 在CGI中实现session的想法和实现
- 在CGI中实现session的想法和实现
- dedecms的文章和栏目的自定义字段的添加、调用以及完全删除方法
- composer中各个字段的说明
- 文章和栏目的自定义字段的添加、调用以及完全
- mysql 中为表的字段添加唯一性约
- sql中为表添加一个含有括号的字段
- 实现在文章后面添加目录分类和时间
- java 中关于自定义信号在linux下的实现
- 在NSToolbar中添加自定义的toolbaritem
- 在ListWidget中添加自定义的Item
- DNS解析过程
- 遍历表单的 elements 集合来访问 Input 对象。(DOM elements 集合)
- 对 java 同步锁 以及 级别升级的 理解
- sublime注册码分享
- HM编码器代码阅读
- 在thinkcmf5中实现为各个分类下的文章添加自定义字段的想法
- 翻页折叠的那些事儿
- 修改eclipse字体大小
- Hadoop datanode磁盘扩容
- java使用Jsoup连接网站超时的解决方法 链接的时候设定超时时间即可。 doc = Jsoup.connect(url).timeout(5000).get();
- 数据库 E-R 图使用理解
- Java多线程中Runnable和Thread的区别
- 【机器学习】EM算法推导
- STM32