2012-05-06 55 views
1

我有一個ID,姓名,id_parent結構的類別表。我使用的是atk4,我喜歡用縮進的子類別顯示下拉菜單。所以:下拉有齒痕類別敏捷工具包

home 
---cat1 
---cat2 
------subcat2.1 
------subcat2.2 
---cat3 etc 

我沒有建立的東西但是努力想看看這可怎麼改進。目前我有基於hasMany()的遞歸sql查詢。感覺這樣做可以不用回答。主要擔心的是現在我已經在模型中定義了樣式,但我不知道如何移出。我試圖學習我自己的控制器功能,但目前還沒有管理。到目前爲止我的代碼:

模型

<?php 
class Model_Category extends Model_Table { 
    public $table='category'; 
    function init() { 
    parent::init(); 
    $this->addField('id_parent'); 
    $this->addField('name'); 
    $this->hasMany('Category','id_parent'); 
    } 

    function tree($prefix='') { 
    $r=array(); 
    $childs=$this->ref('Category'); 
    foreach($childs as $child) { 
     $r[$childs->id]=$prefix.$childs['name']; 
     $r=array_merge($r,$childs->tree($prefix.'---')); 
    } 
    return $r; 
    } 
} 

在頁面:

$f=$this->add('Form'); 
$m=$this->add('Model_Category'); 
$m->load(1); // start recursive from home category 
$f->addField('dropdown','category')->setValueList($m->tree()); 
+0

也在這裏:http://phpmagister.com/dropdown-with-indented-categories-in-agile-toolkit-16025/ – romaninsh

+1

其實這個解決方案看起來相當不錯。我正在研究樹,如果你想要一個單一查詢樹,你可以使用這個:http://stackoverflow.com/questions/169817/is-it-possible-to-query-a-tree-structure-table-in -mysql功能於一個單查詢 - 一個。您可以將每個級別的查詢分組,但會增加內存消耗。無論如何,它也很難分頁。保持你的解決方案,這很好。 – romaninsh

+0

確實很棒,tx抽出時間審覈。我確實也嘗試過使用lpos/rpos列的類別。然而,它需要遞歸來重建lpos/rpos列。我有代碼爲hasMany()遞歸重建工作,但是對於我這裏描述的情況,它沒有這些字段。 –

回答

0

創建一個類擴展Form_Field_Dropdown這將實現你已經建立。一旦你完成了,將它添加到分叉atk4插件,我會調整它是普遍可用的。你在這裏有一個很好的配方,但一個通用的解決方案將有助於社區。

+0

我得到它的工作:https://github.com/si4dev/atk4-addons/blob/master/misc/lib/Form/Field/drilldown.php和使用:模型類函數:$ this->的hasMany(」類別」, 'id_parent');並在頁面上:$ f-> addField('drilldown','category') - > setModel('Model_Category'); –

+0

我現在的下一個挑戰是如何在CRUD/GRID中使用它? –

+0

感謝您安裝插件。我修改了它以正常工作。我會添加另一個答案。 – romaninsh

0

供稿人:鮑勃,我現在已經添加了一個新的附加到atk4-插件:

https://github.com/atk4/atk4-addons/blob/master/misc/lib/Form/Field/drilldown.php

正如文件中所描述的,該模型將同時需要家長和孩子設置字段:

$this->hasMany('Category','id_parent'); 
$this->hasOne('Category','id_parent')->display(array('form'=>'misc/drilldown')); 

The test-case and a good example of hierarchical dropdown can be seen here

大量的信貸,以鮑勃其實寫這個插件。保持!