1. 程式人生 > >在thinkcmf5中實現為各個分類下的文章新增自定義欄位的想法

在thinkcmf5中實現為各個分類下的文章新增自定義欄位的想法

前言

這裡只是自己的一個想法。此想法只完成了裡面的一部分。記於此,希望有同樣需求的同學們共同討論和學習。

我也是剛學習使用這個框架。在學習使用的過程中有這樣的一個需求。我的某一個文章分類下面的文章需要新增兩個欄位(原價、現價),我想很多同學都有這樣的需求吧。要是能向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 <[email protected]>
// +----------------------------------------------------------------------
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實現各個分類文章新增定義想法

前言 這裡只是自己的一個想法。此想法只完成了裡面的一部分。記於此,希望有同樣需求的同學們共同討論和學習。 我也是剛學習使用這個框架。在學習使用的過程中有這樣的一個需求。我的某一個文章分類下面的文章需要新增兩個欄位(原價、現價),我想很多同學都有這樣的需求吧。

關於wordpress在文章編輯頁面新增定義的方法

關於wordpress在文章編輯頁面新增額外的欄位表單等,比如新增“本文來源於:11111”等在文章上面或下面的內容。 本文專門記錄了本人歷經艱難險阻最終撥開雲霧找到一個簡單方法的過程。 首先,我是新手,很多不懂。剛開始我就百度類似“wordpress文章編輯頁面新增欄位

vue $emit子元件傳出多個引數,如何在父元件在接收所有引數的同時新增定義引數

前言 很多時候用$emit攜帶引數傳出事件,並且又需要在父元件中使用自定義引數時,這時我們就無法接受到子元件傳出的引數了。找到了兩種方法可以同時新增自定義引數的方法。 方法一 子元件傳出單個引數時: // 子元件 this.$emit('test',this.param) // 父元件 @test=

織夢dede:arclist按照定義的條件呼叫相關文章

dedecms織夢dede:arclist按照自定義欄位的條件呼叫相關文章,這對於想要在首頁呼叫某個自定義欄位的文章的同學來講,非常不錯 開啟 /include/taglib/arclist.lib.php 找到 //關鍵字條件 在它的上面加入 //自定義欄位關鍵字條件 if($ctag->G

spring data jpa 查詢定義,轉換定義實體

目標:查詢資料庫中的欄位,然後轉換成 JSON 格式的資料,返回前臺。 環境:idea 2016.3.4, jdk 1.8, mysql 5.6, spring-boot 1.5.2 背景:首先建立 entity 對映資料庫(非專業 java 不知道這怎麼說) @Entity @Tab

微信小程式定義實現選項的動態新增和刪除

問題描述: 在自定義選項中,點選新增選項按鈕,會出現一個選項的輸入框,輸入的選項可以通過點選左側的減號刪除 效果如圖: 解決過程: 1.首先寫出大體的框架。在pages下,建立了一個selfdefine的資料夾,在wxml中寫出靜態結構 selfdefine.wxml 說明

dede文章增加HTML定義字元被過濾問題

  在dedecms後臺頻道模型增加自定義欄位,一般HTML文字編輯器能解決使用者編輯問題,當然還包括純單行或多行文字編輯。但發現dedecms會自動過濾掉某些敏感的字元,比如style樣式,百度地圖js呼叫問題。下面主要圍繞著兩個問題分享一下新聞發言人開放時候的一些經驗。

destoon-定義新增到供應列表模糊搜尋

/module/sell/sell.class.php $keyword = $item['title'].','.$TYPE[$item['typeid']].','.strip_tags(cat_pos(get_cat($item['catid']), ','));

Django 模型定義型別Field

來一個簡單的例子吧。1. 減少文字的長度,儲存資料的時候壓縮,讀取的時候解壓縮,如果發現壓縮後更長,就用原文字直接儲存:Django 1.7 以下1234567891011121314151617181920212223242526272829303132from djang

讓DEDE內容模型定義在搜尋結果顯示的辦法

function Search_addfields($id,$result){ global $dsql; $row4 = $dsql->GetOne("SELECT * FROM `#@__addonshop22` where aid='$id'"); //#@__addonshop22是你內

用Hibernate實現領域物件的定義

在開發企業級業務應用(企業規模)時,客戶往往要求在不修改系統原始碼的情況下對應用物件模型的擴充套件性提供支援。利用可擴充套件域模型可以實現新功能的開發,而不需要額外的精力和成本 應用的使用週期將被延長; 外部因素改變時,系統工作流也可以隨之被修改;已經被部署的應用可以被“設

DEDECMS定義附件型別呼叫連結地址的方法

DEDECMS自定義欄位為附件時呼叫不帶樣式修改方法 當我們在系統模型中添加了一個自定義附件型別欄位的時候,例如我在後臺新增一個名為"fujian"的附件型別的欄位,欄位的實際內容為:'/uploads/soft/100602/1-100602212355.jpg' 倘若前

在tp資料去重並獲取定義

在專案中用到了TP的去重功能,將其中的坑和一些收穫記錄下來 用文件中提供的distinct方法去重只能獲取資料中能獲取field中的欄位資料,程式碼如下 //會員模型 $member_mod

liferay定義及部分路由說明

在liferay站點->站點設定->自定義欄位,中,對於這個儲存,首先,我們可以檢視form提交的action, form中acion連線為:http://localhost:8082/group/control_panel/manage? p_auth=he

jQuery easyui dataGrid 動態改變排序名,一般情況,在使用的時候,我們會點選相應進行排序,這裡以JAVA例,後端的實體類有可能和資料庫的不一致; 如:實體類

jQuery easyui dataGrid 動態改變排序欄位名,一般情況下,在使用的時候,我們會點選相應欄位進行排序,這裡以JAVA為例,後端的實體類欄位有可能和資料庫的欄位不一致; 如:實體類中的屬性為userName,前臺filed="userName"而資料庫的欄位

關於在正則表示式實現空或滿足一定規則的寫法

  實現驗證電話:(^(0[0-9]{2,3}\-)?([2-9][0-9]{6,7})+(\-[0-9]{1,4})?$)|(^((\(\d{3}\))|(\d{3}\-))?(1[358]\d{9})$)  可以為空,但當不為空時必須要電話的格式: (^(0[0-9]

mybatis -- HashMap 用法/例項:查詢文章分類文章的數目

有兩張表,一張是文章分類表category,兩個欄位(id 分類編號,title 分類名稱);                   一張是文章表article,三個欄位(id 文章編號,name 文章標題 ,content 文章內容,categoryid 所屬文章分類) 需

Android系統用js定義gesture事件(仿ios實現移動端事件一致)

initial path acc mtab uil 查看 sans fault default 一、手勢事件 下面二維碼是一個實例dome,可掃碼直接查看: 在ios系統中,系統自帶了gesture事件,兩個手指操作的時候,就會產生一下三種手勢

dede織夢繫統後臺的文章定義模型的資料庫內容到匯出excel檔案,解決亂碼。

dede織夢繫統後臺的文章或自定義模型中的資料庫內容到匯出excel檔案,解決亂碼。好品牌小編下面分享的開發過程。   1、在後臺目錄建立一個php檔案toexcel.php,在最上面加入程式碼: require_once(dirname(__FILE__).'/confi

sublime實現Ctrl+滑鼠左鍵跳轉到定義函式的地方

在寫看一份Python程式碼的時候,可以使用notepad++,或者spyder,或者pycharm  但是這都有一定的不方便,notepad++能夠識別Python程式碼,但是不能支援Ctrl+滑鼠左鍵跳轉到函式定義的地方,而且當函式是在另一個py檔案中定義的時候,notepad++