Yii - Магазин 3: Продукт

07.05.2012

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

  1. Модель/Контроллер/Представление для Book
  2. Выставляем отношения

Git Rep - https://github.com/neo-classic/YiiShop

1) Модель/Контроллер/Представление для Book

Т.к. у нас уже сгенерированы и модель и CRUD, давайте подключим FCKeditor к форме добавления/редактирования книги. Для этого воспользуемся http://www.yiiframework.com/extension/fckeditor-integration — вот этим расширением, правда немного кастомизированным. Добавляем:

$this->widget('ext.fckeditor.FCKEditorWidget', array(
    "model"=>$model,
    "attribute"=>'description',
    "height"=>'400px',
    "width"=>'100%',
    "toolbarSet"=>'Default',
    "fckeditor"=>Yii::app()->basePath."/../fckeditor/fckeditor.php",
    "fckBasePath"=>Yii::app()->baseUrl."/fckeditor/",
    "config" => array(
        "EditorAreaCSS"=>Yii::app()->baseUrl.'/css/index.css',),
    )
);

в /protected/views/book/_form.php для поля description. Вот что получается:

Подключение FCKEditor yiiЧем мне нравится это расширение — в нём есть удобный для пользователя аплоадер файлов(кликаем на Вставить/Редактировать изображение → Просмотреть на сервере):

Upload files FCKEditor YiiУ меня есть несколько подобных расширений и с TinyMCE, но с ними постоянно возникают проблемы, приходится что-то править, а fckeditor работает всегда. Кстати, если кому-нибудь понадобятся эти расширения — пишите, но правьте будете их сами ;)

Кроме этого, в нашей форме есть поле Категория — сделаем из него dropDown из исписка категорий (если вы не забыли, в прошлой статье, в модель BookType мы добавлили функцию getAllTypes()):

echo $form->dropDownList($model, 'book_type', BookType::model()->getAllTypes());

Давайте ещё сделаем ввод Даты выхода с использованием CjuiDatePicker(http://www.yiiframework.com/doc/api/1.1/CJuiDatePicker).

$this->widget('zii.widgets.jui.CJuiDatePicker', array(
    'name' => 'release_date',
    'model' => $model,
    'attribute' => 'release_date',
    'language' => 'ru',
    'options' => array(
        'showAnim' => 'fold',
    ),
    'htmlOptions' => array(
        'style' => 'height:20px;'
    ),
));

Итого, вот что получилось с нашей формой:

Форма добавления продуктаНе забываем что в таблице поле release_date мы храним в int(11), а Date Picker возвращает дату, для преобразования даты в число переопределим метод beforeSave в модели Book:

protected function beforeSave() {
    if(parent::beforeSave()) {
        $this->release_date = strtotime($this->release_date);
        return true;
    } else {
        return false;
    }
}

protected function afterFind() {
    $date = date('d.m.Y', $this->release_date);
    $this->release_date = $date;
    parent::afterFind();
}

Первый метод как раз преобразует дату, перед сохранением, в UNIX формат, а второй нужен для того чтобы при выводе даты она преобразовывалась обратно в формат дд.мм.гггг.

И тут до меня доходит... ;) для этой модели мы забыли самое главное поле — price! Добавляем в таблицу Book поле price — float(6,2). В модель в rules() и attributeLabels() и инпут в форму.

Пробуем добавить...и...требует чтобы release_date было int, немного подправим правила валидации:

array('release_date', 'date', 'format'=>'dd.MM.yyyy'),

И всё добавилось! Проверяем таблицу:

Book tableВидим что всё отлично. Также я поработал над мелочами в контроллере — выставил правильные редиректы, убрал ненужные экшены, указал права доступа и .т.п. Описывать это не имеет смысла, если что смотрите в коде.

2) Выставляем отношения между моделями

И в конце давайте определим отношения. В модели Book:

public function relations() {
    return array(
        'category' => array(self::BELONGS_TO, 'BookType', 'book_type'),
    );
}

В модели BookType:

public function relations() {
    return array(
        'books' => array(self::HAS_MANY, 'Book', 'book_type'),
    );
}

Заключение

На сегодня всё, дальше запилим админку под это дело (выправим админское представление и т.п.).

P.S.: Полный дамп базы сейчал лежит в /protected/data/

Пишим магазин на Yii (Часть 1, Часть 2).

blog comments powered by Disqus
Наверх