1

我有一个带有 id、name、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());
4

2 回答 2

0

由 Bob 贡献,我现在在 atk4-addons 中添加了一个新插件:

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'));

测试用例和分层下拉列表的一个很好的例子可以在这里看到

非常感谢 Bob 实际编写了这个附加组件。保持!

于 2012-05-13T20:52:10.093 回答
0

Create a class extending Form_Field_Dropdown which would implement what you have already built. Once you're done, add it to the forked atk4-addons and I'll adjust it to be universally usable. What you have here is a good recipe but a universal solution would help the community.

于 2012-05-10T15:25:47.570 回答