Счетчик saveCounters

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
vav
Сообщения: 91
Зарегистрирован: 2014.07.16, 18:07

Счетчик saveCounters

Сообщение vav »

Хочу каждый раз при просмотре новости добавлять +1 просмотр в бд. Создал соответствующее поле в бд. Изменил экшн просмотра новости на такой:

Код: Выделить всё

   public function actionView($id) {
    if(!Yii::app()->request->cookies['count']) { 
    $cookie = new CHttpCookie('count', true);    
    $cookie->expire = time()+3600;                        
    Yii::app()->request->cookies['count'] = $cookie;    
    $post = Catalog::model()->findByPk($id);
    $post->saveCounters(array('views'=>1));           
  } 
      $this->render('view', array('model' => $post));  
} 
В итоге пишет:
CException

Задайте свойство "data".
zii/widgets/CDetailView.php(137)
Вьюха выглядит так:

Код: Выделить всё

$this->widget(
    'bootstrap.widgets.TbDetailView',
    array(
    'data' => $model,
    'attributes' => array(
    array('name' => 'content'),
    array('name' => 'city', 'value'=>$city[$model->city]),
    ),
    )
    );  
Не понимаю что ему нужно, где это свойство искать?
HQ0
Сообщения: 182
Зарегистрирован: 2012.10.17, 17:21

Re: Счетчик saveCounters

Сообщение HQ0 »

Я не особо разбирался в коде, но мне кажется, что так должно быть немного лучше. ($post до if-a?)

Код: Выделить всё

public function actionView($id) {
    $post = Catalog::model()->findByPk($id);
    if(!Yii::app()->request->cookies['count']) { 
        $cookie = new CHttpCookie('count', true);    
        $cookie->expire = time()+3600;                        
        Yii::app()->request->cookies['count'] = $cookie;    
        $post->saveCounters(array('views'=>1));           
    } 
    $this->render('view', array('model' => $post));  
}
vav
Сообщения: 91
Зарегистрирован: 2014.07.16, 18:07

Re: Счетчик saveCounters

Сообщение vav »

HQ0 писал(а):Я не особо разбирался в коде, но мне кажется, что так должно быть немного лучше. ($post до if-a?)

Код: Выделить всё

public function actionView($id) {
    $post = Catalog::model()->findByPk($id);
    if(!Yii::app()->request->cookies['count']) { 
        $cookie = new CHttpCookie('count', true);    
        $cookie->expire = time()+3600;                        
        Yii::app()->request->cookies['count'] = $cookie;    
        $post->saveCounters(array('views'=>1));           
    } 
    $this->render('view', array('model' => $post));  
} 
Cпасибо, ошибка пропала, да и код, конечно, красивее, но не работает
HQ0
Сообщения: 182
Зарегистрирован: 2012.10.17, 17:21

Re: Счетчик saveCounters

Сообщение HQ0 »

Ошибка пропала, но код не работает ? :)
Покажи другой код!
vav
Сообщения: 91
Зарегистрирован: 2014.07.16, 18:07

Re: Счетчик saveCounters

Сообщение vav »

HQ0 писал(а):Ошибка пропала, но код не работает ? :)
Покажи другой код!
какой именно? ошибки нет, но в бд значение соответствующего поля не меняется.
vav
Сообщения: 91
Зарегистрирован: 2014.07.16, 18:07

Re: Счетчик saveCounters

Сообщение vav »

Работает, но не так как нужно. При переходе на новость счетчик не изменяет значение остальным новостям, надо еще как-то передать айди новости
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Счетчик saveCounters

Сообщение anton44eg »

а зачем ему остальным новостям менять?
vav
Сообщения: 91
Зарегистрирован: 2014.07.16, 18:07

Re: Счетчик saveCounters

Сообщение vav »

anton44eg писал(а):а зачем ему остальным новостям менять?
я захожу в одну новость, счетчик +1, захожу в другую новость, в данном коде счетчик уже не меняется, но меняться должен, потом хочу по количеству просмотров сделать выборку
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Счетчик saveCounters

Сообщение anton44eg »

а, ну так в имя куки id добавьте

Код: Выделить всё

Yii::app()->request->cookies['count:' . $id] 
vav
Сообщения: 91
Зарегистрирован: 2014.07.16, 18:07

Re: Счетчик saveCounters

Сообщение vav »

anton44eg писал(а):а, ну так в имя куки id добавьте

Код: Выделить всё

Yii::app()->request->cookies['count:' . $id]
Спасибо, но так тоже не работает:

Код: Выделить всё

public function actionView($id) { 
    $post = Catalog::model()->findByPk($id); 
    if(Yii::app()->request->cookies['count:' . $id]) { 
        $cookie = new CHttpCookie('count', true);    
        $cookie->expire = time()+3600;                         
        Yii::app()->request->cookies['count:' . $id] = $cookie;    
        $post->saveCounters(array('count_views'=>1));           
    } 
    $this->render('view', array('model' => $post));  
} 
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Счетчик saveCounters

Сообщение mickgeek »

Код: Выделить всё

$cookie->expire = time()+3600;
$cookie->path = $this->createUrl('/post/view', array('id' => $id));
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Счетчик saveCounters

Сообщение anton44eg »

vav писал(а):
anton44eg писал(а):а, ну так в имя куки id добавьте

Код: Выделить всё

Yii::app()->request->cookies['count:' . $id] 
Спасибо, но так тоже не работает:

Код: Выделить всё

public function actionView($id) { 
    $post = Catalog::model()->findByPk($id); 
    if(Yii::app()->request->cookies['count:' . $id]) { 
        $cookie = new CHttpCookie('count', true);    
        $cookie->expire = time()+3600;                         
        Yii::app()->request->cookies['count:' . $id] = $cookie;    
        $post->saveCounters(array('count_views'=>1));           
    } 
    $this->render('view', array('model' => $post));  
}
Тут еще забыли

Код: Выделить всё

new CHttpCookie('count', true); 
Но выше предложили более интересный вариант
vav
Сообщения: 91
Зарегистрирован: 2014.07.16, 18:07

Re: Счетчик saveCounters

Сообщение vav »

Спасибо всем за помощь.
vav
Сообщения: 91
Зарегистрирован: 2014.07.16, 18:07

Re: Счетчик saveCounters

Сообщение vav »

Есть момент - счетчик накручивает просмотры тем новостям, которым уже накрутил:

Код: Выделить всё

public function actionView($id) { 
    $post = News::model()->findByPk($id); 
    if(!Yii::app()->request->cookies['count:' . $id]) {
        $cookie = new CHttpCookie('count'. $id, true);   
        $cookie->expire = time()+3600;
        $cookie->path = $this->createUrl('/news/view', array('id' => $id));                        
        Yii::app()->request->cookies['count:' . $id] = $cookie;    
        $post->saveCounters(array('cviews'=>1));           
    } 
    $this->render('view', array('model' => $post));  
}  
vav
Сообщения: 91
Зарегистрирован: 2014.07.16, 18:07

Re: Счетчик saveCounters

Сообщение vav »

Что-то не получается у меня с сортировкой:
экшн:

Код: Выделить всё

public function actionSort()  {
      $sort = News::model()->findAll(array('order'=>'count_views DESC'));
      $criteria = new CDbCriteria;
      $dataProvider=new CActiveDataProvider('News',array(
                       'criteria' => $criteria));
  $this->render('index',array(
   'dataProvider'=>$sort,
  ));
 } 

вьюха:

Код: Выделить всё

<?php echo CHtml::link('сортировать', array('news/sortPopular')); ?>
получаю:
CException

TbInput: Failed to initialize widget! Model is not set.
mickgeek
Сообщения: 957
Зарегистрирован: 2014.05.31, 20:50
Откуда: Санкт-Петербург
Контактная информация:

Re: Счетчик saveCounters

Сообщение mickgeek »

Написано же:
TbInput: Failed to initialize widget! Model is not set.
Укажите модель в виджете. Если не получится, напишите код подключения виджета, а не контроллера. И на будущее, новый вопрос - новая тема.
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Счетчик saveCounters

Сообщение anton44eg »

это что?

Код: Выделить всё

 $this->render('index',array(
   'dataProvider'=>$sort,
  )); 
vav
Сообщения: 91
Зарегистрирован: 2014.07.16, 18:07

Re: Счетчик saveCounters

Сообщение vav »

anton44eg писал(а):это что?

Код: Выделить всё

 $this->render('index',array(
   'dataProvider'=>$sort,
  ));
понял, что сморосил, исправил на 'dataProvider'=>$dataProvider, но та же ошибка, я туплю и не понимаю какой виджет пытаюсь вызвать и где он у меня должен быть, по идее по клику на линк просто должна происходить сортировка, разве в экшне того что я указал недостаточно?
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: Счетчик saveCounters

Сообщение anton44eg »

во view index у вас CGridView?
vav
Сообщения: 91
Зарегистрирован: 2014.07.16, 18:07

Re: Счетчик saveCounters

Сообщение vav »

anton44eg писал(а):во view index у вас CGridView?
нет, в index

Код: Выделить всё

?php $this->widget('bootstrap.widgets.TbListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_view',
    'template' => '{items}{pager}'
));  
Ответить