Как я могу отобразить одну запись в 2 строки с помощью Yii CGridView? - PullRequest
2 голосов
/ 22 марта 2012

Я использую CGridView в Yii, как я могу отобразить одну запись в 2 строки?

По сути, я хочу показать детали записи в 1-й строке таблицы, а в другой строке я хочу показать ее сводку, я пробовал ее с помощью div и css, но не могу получить надлежащие результаты, есть кто-нибудь, кто можетпомогите мне в этом случае?

Я использую вот так:

<?php 

$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'bidding-grid',
'itemsCssClass' => 'data-default',
'dataProvider'=>$model,
'summaryText' => '',
'columns'=>array(
    'people_detail_for_bid.Person' => array(
                        'type'=>'raw',
                        'name'=>'people_detail_for_bid.Person',
                        'value'=>'Yii::app()->Controller->createUserNameLink($data->people_detail_for_bid->PeopleFirstName." ".$data->people_detail_for_bid->PeopleLastName, $data->people_detail_for_bid->PeopleId).
                        "<br><span class=decriptionText>".$data->people_detail_for_bid->PeopleDesignation."</span>".
                        "<br><span class=decriptionText>".$data->people_detail_for_bid->PeopleEmail."</span>"',
                        'htmlOptions'=>array('width'=>200),
    ),
    'timeAgo' => array(
                        'type'=>'raw',
                        'name'=>'timeAgo',
                        'value'=>'"<span class=decriptionText>".Yii::app()->Controller->_ago($data->PBPostedOn)."</sapn>"',
                        'htmlOptions'=>array('width'=>150),
    ),

),

)); 

?>

Ответы [ 4 ]

5 голосов
/ 25 марта 2012

Я думаю, что лучший и самый чистый способ сделать это - создать новое расширение и расширить его до CGridView, переопределить функцию renderTableRow следующим образом:

/**
 * Renders a table body row.
 * @param integer $row the row number (zero-based).
 */
public function renderTableRow($row)
{
    if($this->rowCssClassExpression!==null)
    {
        $data=$this->dataProvider->data[$row];
        echo '<tr class="'.$this->evaluateExpression($this->rowCssClassExpression,array('row'=>$row,'data'=>$data)).'">';
    }
    else if(is_array($this->rowCssClass) && ($n=count($this->rowCssClass))>0)
        echo '<tr class="'.$this->rowCssClass[$row%$n].'">';
    else
        echo '<tr>';

    $colCtr = 0;
    foreach($this->columns as $column){
        $column->renderDataCell($row);
        $colCtr++;
    }

    echo "</tr>\n";
    echo "<tr><td colspan=\"$colCtr\">This is the summary row. </td></tr>";
}
1 голос
/ 25 марта 2012

После слишком большого поиска ... и я попытался по-разному, теперь, наконец, нашел решение для этого .. это решение в основном своего рода 2-й способ сделать что-то не так ... но это работает для меня ..

.....
.....

    'timeAgo' => array(
                        'type'=>'raw',
                        'name'=>'timeAgo',
                        'value'=>'"<span class=decriptionText>".Yii::app()->Controller->_ago($data->PBPostedOn)."</sapn></td></tr><tr><td colspan=\"6\"><span class=decriptionText>".$data->PBSummary."</span>"',
                        'htmlOptions'=>array('width'=>150),
    ),

.....
.....

добавил несколько тегов таблицы в последний столбец, чтобы закрыть строку, и добавил еще один.

надеюсь, что это работает для всех ..

спасибо ..

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

Вы можете настроить то, что вы отображаете в столбцах, поэтому, если вы хотите отобразить два разных поля вашей таблицы в одной строке, вам нужно создать функцию в вашей модели:

public function customColumn()
{
    return $this->PeopleDesignation.'<br/>'.$this->PeopleEmail;
}

А затем присвойте методу значение вашего столбца:

array(
    'type'=>'html',
    'value'=>'$data->customColumn()'
),

Ура, Пабло.

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

Звучит как 2 чередующихся CGridViews.Так что вы можете попробовать это, но я не могу себе представить, что это сработает хорошо:

Наложите один CGridView поверх другого, с достаточным количеством прозрачного пространства в каждом ряду, чтобы другой мог отобразить его строку, и...

a. one `CGridView` table offset vertically by half a row height, *OR*
b. one table's row's text vertically top-aligned & the other bottom-aligned

Но почему-то я сомневаюсь, что это способность CGridView;) И синхронизировать их, чтобы они объединялись и прокручивались, было бы почти невозможно.Похоже, вам нужно улучшить CGridView или получить новый виджет из CGridView.Интересно, есть ли у JQuery что-нибудь для этого?

...