2012-03-27 10 views
5
$this->widget('zii.widgets.grid.CGridView', array(
    'dataProvider'=>$dataProvider, 
    'columns'=>array(
     'title',   // display the 'title' attribute 
     'category.name', // display the 'name' attribute of the 'category' relation 
     'content:html', // display the 'content' attribute as purified HTML 
     array(   // display 'create_time' using an expression 
      'name'=>'create_time', 
      'value'=>'date("M j, Y", $data->create_time)', 
     ), 
     array(   // display 'author.username' using an expression 
      'name'=>'authorName', 
      'value'=>'$data->author->username', 
//HERE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
       'htmlOptions'=>array('class'=>'$data->author->username', 'secondAttribute' => $data->author->id), 
//HERE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
     ), 
     array(   // display a column with "view", "update" and "delete" buttons 
      'class'=>'CButtonColumn', 
     ), 
    ), 
)); 

独自の属性を追加し、私はPHPの変数を追加することができますが、オプションhtmlOptionsのためにこれは不可能です。どうして?
PHP変数で属性を作成するにはどうしたらいいですか?Yiiは - CGridView - オプション<code>value</code>で

答えて

9

classプロパティを指定せずにcolumnsコレクションに配列を追加すると、作成される列のタイプはCDataColumnになります。プロパティCDataColumn::valueは、すべてのデータセル、その 結果データセルの内容としてレンダリングするために評価されるであろう

PHP発現ことがexplicitly documentedあります。

したがって、valueは、各行に対してeval」EDを取得し、特殊な性質を持っており、あなたが 『動的』に設定することができます理由です。しかしこれは例外で、ほとんど同じ機能をサポートしているものはほとんどありません。プロパティcssClassExpressionはまさにこの使用ケースをカバーして別の特別な例外であるため、

しかし、あなたは幸運です。

array(
    'name'=>'authorName', 
    'value'=>'$data->author->username', 
    'cssClassExpression' => '$data->author->username', 
), 

編集:だから、このようにそれを行うことができます私はあなたの例からのコピー/貼り付けながら、ミスを犯し、あなたがhtmlOptions内部の追加の属性のために同じことをやろうとしていることに気づかなかった(Iコードの関連部分を削除しました)。

動的値にさらにオプションを追加する必要がある場合は、CDataColumnをサブクラス化し、renderDataCellメソッド(stock implementation is here)を上書きします。これはまだ(受け入れ答えがあることが与えられた)が適用されるかどう

+1

/** * DataColumn class file. * Extends {@link CDataColumn} */ class DataColumn extends CDataColumn { /** * @var boolean whether the htmlOptions values should be evaluated. */ public $evaluateHtmlOptions = false; /** * Renders a data cell. * @param integer $row the row number (zero-based) * Overrides the method 'renderDataCell()' of the abstract class CGridColumn */ public function renderDataCell($row) { $data=$this->grid->dataProvider->data[$row]; if($this->evaluateHtmlOptions) { foreach($this->htmlOptions as $key=>$value) { $options[$key] = $this->evaluateExpression($value,array('row'=>$row,'data'=>$data)); } } else $options=$this->htmlOptions; if($this->cssClassExpression!==null) { $class=$this->evaluateExpression($this->cssClassExpression,array('row'=>$row,'data'=>$data)); if(isset($options['class'])) $options['class'].=' '.$class; else $options['class']=$class; } echo CHtml::openTag('td',$options); $this->renderDataCellContent($row,$data); echo '</td>'; } } 

我々はこのように、この新しいクラスを使用することができます+1非常に良い説明 –

+0

これは私の例と同じです。これは動作しません - 誰も表示されません。 –

+0

@DirkFograust:これは間違いなく**あなたの例と同じではありません。もう一度見てください。また、Yiiの最新バージョンを使用していることを確認してください。 – Jon

5

は知らないが、「rowHtmlOptionsExpression」の形でわずかに良い解決策があります。これは、すべての行について評価される式を指定します。 eval()呼び出しの結果が配列の場合、<tr>タグのhtmlOptionsとして使用されます。だから、基本的には今、このようなものを使用することができます。

$this->widget('zii.widgets.grid.CGridView', array 
(
    ... 
    'rowHtmlOptionsExpression' => 'array("id" => $data->id)', 
    ... 

あなたのすべてのタグは、レコードPKとid属性を持つことになります。 jQueryをわずかに変更して、余分な列の代わりにそのタグからIDを取得すると、設定する必要があります。

+0

偉大な...ちょうど私が探していたものが、どのようなwierd構文マン! – tinybyte

2

次の内容のファイルを作成/保護/コンポーネントの下DataColumn.phpをクラスCDataColumn

を拡張:

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'article-grid', 
    'dataProvider' => $model->search(), 
    'filter' => $model, 
    'columns' => array(
     'id', 
     'title', 
     array(
      'name' => 'author', 
      'value' => '$data->author->username' 
     ), 
     array(
      'class' => 'DataColumn', 
      'name' => 'sortOrder', 
      'evaluateHtmlOptions' => true, 
      'htmlOptions' => array('id' => '"ordering_{$data->id}"'), 
     ), 
     array(
      'class' => 'CButtonColumn', 
     ), 
    ), 
)); 
関連する問題