RSS-подписка

RSS-лента

Новые статьи

Последние комментарии


Получать обновления на эл. почту

Ваш e-mail:

Рассылка новостей от Loco

Разработка приложения на Yii. Урок 13: Внедряем категории для статей.

Разработка приложения на Yii. Урок 13: Внедряем категории для статей. Добавим в наш блог yiico возможность относить статью к одной или нескольким категориям. Для выбора категорий будем использовать ListBox c мультиселектом.
Видео этого урока: http://www.youtube.com/watch?v=7jFFZ4EtpA8

Это немного похоже на механизм тегов, который встроен в демо блог разработчиками Yii. Но там используется CAutoComplete и значения из него сразу сохраняются в поле таблицы БД. Нам же нужно будет правильно обработать и сохранить выбранные значения категорий в поле таблицы БД.

В чём у нас сложность? — activeListBox поддерживает выделение нескольких значений в списке. Добавляем смело htmlOption 'multiple' в activeListBox. Это сделает возможным множественное выделение в форме. Но дальше нужно кое-что сделать, чтобы в MySQL сохранять всё как надо - ведь у нас получается уже массив из выбранных значений (когда выбираем одно значение, то всё работает само). То есть в БД идёт прямиком выбранное значение и сохраняется там в текстовом поле как есть. Но выбирая несколько значений, мы должны работать уже с массивом.

1. Сохранение значений в MySQL будем делать в одно поле типа varchar в виде строки где все значения разделены запятыми ('6,87,16') ну или ('selection','multiple','yii','listbox'), не важно. У меня это будет второй вариант, то есть слова-идентификаторы латиницей. Созлаём в БД поле 'sections' в таблице 'tbl_posts'.

2. Добавляем public virtual attribute в нашу модель (этот атрибут и будет использоваться нашим listbox). Виртуальный – потому, что такого поля в таблице БД на самом деле не существует.

public $selection;

3. Далее мы используем специальный метод afterFind(), встроенный в Yii, который позволяет преобразовать значение атрибута после выборки из базы данных. В нашем случае мы не просто преобразуем значение из БД, но присвоим результат преобразования – нашей переменной $selection. Итак, разобьём значение, хранимое в БД, на массив элементов (разделителем у нас будет служить запятая) и поместим в нашу виртуальную переменную $selection:

protected function afterFind()
{
    parent::afterFind();
    $this->_oldTags=$this->tags;
    $this->_oldSections=$this->sections;

    $this->selection=explode(', ',$this->sections);
    return true;
}

4. Похожим образом организуем обратный процесс – сохранение выбранных в listBox значений в поле таблицы базы данных. Для этого задействуем метод beforeSave(): объединим выбранные в форме значения (удерживая ctrl выбираем несколько их) в строку:

public function beforeSave() {
    if(parent::beforeSave())
    {
        $this->sections=implode(', ',$this->selection);
        return true;
    }
    else
        return false;
}
В этих функциях должен быть 'return true;'

В Модели атрибут "selection" надо добавить в список safe атрибутов, в Виде уже используем его, а не 'sections'. То есть получилось промежуточное звено перед обращением к базе MySQL.

Изменим в БД формат хранимой даты на datetime. Поправим в виде код, изменив там форматирование через dateFormatter. И пора уже изменить язык всего нашего приложения yiico на русский.

Далее создадим таблицу для категорий Section - tbl_section. С помощью Gii создадим модель и Crud-контроллер и представления.

Далее в post/_view.php добавим вывод ссылок категорий.

И добавим в контроллер PostController в действие index критерий поиска, если в _GET предана определённая секция (точнее значение её section_id).

В следующем уроке сделаем виджет с категориями и выведем его (как меню слева на loco.ru)

Источник: loco.ru

almix
Разработчик Loco, автор статей по веб-разработке на Yii, CodeIgniter, MODx и прочих инструментах. Создатель Team Sense.

Вы можете почитать все статьи от almix'а.



Другие статьи по этой теме:
  1. 14 Разработка приложения на Yii. Урок 14: Выводим список категорий как новый виджет на сайте (29.04.2015) free
  2. 13 Разработка приложения на Yii. Урок 13: Внедряем категории для статей. (29.04.2015) ← вы тут free
  3. 12 Разработка приложения на Yii. Урок 12: Профилирование приложения, включаем кеширование. (20.01.2015)
  4. 11 Yiico. Видеокурс по разработке сайта на Yii. Урок 11: Отладка приложения, включаем журналирование. (20.01.2015)
  5. 10 Yiico. Видеокурс по разработке сайта на Yii. Урок 10: Если ваше приложение находится не в корневой папке, а во вложенной. (19.10.2014) free
  6. 9 Разработка сайта на Yii с нуля. Урок 9. Выборка статей определённого автора. (13.08.2014) free
  7. 8 Разработка сайта на Yii с нуля. Урок 8. Вызов в моделях функции, общей для них. Как избегать дублирования кода? (25.07.2014) free
  8. 7 Разработка сайта на Yii с нуля. Урок 7. Изменение количества выводимых записей на странице в CGridView. Включаем сессии Yii. (04.09.2013) free
  9. 6 Разработка сайта на Yii с нуля. Урок 6. Автоматич. отправка оповещений об одобренных комментариях на email автора комментария (11.08.2013) free
  10. 5 Разработка сайта на Yii с нуля. Урок 5. Переименовываем blog в yiico. Изменяем "Home" в breadcrumbs. Включаем Gzip-сжатие. (09.08.2013) free
  11. 4 Курс по Yii с нуля. Урок 4. Дорабатываем простую работу с пользователями: хранение пароля при редактировании пользователя. (13.04.2013) free
  12. 3 Курс по Yii с нуля. Урок 3. Создаём новых пользователей. Организуем простую систему авторизации. Аутентификация, пароли, соли. (20.07.2014) free
  13. 2 Курс по Yii с нуля. Урок 2. Переносим и настраиваем Yii и проект нашего сайта на рабочем сервере. Избавляемся от index.php в url (09.07.2014) free
  14. 1 Курс по Yii с нуля. Урок 1. Устанавливаем Yii на локальном компьютере. Заводим проект будущего сайта. (10.03.2013) free

Комментарии (0)     Подпишитесь на RSS комментариев к этой статье.

Leave a Comment

Fields with * are required.

Картинка с кодом валидации
Пожалуйста введите символы с картинки. Регистр букв неважен.