如何在CakePHP中从find('threaded')创建select / options标签

时间:2010-03-04 19:02:43

标签: list cakephp

如何从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
            (
            )
     )
)

如何?

4 个答案:

答案 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)

这对我有用。

确保替换:

  • {SELECT_ID},其下拉值为
  • {SELECT_LABEL},显示为选项
  • {MODEL_NAME} 使用您的型号名称
/**
 * 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)

什么是“孩子”?看起来你的树是在一对多的关系中产生的

没有必要使用树行为来使用此方法 - ,但必须可以在单个查询中找到所有需要的结果