Форматирование YII виджета CListView

Я знаю, что это может быть глупый вопрос... но я пытаюсь выровнять фильтр и виджет CListView, чтобы показать его соответствующим образом, как показано ниже.

Вот код

<div class="row-fluid span12">
 <div class="span4">

<?php $box = $this->beginWidget(
    'bootstrap.widgets.TbBox',
    array(
        'title' => 'Advanced Search',
        'headerIcon' => 'icon-th-list',
        'htmlOptions' => array('class' => 'bootstrap-widget-table')
        )
    );?>
<?php $this->renderPartial('_search',array('model'=>$model,)); ?>

<?php $this->endWidget(); ?>

</div>
<div class="span8">
     <?php 
        $this->widget('zii.widgets.CListView', 
                array(
                      'dataProvider'=>$model->search(),
                      'ajaxUpdate' => true,
                      'enablePagination'=>true,

                      'itemView'=>'_list',   // refers to the partial view named '_post'
                      'sortableAttributes'=>array(
                                                  'Price',
                                                  'Year',
                                                  'Lenght'
                                                  ),

                      )

                    );
               ?>

</div>
</div>

который на самом деле генерирует что-то вроде левой стороны прикрепленного изображения

введите здесь описание изображения

Как я могу убедиться, что виджет CListView выровнен внутри фильтра? И избавиться от текста "Отображаются результаты 1-29" и выровнять фильтры по верху?


person Sachy    schedule 18.12.2014    source источник


Ответы (2)


Div — это блочные элементы, поэтому у вас есть два вида блокировки <div class="span4"> и <div class="span8"> друг против друга.

Что, если вы отбросите макет начальной загрузки, сделаете фильтры в div плавающими влево и поместите их внутрь div CListView?

<div class="row-fluid span12">
  <div style="float:left;">
   ... filters
  </div > 
    ... 
    $this->widget('zii.widgets.CListView',
    ... 
</div><!-- span12 -->

Обновлять

С упомянутого вами сайта:

плавающий div

верхний контейнер

person Igor Savinkin    schedule 18.12.2014
comment
Спасибо! Но это не поможет. На самом деле, если вы видите правую часть изображения, которое я разместил, я хотел бы каким-то образом показать сортировку вверху, и я не хочу, чтобы текст результатов 1-29 отображался вообще. Я пытаюсь добиться этого›goo.gl/ldFNOx - person Sachy; 18.12.2014
comment
@Сахи, я забыл. Его родитель должен иметь позицию: относительную или позицию: абсолютную: <div class="row-fluid span12" style='position:relative;'> - person Igor Savinkin; 18.12.2014

Мое решение немного длиннее, но терпите меня.

Макет по умолчанию для CListItem выглядит следующим образом:

<div>{pager}</div>
<div>{summary}</div>
<div class='items'>{item1}{item2}...{item_n}</div>

Чтобы добиться желаемого макета, вам нужно каким-то образом вставить фильтр в контейнер, то есть в div .items. Это можно сделать несколькими способами.

  1. Вы можете перезаписать класс ListView, чтобы добавить переменную beforeItems, содержимое которой будет помещено в контейнер элемента, но перед первым элементом. например

    <?php
    
    Yii::import('zii.widgets.CListView');
    
    class MyListView extends CListView {
    
    public $beforeItems = '';
    
        public function renderItems()
        {
            echo CHtml::openTag($this->itemsTagName,array('class'=>$this->itemsCssClass))."\n";
            $data=$this->dataProvider->getData();
            if(($n=count($data))>0)
            {
                echo $this->beforeItems;
                $owner=$this->getOwner();
                $viewFile=$owner->getViewFile($this->itemView);
                $j=0;
                foreach($data as $i=>$item)
                {
                    $data=$this->viewData;
                    $data['index']=$i;
                    $data['data']=$item;
                    $data['widget']=$this;
                    $owner->renderFile($viewFile,$data);
                    if($j++ < $n-1)
                        echo $this->separator;
                }
            }
            else
                $this->renderEmptyText();
            echo CHtml::closeTag($this->itemsTagName);
        }
    
    }
    

    Затем вы можете вызвать свой список как:

    $this->widget('path.to.MyListView, array(
        ...
        'beforeSend' => '<filter html here>',
    
  2. Однако, чтобы убедиться, что ваше представление списка выглядит так, как показано на изображении, вам потребуется расширить представление списка, чтобы удалить часть рендеринга открывающего и закрывающего тега контейнера, закомментированного в приведенном ниже примере.

    Yii::import('zii.widgets.CListView');
    
    class MyListView extends CListView {
    
        public function renderItems()
        {
            // echo CHtml::openTag($this->itemsTagName,array('class'=>$this->itemsCssClass))."\n";
            $data=$this->dataProvider->getData();
            if(($n=count($data))>0)
            {
                $owner=$this->getOwner();
                $viewFile=$owner->getViewFile($this->itemView);
                $j=0;
                foreach($data as $i=>$item)
                {
                    $data=$this->viewData;
                    $data['index']=$i;
                    $data['data']=$item;
                    $data['widget']=$this;
                    $owner->renderFile($viewFile,$data);
                    if($j++ < $n-1)
                        echo $this->separator;
                }
            }
            else
                $this->renderEmptyText();
            // echo CHtml::closeTag($this->itemsTagName);
        }
    
    }
    

You can then edit template to remove the summary and pager that appear before the items:

`template` => `<div><your_filter_html>{items}</div>`

Шаблон используется для управления расположением различных компонентов в представлении списка. Распознаются следующие токены: {summary}, {sorter}, {items} и {pager}. Они будут заменены текстом сводки, ссылками сортировки, списком элементов данных и пейджером.

person topher    schedule 18.12.2014
comment
Спасибо за это, но я на самом деле хочу избавиться от текста, отображающего 1-29 из 29 результатов, а затем разместить фильтры сортировки в верхней части поиска. Это поможет? - person Sachy; 19.12.2014
comment
Этот текст установлен {summary}. Я отредактировал ответ, чтобы включить лучший метод. - person topher; 19.12.2014