Rumah pembangunan bahagian belakang tutorial php 分享一个功能强大的yii框架的分类树扩展

分享一个功能强大的yii框架的分类树扩展

Jul 25, 2016 am 08:48 AM

  • 复制代码
    1. /*
    2. * To change this template, choose Tools | Templates
    3. * and open the template in the editor.
    4. */
    5. /**
    6. * Description of Tree
    7. *
    8. * @author 汪嘉诚
    9. * @email 819434425@qq.com
    10. *
    11. * 传递的数组格式,关联数组就可以
    12. * * array
    13. (
    14. 0 => array
    15. (
    16. 'id' => '7'
    17. 'zone' => '服装'
    18. 'name' => '服装'
    19. 'ename' => 'nanzhuang'
    20. 'first' => 'l'
    21. 'sort_order' => '8'
    22. 'level' => '1'
    23. 'pid' => '6'
    24. 'created' => '0'
    25. )
    26. )
    27. *
    28. * 表格方式调用
    29. widget('ext.tree.widgets.TreeWidget',array(
    30. 'dataProvider' => $dataProvider, // 传递数据
    31. 'pid' => 'pid', // 设置父ID
    32. 'tableClass' => 'items table table-striped table-bordered table-condensed', // 表格样式
    33. 'formatParam' => 'name', // 设置格式化字段
    34. 'formatTime' => array( // 设置格式化的时间参数
    35. 'created'
    36. ),
    37. 'action' => array(
    38. array(
    39. 'label' => '编辑', // 链接名称
    40. 'url' => array(
    41. 'edit' => 'Yii::app()->controller->createUrl("/manage/taosearch/createProduct")', // 生成连接
    42. ),
    43. 'urlParams' => array('id','name'), // 设置url后面需要传递的参数字段
    44. ),
    45. array(
    46. 'label' => '添加', // 链接名称
    47. 'url' => array(
    48. 'add' => 'Yii::app()->controller->createUrl("/manage/taosearch/createProduct")', // 生成连接
    49. ),
    50. 'urlParams' => array('id','name'), // 设置url后面需要传递的参数字段
    51. ),
    52. ),
    53. 'tableHead' => array( // 设置表格列头信息
    54. '分类ID',
    55. '频道',
    56. '中文名',
    57. '英文名',
    58. '首字母',
    59. '排序',
    60. '分类级别',
    61. '父ID',
    62. '创建时间',
    63. '操作',
    64. ),
    65. )); ?>
    66. *
    67. * 下拉框方式调用
    68. * widget('ext.tree.widgets.TreeWidget',array(
    69. 'dataProvider' => $cate, // 传递数据
    70. 'pid' => 'pid', // 设置父ID
    71. 'formatParam' => 'name', // 设置格式化字段
    72. 'treeType' => false, // 输出树格式
    73. 'selectClass' => 'class="span11"', // 设置下拉框样式
    74. 'defaultSelectValue' => array( // 设置下拉框的默认值和选项
    75. 0 , '≡ 作为一级栏目 ≡'
    76. ),
    77. )); ?>
    78. */
    79. class TreeWidget extends Widget {
    80. /**
    81. * CArrayDataProvider 数据对象或数组数据
    82. * 组件数据接收参数(关联数组)
    83. * @var Object || array
    84. */
    85. public $dataProvider;
    86. /**
    87. * 赋值接收数据
    88. * @var type
    89. */
    90. public $arrAll = array();
    91. /**
    92. * 按_ID作键名的多维关系
    93. * @var type
    94. */
    95. public $arrIdRelation = array();
    96. /**
    97. * 按_ID作键名的多维关系的简化,用来输出树状图
    98. * @var type
    99. */
    100. public $arrIdRelationSimple = array();
    101. /**
    102. * 将原始数据转化成的_ID作键名的数组
    103. * @var type
    104. */
    105. public $arrIdAll = array();
    106. /**
    107. * 所有的父子关系
    108. * @var type
    109. */
    110. public $arrIdSon = array();
    111. /**
    112. * 叶子节点的_ID
    113. * @var type
    114. */
    115. public $arrIdLeaf = array();
    116. /**
    117. * 根节点的_ID
    118. * @var type
    119. */
    120. public $arrIdRoot = array();
    121. /**
    122. * 每个节点下的子孙后代_ID
    123. * @var type
    124. */
    125. public $arrIdChildren = array();
    126. /**
    127. * 每个节点回逆到根
    128. * @var type
    129. */
    130. public $arrIdBackPath = array();
    131. /**
    132. * 输出树的结构
    133. * @var type
    134. */
    135. public $strItem = '
      {$strSep}{$name}';
    136. /**
    137. * 设置表格样式
    138. * @var type
    139. */
    140. public $tableClass = 'items table table-striped table-bordered table-condensed';
    141. /**
    142. * 数据字段参数数组
    143. * @var type
    144. */
    145. public $dataKey = array();
    146. /**
    147. * 指定需要格式化的字段
    148. * @var type
    149. */
    150. public $formatParam = 'name';
    151. /**
    152. * 表格列名称
    153. * @var type
    154. */
    155. public $tableHead = array();
    156. /**
    157. * 父ID
    158. * @var type
    159. */
    160. public $pid = 'pid';
    161. /**
    162. * 指定树的类型
    163. * true 表格类型树
    164. * false 下拉框类型树
    165. * @var type
    166. */
    167. public $treeType = true;
    168. /**
    169. * 绑定下拉框value值
    170. * @var type
    171. */
    172. public $optionValue = 'id';
    173. /**
    174. * 格式化时间
    175. * @var type
    176. */
    177. public $formatTime = array();
    178. /**
    179. * 下拉框样式
    180. * @var type
    181. */
    182. public $selectClass = 'class="span3"';
    183. /**
    184. * 设置下拉框的默认值和选项
    185. * @var type
    186. */
    187. public $defaultSelectValue = array(
    188. 0,'≡ 作为一级栏目 ≡',
    189. );
    190. /**
    191. * 设置下拉框是否多选
    192. * true 多选
    193. * false 单选
    194. * @var type
    195. */
    196. public $isMultiple = false;
    197. /**
    198. * 绑定到下拉框的默认值
    199. * @var type
    200. */
    201. public $bindSelectValue = 0;
    202. /**
    203. * 操作列
    204. * @var type
    205. */
    206. public $action = array();
    207. /**
    208. * 运行
    209. */
    210. public function run() {
    211. if (is_array($this->dataProvider) && count($this->dataProvider) > 0)
    212. $data = $this->_run($this->dataProvider);
    213. else if (is_object($this->dataProvider) && count($this->dataProvider->rawData) > 0)
    214. $data = $this->_run($this->dataProvider->rawData);
    215. $this->render('tree' , array('data'=>$data));
    216. }
    217. /**
    218. * 运行
    219. * @param type $datas
    220. * @return type
    221. */
    222. private function _run($datas){
    223. foreach ($datas as $data) {
    224. if (!empty($this->action) && count($this->action) > 0) {
    225. foreach ($this->action as $key => $action) {
    226. $k = array_keys($action['url']);
    227. $data[$k[0]] = '';
    228. }
    229. }
    230. $this->arrAll[] = $data;
    231. $this->dataKey = array_keys($data);
    232. }
    233. $this->processData();
    234. if ($this->treeType === true)
    235. $data = $this->getTable();
    236. else
    237. $data = $this->getSelect($this->pid, $this->bindSelectValue, $this->isMultiple, $this->selectClass, $this->defaultSelectValue);
    238. return $data;
    239. }
    240. /**
    241. * 获得html
    242. * @return type
    243. */
    244. public function getHtml() {
    245. return $this->genHtml();
    246. }
    247. /**
    248. * 设置分层字段
    249. * 表格类型
    250. * @return string
    251. */
    252. public function getItemName(){
    253. $html = '
  • ';
  • foreach($this->dataKey as $v) {
  • if ($this->formatParam == $v)
  • $str = '{$strSep}';
  • else
  • $str = '';
  • $html .= '
  • ';
  • }
  • $html .= '
  • ';
  • return $html;
  • }
  • /**
  • * 获取表格列名称
  • * @return string
  • */
  • public function getTableHead(){
  • $html = '
  • ';
  • foreach($this->tableHead as $v)
  • $html .= '
  • ';
  • $html .= '
  • ';
  • return $html;
  • }
  • /**
  • * 获得表格形式的树
  • * @return string
  • */
  • public function getTable() {
  • $this->strItem = $this->getItemName();
  • $strRe = '
  • 提供两种方式的分类树格式,表格和下拉框形式的树形结构
    可以自定义表格和下拉框的样式,自定义以哪一列的参数为格式化数据,自定义层级关系参数,自定义表格列名称,也可以设置时间的格式化。
    这一切都可以帮你自动搞定,如果大家觉得好,别忘了点个赞呦... 分享一个功能强大的yii框架的分类树扩展 分享一个功能强大的yii框架的分类树扩展
    1. 调用方式
    2. 表格方式调用
    3. widget('ext.tree.widgets.TreeWidget',array(
    4. 'dataProvider' => $dataProvider, // 传递数据
    5. 'pid' => 'pid', // 设置父ID
    6. 'tableClass' => 'items table table-striped table-bordered table-condensed', // 表格样式
    7. 'formatParam' => 'name', // 设置格式化字段
    8. 'formatTime' => array( // 设置格式化的时间参数
    9. 'created'
    10. ),
    11. 'action' => array(
    12. array(
    13. 'label' => '编辑', // 链接名称
    14. 'url' => array(
    15. 'edit' => 'Yii::app()->controller->createUrl("/manage/taosearch/createProduct")', // 生成连接
    16. ),
    17. 'urlParams' => array('id','name'), // 设置url后面需要传递的参数字段
    18. ),
    19. array(
    20. 'label' => '添加', // 链接名称
    21. 'url' => array(
    22. 'add' => 'Yii::app()->controller->createUrl("/manage/taosearch/createProduct")', // 生成连接
    23. ),
    24. 'urlParams' => array('id','name'), // 设置url后面需要传递的参数字段
    25. ),
    26. ),
    27. 'tableHead' => array( // 设置表格列头信息
    28. '分类ID',
    29. '频道',
    30. '中文名',
    31. '英文名',
    32. '首字母',
    33. '排序',
    34. '分类级别',
    35. '父ID',
    36. '创建时间',
    37. '操作',
    38. ),
    39. )); ?>
    40. 下拉框方式
    41. widget('ext.tree.widgets.TreeWidget',array(
    42. 'dataProvider' => $cate, // 传递数据
    43. 'pid' => 'pid', // 设置父ID
    44. 'formatParam' => 'name', // 设置格式化字段
    45. 'treeType' => false, // 输出树格式
    46. 'selectClass' => 'class="span11"', // 设置下拉框样式
    47. 'defaultSelectValue' => array( // 设置下拉框的默认值和选项
    48. 0 , '≡ 作为一级栏目 ≡'
    49. ),
    50. )); ?>
    复制代码
    没有找到数据.
    '.$str.'{$'.$v.'}
    '.$v.'
    ';
  • $strRe .= '
  • '.$this->getTableHead().'';
  • $strRe .= $this->genHtml();
  • $strRe .= '
  • ';
  • return $strRe;
  • }
  • /**
  • * 获取下拉框形式的树
  • * @param type $strName
  • * @param array $arrValue
  • * @param type $blmMulti
  • * @param type $strExt
  • * @param type $arrFirst
  • * @return string
  • */
  • public function getSelect($strName = 'tree', $arrValue = array(), $blmMulti = false, $strExt = '', $arrFirst = null) {
  • !is_array($arrValue) && $arrValue = array($arrValue);
  • foreach ($this->arrIdAll as $strTemp => $arrTemp) {
  • $this->arrIdAll[$strTemp]['selected'] = '';
  • if (in_array($arrTemp['id'], $arrValue)) {
  • $this->arrIdAll[$strTemp]['selected'] = ' selected="selected"';
  • }
  • }
  • $this->strItem = '';
  • $strRe = '';
  • return $strRe;
  • }
  • /**
  • * 数据处理
  • * @param type $arrData
  • * @return type
  • */
  • private function helpForGetRelation($arrData) {
  • $arrRe = array();
  • foreach ($arrData as $strTemp => $arrTemp) {
  • $arrRe[$strTemp] = $arrTemp;
  • if (isset($this->arrIdRelation[$strTemp])) {
  • $arrRe[$strTemp] = $this->arrIdRelation[$strTemp];
  • }
  • if (count($arrRe[$strTemp]) > 0) {
  • $arrRe[$strTemp] = $this->helpForGetRelation($arrRe[$strTemp]);
  • } else {
  • array_push($this->arrIdLeaf, $strTemp);
  • }
  • }
  • return $arrRe;
  • }
  • /**
  • * 数据处理
  • * @param type $arrData
  • * @return type
  • */
  • private function helpForGetChildren($arrData) {
  • $arrRe = array_keys($arrData);
  • foreach ($arrData as $arrTemp) {
  • $arrRe = array_merge($arrRe, $this->helpForGetChildren($arrTemp));
  • }
  • return $arrRe;
  • }
  • /**
  • * 数据处理
  • * @param type $str
  • * @return type
  • */
  • private function helpForGetBackPath($str) {
  • $arrRe = array();
  • $intTemp = $this->arrIdAll[$str][$this->pid];
  • if ($intTemp > 0) {
  • $intTemp = '_' . $intTemp;
  • array_push($arrRe, $intTemp);
  • $arrRe = array_merge($arrRe, $this->helpForGetBackPath($intTemp));
  • }
  • return $arrRe;
  • }
  • /**
  • * 数据处理
  • */
  • private function processData() {
  • $count = count($this->arrAll);
  • foreach ($this->arrAll as $arrTemp) {
  • $strTemp = '_' . $arrTemp['id'];
  • $this->arrIdAll[$strTemp] = $arrTemp;
  • if ($arrTemp[$this->pid] > 0 && $count > 1) {
  • $strTemp_ = '_' . $arrTemp[$this->pid];
  • !isset($this->arrIdRelation[$strTemp_]) && $this->arrIdRelation[$strTemp_] = array();
  • $this->arrIdRelation[$strTemp_][$strTemp] = array();
  • !isset($this->arrIdSon[$strTemp_]) && $this->arrIdSon[$strTemp_] = array();
  • array_push($this->arrIdSon[$strTemp_], $strTemp);
  • } else {
  • !isset($this->arrIdRelation[$strTemp]) && $this->arrIdRelation[$strTemp] = array();
  • array_push($this->arrIdRoot, $strTemp);
  • }
  • }
  • $this->arrIdRelation = $this->helpForGetRelation($this->arrIdRelation);
  • $this->arrIdLeaf = array_unique($this->arrIdLeaf);
  • foreach ($this->arrIdRelation as $strTemp => $arrTemp) {
  • $this->arrIdChildren[$strTemp] = $this->helpForGetChildren($arrTemp);
  • in_array($strTemp, $this->arrIdRoot) && $this->arrIdRelationSimple[$strTemp] = $arrTemp;
  • }
  • $arrTemp = array_keys($this->arrIdAll);
  • foreach ($arrTemp as $strTemp) {
  • $this->arrIdBackPath[$strTemp] = $this->helpForGetBackPath($strTemp);
  • }
  • }
  • /**
  • * 数据处理
  • * @param type $intLen
  • * @return string
  • */
  • private function genSeparator($intLen) {
  • $strRe = '';
  • $i = 0;
  • while ($i $strRe .= ' ' . (($i + 1 == $intLen) ? '├' : '│');
  • $i++;
  • }
  • !empty($strRe) && $strRe .= '─';
  • return $strRe;
  • }
  • /**
  • * 数据处理
  • * @param type $arrRelation
  • * @param type $intSep
  • * @return type
  • */
  • private function genHtml($arrRelation = null, $intSep = 0) {
  • $strRe = '';
  • null === $arrRelation && $arrRelation = $this->arrIdRelationSimple;
  • foreach ($arrRelation as $strKey => $arrTemp) {
  • if (count($this->arrIdAll[$strKey]) > 0) {
  • if (!empty($this->formatTime) && count($this->formatTime) > 0) {
  • foreach($this->formatTime as $formatTime) {
  • if ($this->arrIdAll[$strKey][$formatTime] > 0) {
  • $this->arrIdAll[$strKey][$formatTime] = date('Y-m-d H:i:s' , $this->arrIdAll[$strKey][$formatTime]);
  • }
  • }
  • }
  • if (!empty($this->action) && count($this->action) > 0) {
  • foreach ($this->action as $key => $action) {
  • $k = array_keys($action['url']);
  • $url = eval('return '.$action['url'][$k[0]].';');
  • if (isset($action['urlParams']) && count($action['urlParams']) > 0) {
  • foreach($action['urlParams'] as $urlParams) {
  • $url .= '/'.$urlParams.'/'.$this->arrIdAll[$strKey][$urlParams];
  • }
  • }
  • $this->arrIdAll[$strKey][$k[0]] = CHtml::link($action['label'], $url, $action['options']);;
  • }
  • }
  • $strSep = $this->genSeparator($intSep);
  • extract($this->arrIdAll[$strKey]);
  • eval('$strRe .= "' . $this->strItem . '";');
  • count($arrTemp) > 0 && $strRe .= $this->genHtml($arrTemp, ($intSep + 1));
  • }
  • }
  • return $strRe;
  • }
  • }
  • ?>
  • 复制代码


    Kenyataan Laman Web ini
    Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

    Alat AI Hot

    Undresser.AI Undress

    Undresser.AI Undress

    Apl berkuasa AI untuk mencipta foto bogel yang realistik

    AI Clothes Remover

    AI Clothes Remover

    Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

    Undress AI Tool

    Undress AI Tool

    Gambar buka pakaian secara percuma

    Clothoff.io

    Clothoff.io

    Penyingkiran pakaian AI

    Video Face Swap

    Video Face Swap

    Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

    Alat panas

    Notepad++7.3.1

    Notepad++7.3.1

    Editor kod yang mudah digunakan dan percuma

    SublimeText3 versi Cina

    SublimeText3 versi Cina

    Versi Cina, sangat mudah digunakan

    Hantar Studio 13.0.1

    Hantar Studio 13.0.1

    Persekitaran pembangunan bersepadu PHP yang berkuasa

    Dreamweaver CS6

    Dreamweaver CS6

    Alat pembangunan web visual

    SublimeText3 versi Mac

    SublimeText3 versi Mac

    Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

    Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Apr 05, 2025 am 12:04 AM

    JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

    Bagaimanakah sesi merampas kerja dan bagaimana anda dapat mengurangkannya dalam PHP? Bagaimanakah sesi merampas kerja dan bagaimana anda dapat mengurangkannya dalam PHP? Apr 06, 2025 am 12:02 AM

    Sesi rampasan boleh dicapai melalui langkah -langkah berikut: 1. Dapatkan ID Sesi, 2. Gunakan ID Sesi, 3. Simpan sesi aktif. Kaedah untuk mengelakkan rampasan sesi dalam PHP termasuk: 1. Gunakan fungsi Sesi_Regenerate_ID () untuk menjana semula ID Sesi, 2. Data sesi stor melalui pangkalan data, 3.

    Huraikan prinsip -prinsip yang kukuh dan bagaimana ia memohon kepada pembangunan PHP. Huraikan prinsip -prinsip yang kukuh dan bagaimana ia memohon kepada pembangunan PHP. Apr 03, 2025 am 12:04 AM

    Penerapan prinsip pepejal dalam pembangunan PHP termasuk: 1. Prinsip Tanggungjawab Tunggal (SRP): Setiap kelas bertanggungjawab untuk hanya satu fungsi. 2. Prinsip Terbuka dan Tutup (OCP): Perubahan dicapai melalui lanjutan dan bukannya pengubahsuaian. 3. Prinsip Penggantian Lisch (LSP): Subkelas boleh menggantikan kelas asas tanpa menjejaskan ketepatan program. 4. Prinsip Pengasingan Antara Muka (ISP): Gunakan antara muka halus untuk mengelakkan kebergantungan dan kaedah yang tidak digunakan. 5. Prinsip Inversi Ketergantungan (DIP): Modul peringkat tinggi dan rendah bergantung kepada abstraksi dan dilaksanakan melalui suntikan ketergantungan.

    Bagaimana cara menetapkan kebenaran secara automatik UnixSocket selepas sistem dimulakan semula? Bagaimana cara menetapkan kebenaran secara automatik UnixSocket selepas sistem dimulakan semula? Mar 31, 2025 pm 11:54 PM

    Bagaimana untuk menetapkan keizinan UnixSocket secara automatik selepas sistem dimulakan semula. Setiap kali sistem dimulakan semula, kita perlu melaksanakan perintah berikut untuk mengubahsuai keizinan UnixSocket: sudo ...

    Bagaimana cara debug mod CLI dalam phpstorm? Bagaimana cara debug mod CLI dalam phpstorm? Apr 01, 2025 pm 02:57 PM

    Bagaimana cara debug mod CLI dalam phpstorm? Semasa membangun dengan PHPStorm, kadang -kadang kita perlu debug PHP dalam mod Interface Line Command (CLI) ...

    Terangkan pengikatan statik lewat dalam php (statik: :). Terangkan pengikatan statik lewat dalam php (statik: :). Apr 03, 2025 am 12:04 AM

    Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

    Bagaimana cara menghantar permintaan pos yang mengandungi data JSON menggunakan perpustakaan php curl? Bagaimana cara menghantar permintaan pos yang mengandungi data JSON menggunakan perpustakaan php curl? Apr 01, 2025 pm 03:12 PM

    Menghantar data JSON menggunakan perpustakaan Curl PHP dalam pembangunan PHP, sering kali perlu berinteraksi dengan API luaran. Salah satu cara biasa ialah menggunakan perpustakaan curl untuk menghantar post ...

    See all articles