Русскоязычный форум, посвященный фреймворку Kohana
http://forum.kohanaframework.su/

Расширяем ORM. Получаем массив для Form::select
http://forum.kohanaframework.su/viewtopic.php?f=38&t=580
Страница 1 из 1

Автор:  AmberLEX [ 06 мар 2013, 12:12 ]
Заголовок сообщения:  Расширяем ORM. Получаем массив для Form::select

Довольно часто приходится из БД получить записи и использовать их в форме для html элемента <select>
Вот возможное решение:
Код:
class ORM extends Kohana_ORM
{
    /**
     * Return array for html <select> element
     *
     *     ->find_for_select('id', 'title', array('none', 'Select a value'));
     *
     * @param       $key      value for <option> in <select> element
     * @param       $val      text for <option> in <select> element
     * @param array $unshift  add an empty value to the start of a select list
     *                        first element of $unshift  - array key name
     *                        second element of $unshift - array value
     *
     * @return array
     */
    public function find_for_select($key, $val, array $unshift = array())
    {
        $array = array();

        if ($unshift AND isset($unshift[0]) AND isset($unshift[1])) {
            $array[$unshift[0]] = $unshift[1];
        }

        foreach ($this->find_all() as $obj) {
            $array[$obj->$key] = $obj->$val;
        }

        return $array;
    }
}
 

Используем, например, так:
Код:
$select_arr = ORM::factory('Color')->find_for_select('id', 'name', array(0, 'All colors'));

echo Form::select('color', $select_arr);
 

$unshift - необязательный параметр, в котором можно указать первый элемент массива для <select> При выборке из БД его обычно нет.

UPD: Заменил ->find_all_for_select() на ->find_for_select() для более короткой записи.

Автор:  Rush64 [ 06 мар 2013, 14:12 ]
Заголовок сообщения:  Re: Расширяем ORM. Получаем массив для Form::select

а если выборка с условием?

Автор:  Sergey [ 06 мар 2013, 14:13 ]
Заголовок сообщения:  Re: Расширяем ORM. Получаем массив для Form::select

хорошо )

Автор:  AmberLEX [ 06 мар 2013, 14:51 ]
Заголовок сообщения:  Re: Расширяем ORM. Получаем массив для Form::select

Rush64 писал(а):
а если выборка с условием?

Все то же самое
Код:
$select_arr = ORM::factory('Color')
    ->where('status', '=', 1)
    ->order_by('name', 'DESC')
    ->find_for_select('id', 'name', array(0, 'All colors'));
 

Просто вместо ->find_all() используете ->find_all_for_select(...)
find_all() внутри :)

Автор:  Sergey [ 06 мар 2013, 15:18 ]
Заголовок сообщения:  Re: Расширяем ORM. Получаем массив для Form::select

Цитата:
Просто вместо ->find_all() используете ->find_all_for_select(...) он внутри :)


Не скажу правда, что прям так уж элегантно.
Не подумывал о такой структуре:

Код:
<?php
$select_arr = ORM::factory('color')
                ->select(array(0, 'All colors'))
                ->find_all('id', 'name')
                ->as_array();

echo Form::select('color', $select_arr);
?>

Автор:  AmberLEX [ 06 мар 2013, 16:01 ]
Заголовок сообщения:  Re: Расширяем ORM. Получаем массив для Form::select

Спасибо, подсказал Sergey
Первое сообщение запоролось, т.к. форум тормознул, поэтому просто напишу новую версию кода:
Код:
class ORM extends Kohana_ORM
{
    /**
     * Return array for html <select> element
     *
     *     ->find_for_select('id', 'title', array('none', 'Select a value'));
     *
     * @param       $key      value for option <select>
     * @param       $val      field by title in select
     * @param array $unshift  add an empty value to the start of a select list
     *                        first element of $unshift  - array key name
     *                        second element of $unshift - array value
     *
     * @return array
     */
    public function find_for_select($key, $val, array $unshift = array())
    {
        $array = $this->find_all()->as_array($key, $val);

        if (isset($unshift[0]) AND isset($unshift[1])) {
            Arr::unshift($array, $unshift[0], $unshift[1]);
        }

        return $array;
    }
}
 

Страница 1 из 1 Часовой пояс: UTC + 4 часа [ Летнее время ]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/