вторник, 10 мая 2011 г.

Скрытие категорий и товаров

Скрытие категорий и товаров.
Поле shown в обеих таблицах должно скрывать категорию или товар, если shown принимает значение ‘no’. Это нужно для того, чтобы администратор мог временно скрыть товары, или категории, пока те, находятся в разработке, или товар отсутствует. Чтобы такой товар не показывался, в файле:
Z:\home\catalog.loc\www\protected\controllers\AssortimentController.php
Изменяем actionIndex
public function actionIndex()
{           
$criteria=new CDbCriteria(array(
'condition'=>'t.shown=1 and category.shown=1',
'with' => array('category'),      
));
$dataProvider=new CActiveDataProvider('Assortiment',array(
'criteria'=>$criteria));
                           
$this->render('index',array(
'dataProvider'=>$dataProvider,
));
}
Теперь товар покажется, только если категория не скрыта, и товар не скрыт.
Теперь надо, чтобы при добавлении и редактировании товара поле shown принимало бы только значения yes/no
В файле:
Z:\home\catalog.loc\www\protected\views\assortiment\ _form.php
Заменяем текстовое поле на радиобуттонс:
labelEx($model,'shown'); ?>
radioButtonList($model,'shown', 
array('yes' => 'yes','no' => 'no')
);?>   
В файле:
Z:\home\catalog.loc\www\protected\views\assortiment\ admin.php
widget('zii.widgets.grid.CGridView', array(
'id'=>'assortiment-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'id',
'name',
array(
'name' => 'category_id',
'filter' => CHtml::listData(Category::model()->findAll(), 'id', 'name'),
'value' => '$data->category->name',
),
array(
'name' => 'shown',
'filter' => CHtml::listData(Assortiment::model()->findAll(), 
'shown', 
'shown'),
'value' => '$data->shown',
),
array(
'class'=>'CButtonColumn',
),
),
));
?>
По этому подобию надо изменить и файлы в отображениях категорий:
Z:\home\catalog.loc\www\protected\views\category.

В следующий раз займусь изменением меню сайта.
Продолжение следует.

10 комментариев:

  1. 'value' => '$data->category->name',
    Найди ошибку, я второй день е....

    и тут

    array(
    'name' => 'shown',
    'filter' => CHtml::listData(Assortiment::model()->findAll(),
    'shown',
    'shown'),
    'value' => '$data->shown',
    ),

    ОтветитьУдалить
  2. Alex, какого рода ошибка?

    Ну попробую объяснить..
    $data->category->name - это поле, прописанно в связях модели Assortiment (в relations модели). Оно возвращает название категории к которой товар принадлежит. Смотри пост http://psyhos.blogspot.com/2011/05/yii.html

    Второе:
    это поле shown, которое принимает значение yes no. Имя этого поля: 'name' => 'shown',
    Фильтер, строка поиска по этому полю. Они в виде выпадающего списка CHtml::listData. В список передаем модель Assortiment::model()->findAll(), затем то, что будет отображаться в списке: поле 'shown' и значения, которые будут передаваться при выборе из списка: то же поле 'shown'.

    ОтветитьУдалить
  3. тогда почему у меня такая ошибка при выборе из выпадающего списка shown?
    Error 500: CDbException
    CDbCommand failed to execute the SQL statement: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'show LIKE '%yes%'' at line 1. The SQL statement executed was: SELECT COUNT(*) FROM `tbl_assortiment` `t` WHERE show LIKE :ycp0

    ОтветитьУдалить
  4. Я бы тогда попробовал вернуться к просто текстовому полю, и проверил бы, работает ли поиск по нему.

    ОтветитьУдалить
  5. Тут правильней бы $form-> добавить
    $form->labelEx($model,'shown');
    $form->radioButtonList($model,'shown', array('yes' => 'yes','no' => 'no'));

    ОтветитьУдалить
  6. Подскажите, пожалуйста, как можно сделать чтобы при выборе значений из первого выпадающего списка фильтровались значения во втором выпадающем списке? Смысл выбор области и города из этой области.

    ОтветитьУдалить
  7. можешь объяснить, что значат эти две строчки:
    'condition'=>'t.shown=1 and category.shown=1',
    'with' => array('category'),
    а то никак не могу понять (

    ОтветитьУдалить
  8. а именно:
    't.shown=1'
    что такое 't' ?
    через точку вроде пишут название таблицы и поля,, но где таблица 't' ??

    ОтветитьУдалить
    Ответы
    1. Верно, это название таблицы, вернее псевдоним таблицы в этом запросе. Yii по умолчанию всегда использует t.
      иногда без этого не работает.

      Сам запрос выглядит так:

      SELECT COUNT(DISTINCT `t`.`id`) FROM `tbl_assortiment` `t` LEFT OUTER JOIN `tbl_category` `category` ON (`t`.`category_id`=`category`.`id`) WHERE (t.shown=1 and category.shown=1)

      Удалить
  9. все пашет, только в _form.php до radioButtonList надо добавить echo $form->
    Я бы сделал выпадающий список по подобию Category. Мне кажется более эстетично смотрится чем радиобуттоны.

    ОтветитьУдалить