2012-12-14 3 views
0

У меня есть следующая таблица:Yii отображать несколько Дочерние элементы как ссылки в CGridView поле

CREATE TABLE "place" (
    "id" int8 NOT NULL DEFAULT nextval('place_id_seq'::regclass), 
    "name" varchar(128) NOT NULL, 
    "parent" int8, 
    "description" varchar(100) 
) 
WITH (OIDS=FALSE); 

(это PostgreSQL, но это не должно быть уместным здесь)

Я создал CRUD через giix и немного изменили отношения, соответствующие моим потребностям. Так что я закончил с:

public function relations() { 
    return array(
     'parent0' => array(self::BELONGS_TO, 'Places', 'parent'), 
     'places' => array(self::HAS_MANY, 'Places', 'parent'), 
    ); 
} 

Цель здесь состоит в том, что это место может принадлежать к другому месту и иметь несколько детей мест.

Моя проблема заключается в том, что мне нужно изменить действие администратора, чтобы соответствовать следующей сетке: Print manipulated by the inspector to reflect the desired behaviour

Печать манипулируют инспектором, чтобы отразить желаемое поведение

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

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'places-grid', 
    'dataProvider' => new CActiveDataProvider('Places', array('id'=>$model->places)), 
    'filter' => $model, 
    'columns' => array(
     array(
       'name'=>'parent', 
       'value'=>'GxHtml::valueEx($data->parent0)', 
       'filter'=>GxHtml::listDataEx(Places::model()->findAllAttributes(null, true)), 
       ), 
     'name', 
     'places', 
     array(
      'class' => 'CButtonColumn', 
     ), 
    ), 
)); 

Но это, как и следовало ожидать, прошлифованную ошибка:

htmlspecialchars() expects parameter 1 to be string, array given

Кроме того, я не знаю, это будет даже работать со встроенным быстрый поиск.

Не могли бы вы любезно указать мне правильное направление здесь?

+0

все ваши вопросы уже есть решения здесь на кого-н, обрабатывать их по одному за раз, первым сделать фильтр правильно отображаться, а затем пойти сделать поисковую работу, то ссылку. используйте s.o. поиск, и вы найдете ответы. –

ответ

1

После долгих поисков я нашел способ решить свою проблему. Не уверен, что это лучший способ, но он хорошо работает:

$this->widget('zii.widgets.grid.CGridView', array(
    'id' => 'places-grid', 
    'dataProvider' => new CActiveDataProvider('Places', array('id'=>$model->places)), 
    'filter' => $model, 
    'columns' => array(
     array(
       'name'=>'parent', 
       'value'=>'GxHtml::valueEx($data->parent0)', 
       'filter'=>GxHtml::listDataEx(Places::model()->findAllAttributes(null, true)), 
       ), 
     'name', 
     array(
     'header'=>'Children', 
     'type'=>'html', 
       'value'=> function($data) { 
        $placesLinks = array(); 
        foreach ($data->places as $place) { 
         $placesLinks[] = GxHtml::link(GxHtml::encode(GxHtml::valueEx($place, 'name')), array('places/view', 'id' => GxActiveRecord::extractPkValue($place, true))); 
        } 
        return implode(', ', $placesLinks); 
       } 
     ), 
     array(
      'class' => 'CButtonColumn', 
     ), 
    ), 
)); 

Это использует Giix. Если вы не используете это, вам придется соответствующим образом изменить создание ссылок.

Приветствия

+0

хорошо, что у вас есть собственное решение, работающее, для поиска см. [Здесь] (http://stackoverflow.com/a/4865411/720508) –

Смежные вопросы