如何从CakePHP中的find('threaded')数据创建select / option html标签? 函数find()返回如下结果:
Array
( [0] =>排列 ( [论坛] =>排列 ( [id] => 1 [name] =>论坛
)
[children] => Array
(
[0] => Array
(
[Forum] => Array
(
[id] => 3
[name] => Programowanie
[parent_id] => 1
)
)
[1] => Array
(
[Thread] => Array
(
[id] => 11
[name] => Nowe forumowisko
[parent_id] => 1
)
)
)
)
[1] => Array
(
[Forum] => Array
(
[id] => 4
[name] => Nauka
[parent_id] => 0
)
[children] => Array
(
)
)
)
如何?
答案 0 :(得分:4)
有一个构建方法,可以将树状结果放入选择选项标记的列表中:
$this->Model->generateTreeList($conditions, null, null, ' - ', $recursive);
而不是使用find(threaded)
即如果你将Tree行为附加到它(你可能应该拥有它,因为它显然是树模型)。
但是如果你想保留你的find(线程)方法,你需要通过递归方法手动转换它。
答案 1 :(得分:2)
感谢DSkinner,信息量很大.. 我已将其修改为更通用:
/**
* Returns an indented html select based on children depth
*
* @param array $data_array - Array of data passed in from cake's find('threaded') feature
* @param array $model - the model name
* @param array $key - the key field on the model
* @param array $value - the value field on the model
* @param array $list - Used internally, contains array to be returned
* @param int $counter - Used Internally, counter for depth
* @return array
*/
public function threaded_to_list($data_array, $model=null, $key='id', $value='name',
&$list = array(), $counter = 0, $separator='__')
{
if ( ! is_array($data_array))
return array();
foreach ($data_array AS $data)
{
$list[$data[$model][$key]] = str_repeat($separator, $counter).$data[$model][$value];
if ( ! empty($data['children']))
{
$this->threaded_to_list($data['children'], $model, $key, $value, $list, $counter + 1);
}
}
return $list;
}
答案 2 :(得分:1)
这对我有用。
确保替换:
/** * Returns an indented html select based on children depth * * @param array $data_array - Array of data passed in from cake's find('threaded') feature * @param array $list - Used internally, contains array to be returned * @param int $counter - Used Internally, counter for depth * @return array */ public function drop_down_from_threaded($data_array, &$list = array(), $counter = 0) { if ( ! is_array($data_array)) return array(); foreach ($data_array AS $data) { $list[$data[{SELECT_ID}]] = str_repeat(' ', $counter).$data[{SELECT_LABEL}]; if ( ! empty($data['children'])) { $this->drop_down_from_threaded($data['children'], $list, $counter + 1); } } return $list; } /** * Get the data from the find('threaded') and pass it to our new function */ $results = $this->{MODEL_NAME}->find('threaded'); $results = $this->drop_down_from_threaded($results);
对于每个人来说,这可能不会100%有效,它对我有用,但它应该有助于你开始。
答案 3 :(得分:0)
什么是“孩子”?看起来你的树是在一对多的关系中产生的
没有必要使用树行为来使用此方法 - ,但必须可以在单个查询中找到所有需要的结果。