【问题标题】:Yii CListview -> pagination and AjaxLink/ajaxButtonYii CListview -> 分页和 AjaxLink/ajaxButton
【发布时间】:2012-03-23 01:18:00
【问题描述】:

我在分页和 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',

);

对于渲染_用户:

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 行,并将为接下来的 5 行生成分页 (ajaxUpdate = true)。前 10 行与 ajaxLink 没有问题,因为生成了客户端脚本,但问题是何时我转到下一页,ajaxLink 不起作用,因为它不是由分页生成的。

有什么想法吗?谢谢

【问题讨论】:

  • 你必须解释哪里出了问题,而不是仅仅输入代码并期待答案
  • 你所面对的描述在哪里?
  • 对不起,我以为我已经提出了问题..再次抱歉

标签: yii


【解决方案1】:

另一种方法,检查此post in the yii forum。所以你的代码会变成这样:

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)
);

您的确认被移动到 jquery 的 ajax 函数的 beforeSend 回调。如果我们从beforeSend 返回false,则不会发生ajax 调用。

另一个建议,您应该使用post 变量而不是get,并且如果可以的话,将ajax 调用移动到索引视图中的function,并且只包括来自所有链接的函数调用' onclick 事件。

希望这会有所帮助。

【讨论】:

  • 是的,我刚刚读到了,我想我没有其他选择,所以我根据这个想法创造了一些东西.. 只需在 afterAjaxUpdate 上添加代码
【解决方案2】:

不完全确定,但鉴于过去的经验,我认为问题出在列表视图小部件本身。

如果小部件的所有者是控制器,它使用 renderPartial 来呈现项目视图。 Renderpartial 有一个“processOutput”参数,您可能知道也可能不知道,对于大多数 AJAX 魔法(默认情况下为 FALSE),该参数需要设置为 TRUE。

因此,也许您可​​以尝试仅派生列表视图的一个类并在其中添加“renderItems()”的副本。在那里,您必须对其进行更改,以便它使用正确的参数调用 renderPartial。

【讨论】:

  • 当我单击下一页时,因为它是 ajax,所以我在控制台(萤火虫)中看到了结果,我看到生成了 ajaxLink jscode,但它仍然不能在父文档上工作。
  • 大多数 ajax 链接的东西需要一些“准备好文档”的代码来绑定到事件等,它不会通过 processOutput == FALSE 添加到返回的结果中。
【解决方案3】:

在小部件 Clistview 中,我添加了 afterAjaxUpdate

$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))                
                )); ?>

【讨论】:

    【解决方案4】:

    试试

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

    如果这不能解决,请尝试将数据提供者选项中的记录总数包括为 -

    'itemCount' => .....,
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-24
      • 1970-01-01
      • 2013-11-12
      相关资源
      最近更新 更多