Yii CListview -> разбиение на страницы и AjaxLink / ajaxButton - PullRequest
5 голосов
/ 08 марта 2012

У меня проблемы с пагинацией и формой Ajax.

Вот мой код для Controller:

$dataProvider = new CActiveDataProvider('User', array(
        'pagination'=>array(
                'pageSize'=>10,
        ),
));

$this->render('users',array(
  'dataProvider'=>$dataProvider,
));  

Для просмотра -> пользователи:

$this->widget('zii.widgets.CListView', array(
    'dataProvider'=>$dataProvider,
    'itemView'=>'_user',

);

Для рендера _users:

echo CHtml::ajaxLink($text, $this->createUrl('admin/deleteuser',array('id'=>$data->iduser)), array('success'=>"js:function(html){ alert('remove') }"), array('confirm'=>_t('Are you sure you want to delete this user?'), 'class'=>'delete-icon','id'=>'x'.$viewid));

если у меня есть 15 строк в базе данных, он покажет только 10 и сгенерирует нумерацию страниц (ajaxUpdate = true) для следующих 5. Первые 10 строк не имеют проблем с ajaxLink, потому что был создан клиентский скрипт, но проблема заключается в том, когда Я перехожу на следующую страницу, ajaxLink не работает, потому что он не генерируется пагинацией.

есть идеи? спасибо

Ответы [ 4 ]

1 голос
/ 12 марта 2012

Альтернативный метод, проверьте этот пост на форуме yii . Таким образом, ваш код станет таким:

echo CHtml::link($text,
    $this->createUrl('admin/deleteuser',array('id'=>$data->iduser)),
    array(// for htmlOptions
      'onclick'=>' {'.CHtml::ajax( array(
           'beforeSend'=>'js:function(){if(confirm("Are you sure you want to delete?"))return true;else return false;}',
           'success'=>"js:function(html){ alert('removed'); }")).
         'return false;}',// returning false prevents the default navigation to another url on a new page 
    'class'=>'delete-icon',
    'id'=>'x'.$viewid)
);

Ваше подтверждение перемещено в beforeSend функцию jquery *1007*. Если мы вернем false из beforeSend, вызов ajax не произойдет.

Еще одно предложение: вы должны использовать post переменные вместо get, а также, если можете, переместить вызов ajax на function в представлении индекса и просто включить вызовы функции из всех ссылок. 'onclick событие.

Надеюсь, это поможет.

0 голосов
/ 22 марта 2012

попробуйте

$this->widget('zii.widgets.CListView', array(
   'dataProvider'=>$dataProvider,
   'itemView'=>'_user',
   'enablePagination' => true,
);

, если это не помогло, попробуйте включить общее количество записей в параметрах поставщика данных как -

'itemCount' => .....,
0 голосов
/ 12 марта 2012

В виджет Clistview я добавил после AjaxUpdate

$jsfunction = <<< EOS
js:function(){
    $('.delete-icon').live('click',function(){ 
      if(confirm('Are you sure you want to delete?'))
      {
        deleteUrl = $(this).attr('data-href');
        jQuery.ajax({'success':function(html){ },'url':deleteUrl,'cache':false});
        return false;    
      }
      else
        return false;
    });
  }
EOS;

$this->widget('zii.widgets.CListView', array(
  'dataProvider'=>$dataProvider,
  'id'=>'subscriptionDiv',
  'itemView'=>'_subscription',
  'afterAjaxUpdate'=>$jsfunction,
  'viewData'=>array('is_user'=>$is_user,'all'=>$all),
  'htmlOptions'=>($dataProvider->getData()) ? array('class'=>'table') : array('class'=>'table center'), 
  )
);

и в _user только что добавили атрибут data-href

<?php echo CHtml::ajaxLink($text, $this->createUrl('admin/deletesubscription',array('id'=>$data->idsubscription)), 
            array('success'=>"js:function(html){ $('#tr{$viewid}').remove(); }"), 
            array('confirm'=>_t('Are you sure you want to unsubscribe?'), 
                'class'=>'delete-icon',
                'id'=>'x'.$viewid,
                'data-href'=>$this->createUrl('admin/deletesubscription',array('id'=>$data->idsubscription))                
                )); ?>
0 голосов
/ 09 марта 2012

Не совсем уверен, но, учитывая прошлый опыт, я думаю, что проблема в самом виджете списка.

Если владельцем виджета является Контроллер, он использует renderPartial для визуализации представления элемента.Renderpartial имеет, как вы можете или не можете знать, параметр "processOutput", который должен быть установлен в значение TRUE для большей части магии AJAX (по умолчанию FALSE).

Так что, возможно, вы можете попытаться просто получить класс списка и добавить туда копию renderItems ().Там вам придется изменить его так, чтобы он вызывал renderPartial с правильными параметрами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...