Русскоязычный форум, посвященный фреймворку Kohana

Все о фреймворке Kohana. Обсуждение уроков, документации.
Текущее время: 19 мар 2024, 13:27

Часовой пояс: UTC + 4 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
СообщениеДобавлено: 06 мар 2013, 12:12 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Довольно часто приходится из БД получить записи и использовать их в форме для 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() для более короткой записи.

_________________
http://de-en.info (работает на Kohana 3.3)


Последний раз редактировалось AmberLEX 06 мар 2013, 16:12, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 мар 2013, 14:12 
Не в сети
Бывалый

Зарегистрирован: 06 авг 2012, 22:39
Сообщения: 91
а если выборка с условием?


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 мар 2013, 14:13 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
хорошо )


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 мар 2013, 14:51 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
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() внутри :)

_________________
http://de-en.info (работает на Kohana 3.3)


Последний раз редактировалось AmberLEX 06 мар 2013, 17:25, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 мар 2013, 15:18 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 июл 2012, 18:00
Сообщения: 701
Откуда: Murom, Russia
Цитата:
Просто вместо ->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);
?>


Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 06 мар 2013, 16:01 
Не в сети
Бывалый
Аватара пользователя

Зарегистрирован: 05 июн 2012, 03:08
Сообщения: 213
Спасибо, подсказал 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;
    }
}
 

_________________
http://de-en.info (работает на Kohana 3.3)


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 4 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Все о фреймворке Kohana  | 
Powered by phpBB® Forum Software © phpBB Group