【问题标题】:Yii Framework - CGridView sort related columnsYii 框架 - CGridView 排序相关列
【发布时间】:2011-08-29 08:27:09
【问题描述】:

提前感谢任何可以提供帮助的人。我一直在寻找答案,但还没有找到答案。我遇到了从 1 行到重新编写整个类都不起作用的“解决方案”。

我有“网格”来显示关系,并且能够使用搜索功能。我想不通的是排序功能。进行以下更改后,列标题将变为不可单击。

这就是我所拥有的:

关系名称/标签是“公司”,在 Employee 模型中设置。

表:员工 -- 列:idCompany & 表:公司 -- 列:companyNick

admin.php - 查看

<?php $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'employee-grid',
    'dataProvider'=>$model->search(),
    'filter'=>$model,
    'columns'=>array(
            array(
                    'name'=>'company',   
                    'value'=>'$data->company->companyNick',
            ),
            'lastName',
            'firstName',

ETC...

Employee.php - 模型

public function search()
    {
            // Warning: Please modify the following code to remove attributes that
            // should not be searched.

            $criteria=new CDbCriteria;

            //Company Relation Search
            $criteria->compare('company.companyNick',$this->company,true);  
            $criteria->with='company'; 

            //stock
            $criteria->compare('idEmployee',$this->idEmployee,true);
            $criteria->compare('idAccount',$this->idAccount,true);

ETC...

【问题讨论】:

    标签: php gridview frameworks jquery-ui-sortable yii


    【解决方案1】:

    我也遇到了同样的问题,最后这样解决了:

    模型搜索方法:

    $sort = new CSort();
    $sort->attributes = array(
    'assignedTo'=>array(
        'asc'=>'(SELECT surname from people 
                WHERE people.person_id = t.assigned_to) ASC',       
        'desc'=>'(SELECT surname from people 
                WHERE people.person_id = t.assigned_to) DESC',     
        ),
        '*', // add all of the other columns as sortable   
    ); 
    

    查看文件:

    $this->widget('zii.widgets.grid.CGridView', array(
    'id'=>'tasks-grid',
    'dataProvider'=>$model->search(),
    //'filter'=>$model,
    'columns'=>array(
        'task',
        array(
        'header'=>'Assigned To',
        'value'=> '$data->assignedTo->surname.", ".$data->assignedTo->forename',
            'name'=> 'assignedTo',
            'sortable'=>TRUE,
            ),
        'due_date',
        'status',       
    ),
    

    ));

    这样,我从相关表中选择单个字段到 order by 子句中,然后按此排序,您在表达式中创建表连接,在这种情况下它是 -people.person_id = t.assigned_to(其中 t 是yii 提供的表别名)。这可能不是创建 order by 子句的最有效方式,但它确实有效!

    【讨论】:

      【解决方案2】:

      这似乎是 [yii] 上的日常问题。从你的搜索功能中去掉这些东西,然后像这样在你的 CGridView 列中添加一个过滤器属性:

              array(
                      'name'=>'company',   
                      'value'=>'$data->company->companyNick',
                      'filter' => CHtml::listData(Company::model()->findAll(),'id','nick'),
              ),
      

      【讨论】:

      • 我不想创建下拉菜单。我想使用表头进行排序(而不是选择);和其他人一样。
      • 你仍然可以。但是,如果您想按公司名称而不是外键进行排序,则必须将其破解到您的数据提供程序中(例如 $model->search())
      • 我从 CSort 开始走上正确的道路......你不是很具体。感谢您告诉我我需要更改“某些东西”才能使其正常工作。很明显。
      • 哇,我相信你会从“所有试图帮助我的人看来,我是一个无法容忍、忘恩负义的混蛋”这句话中获得很多收获。
      • 好的,谢谢。下次尝试阅读该问题,而不是回答一个不相关的不伦不类的答案。
      【解决方案3】:

      在 Yii 网站 Wiki 页面上也有很好的解释如何做到这一点: http://www.yiiframework.com/wiki/281/searching-and-sorting-by-related-model-in-cgridview/

      【讨论】:

        【解决方案4】:

        我喜欢 Mike H 的回答。我还想指出,您可以使用 with() 来执行关系查询,然后将 select 设置为 false 以防止实际加载相关模型,而不是输入原始 SQL。您还可以通过传递点表示的字符串在视图中使用相关属性的attributeLabel,例如:

        
        // Controller
        $gridDataProvider = new CActiveDataProvider('EmrFormPatientTie', array(
            'criteria'=>array(
                'condition'=>'flag_locked=0',
                'with'=>array('patient'=>array(
                    'select'=>false, // Perform relational query without loading related models
                )),
            ),
            'pagination'=>(array('pageSize'=>15)),
            'sort'=>array(
                'attributes'=>array(
                    'patient.display_id'=>array(
                        'asc'=>'patient.display_id',
                        'desc'=>'patient.display_id DESC',
                    ),
                    '*', // Make all other columns sortable, too
                ),
            ),
        ));
        
        // View
        array(
            'name'=>'patient.display_id',
            'value'=>'$data->patient->display_id',
        ),
        
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-02-08
          • 1970-01-01
          • 1970-01-01
          • 2014-06-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多