2014-04-29 9 views
2

[SOLVED] CGridview를 필터링하기 위해 두 개의 ID 테이블을 하나의 세부 테이블과 비교해야합니다. 은 "상세"테이블이있다

는 세 가지 중요한 필드가 있습니다

1 - id of the detail row 
2 - ID of an assigned PERSON 
3 - ID of an assigned GROUP (of PERSONs) 

만 사람이나 그룹이든이 할당 할 수 있습니다. 둘 다 지정할 수 없습니다. 그러나 동시에 그들 중 누구도 (개인, 그룹 또는 없음)

이되어야합니다. 그런 다음 PERSON 및 GROUP에 대한 ID 테이블이 두 개 있습니다. 기본 정보는 상세 정보에 링크되고 NAME은 NAME으로 정의됩니다.

내 CGridView에서 내가 이전에 설명 된 규칙 때문에 서로 충돌하지 않는다는 것을 알고 있기 때문에 GROUP과 PERSON을 하나의 필드에 추가하려고합니다. 충분히

array(
    'header'=>'supp group/person', 
    'value'=>'(!$data->assignedSupportperson && !$data->assignedSupportgroup ? 
     "null" : 
     ($data->assignedSupportperson ? 
      $data->assignedSupportperson->name : 
      $data->assignedSupportgroup->name 
     ) 
    )', 
), 

간단하지만 어려운 부분은 내가이 칼럼에 필터를 추가 할 필요가 있다는 것입니다 :

열 배열에서 : 그래서 그 값이 나는 그런 같이에 있어요.

그래서 내 논리는 내 모델에서 $criteria->compare()을 사용하여 두 ID 테이블을 DETAIL 테이블의 두 열과 비교합니다. 텍스트 필드 필터에 대한 ID 테이블을 참조하려면 $criteria->compare()을 사용했습니다. 그래서 그것에 대한 지식이 있습니다.

하지만 누가 모델을 잘 조작 할 수있는 사람이 있다면, 분실했기 때문에 지식을 공유하십시오.

[ADDED 소스 코드] 그리드보기 ::

$model = new TicketDetail('search'); 
    if (isset($_GET['TicketDetail'])) { 
     $model->attributes = $_GET['TicketDetail']; 
    } 
    $this->widget('bootstrap.widgets.TbGridView', array(
     'id' => 'Assigned-Ticket-grid', 
     'dataProvider'=>$model->assignedToUser(Yii::app()->user->data()->id)->search(), 
     'template' => "{items}{pager}", 
     'htmlOptions'=>array(), 
     'itemsCssClass' => 'table table-striped table-bordered table-condensed', 
     'filter' => $model, 
     'columns' => array(
      array(
       'name' => 'id', 
       'header' => 'ID', 
       'headerHtmlOptions'=>array(
        'width'=> 50, 
       ), 
      ), 
      array(
        'header'=>'supp group/person', 
        'value'=>'$data->AssignedSupport?$data->AssignedSupport:"null"', 
        //'filter'=>$model, <----- heres where i tried a couple things. 
        'headerHtmlOptions'=>array(
         'width'=>100 
        ) 
       ), 
      ), 
    ); 

모델 :: 당신이 필터의 값을 검색 할 수 있어야한다는

public function getAssignedSupport() 
    { 
    return !$this->assignedSupportperson&&!$this->assignedSupportgroup?"null":$this->assignedSupportperson?$this->assignedSupportperson->name:$this->assignedSupportgroup->name); 
    } 

가인가하지? 또는 나는 틀린 인상의 아래에서인가?

답변

0

나는 당신이 당신의 Detail 모델에 계산 필드를 추가하는 것이 좋습니다 :

public function getAssignedSupport() 
{ 
    return !$this->assignedSupportperson && !$this->assignedSupportgroup?"null":($this->assignedSupportperson?$this->assignedSupportperson->name:$this->assignedSupportgroup->name; 
} 

지금, 당신은 속성으로 위의 방법의 결과에 액세스 할 수 있습니다 YII의 __get 기능 (예 : $data->assignedSupport를), 그 경우처럼 데이터베이스의 특성입니다. 보기보다 모델에 계산 된 열을 추가하는 것이 훨씬 쉽고 깨끗합니다.

편집 : 에서,있는 gridview에서 계산 된 열 사용자 정의 필터와 순서를 만들려면 당신은 또한 모델의 search() 방법을 편집 할 수 있습니다. 실제적인 예를 보려면 다음 기사를 확인하십시오. Sort and filter a custom or composite CGridView column

+0

그래서 gridview를 통해 필터링하려고 시도하는 대신 이름 값이있는 필드가 있다는 생각을하게됩니다. 착시 필드를 통해 필터링하고 DB에서 오는 것처럼 작동합니다 ... 고맙습니다. 선생님 ... 아프다. 밖으로 시도해보고 어떻게되는지 알려주십시오. – Chris

+0

필자는이 기능을 추가했으며 원하는 값을 추가하는 데는 완벽하게 작동했습니다.하지만 상단에는 필터 상자가 없습니다. gridview 헤더에서 필터에 추가 할 필요가있는 여분의 것이 있습니까 ?? 메신저 꽤 새로운 그래서 난 정말 도움을 주셔서 감사합니다 – Chris

+0

그리드보기의 소스 코드를 공유 할 수 있을까요? – mcserep

관련 문제