Как создать тег select / options из find ('threadaded') в CakePHP - PullRequest
0 голосов
/ 04 марта 2010

Как создать html-тег select / option из данных поиска ('threadaded') в CakePHP? Функция find () возвращает результаты так:

Array

( [0] => Массив ( [Forum] => Массив ( [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 ]

4 голосов
/ 27 ноября 2012

есть встроенный метод для дерева, как результаты, которые должны быть превращены в список для тегов выбора опции:

$this->Model->generateTreeList($conditions, null, null, ' - ', $recursive);

вместо использования find (с резьбой)

то есть, если вы прикрепили к нему поведение дерева (которое, вероятно, вам следует иметь, поскольку оно, очевидно, является древовидной моделью).

Но если вы хотите сохранить свой метод поиска (многопоточный), вам нужно вручную преобразовать его рекурсивным методом.

2 голосов
/ 11 марта 2011

спасибо 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;
}
1 голос
/ 06 октября 2010

Вот что у меня сработало.

Убедитесь, что вы заменили:

  • {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% для всех, это работает для меня, но это должно помочь дать вам кое-что для начала.

0 голосов
/ 04 марта 2010

Что такое "дети"?Похоже, что ваше дерево порождается через отношения один-ко-многим

Нет необходимости использовать поведение дерева для использования этого метода - , но все желаемые результаты должны быть доступны в одном запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...