FindAll и CGridView без foreach???

Обсуждение документации. Переводы Cookbook и авторские рецепты.
Reinchold
Сообщения: 48
Зарегистрирован: 2013.01.17, 02:19

FindAll и CGridView без foreach???

Сообщение Reinchold »

Доброго времени суток!!!
меня очень интересует, возможно ли перебрать массив в Yii без foreach в модуле, так, чтобы он в CGridView отобразился не как Array(), а вывел как надо...
Выборка вся готова, print_r() показывает всё правильно, как и задумывал.
Вот модель:

Код: Выделить всё

        public function renderStudentName($data=null,$row=0)
        {   
            $result = Student::model()->findAll('tutor_id=:postID', array(':postID'=>$data->id));
            foreach ($result as $item){
                echo $item->user->name . ', ' . $item->user->surname . ' <br> ';
            }
        }
Вот вид:

Код: Выделить всё

<?php
    $this->widget('zii.widgets.grid.CGridView', array(
    //'id'=>'school-grid',
    'dataProvider'=> Tutor::model()->search(),
    'filter'=> Tutor::model()->model(),
    'columns'=>array(
           'id',
                array('name'=>'user_search_name',     'value'=>array($model,'renderName')),
                array('name'=>'user_search_surname',   'value'=>array($model,'renderSurname')),
                array('name'=>'school_name',                         'value'=>array($model,'renderSchoolName')),
                array('name'=>'student',                             'value'=>array($model,"renderStudentName")), // как то здесь надо это сделать...
    ),
)); ?>
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: FindAll и CGridView без foreach???

Сообщение lancecoder »

'value'=>function($data){
return $data->id.','.$data->some.'<br />';
}
Reinchold
Сообщения: 48
Зарегистрирован: 2013.01.17, 02:19

Re: FindAll и CGridView без foreach???

Сообщение Reinchold »

'value'=>function($data){
return $data->id.','.$data->some.'<br />';
}
Спасибо за ответ, очень ждал, чтобы получить ответ!
можно пожалуйста попдробней объяснить, как в моём случае это использовать.
В модуле я сделал так:

Код: Выделить всё

        public function renderStudentName($data=null,$row=0)
        {   
            $result = Student::model()->findAll('tutor_id=:postID', array(':postID'=>$data->id));
            return $result;
        }
а вот с видом возникают проблемы...
я же там использую дополнительную таблицу из другого модуля,
как это в этом видно:

Код: Выделить всё

'dataProvider'=> Tutor::model()->search(),
я пытаюсь чтото наподобие этого сделать:

Код: Выделить всё

array('name'=>'student',                             'value'=>function($data){return $data->user->name.','.$data->user->surname.'<br />';})
но ежу понятно, что не получится...
как мне до этой функции в модели добраться: "renderStudentName" ???
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: FindAll и CGridView без foreach???

Сообщение Nafania »

видимо 'value' => '$data->renderStudentName()'
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: FindAll и CGridView без foreach???

Сообщение yan »

сделайте в Tutor релейшн

Код: Выделить всё

            'students' => array(self::HAS_MANY, 'Student', 'tutor_id'),
и во вьюхе

Код: Выделить всё

$fnStudents =function($data){ foreach ($data->students as $item){echo $item->user->name . ', ' . $item->user->surname . ' <br> ';  }}
...
'value'=>fnStudents 
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: FindAll и CGridView без foreach???

Сообщение yan »

Reinchold писал(а):

Код: Выделить всё

                array('name'=>'user_search_name',     'value'=>array($model,'renderName')),
 
где такой вариант описания столбцов в гриде нашли? не разу не встречал, да и смысла не понимаю
Reinchold
Сообщения: 48
Зарегистрирован: 2013.01.17, 02:19

Re: FindAll и CGridView без foreach???

Сообщение Reinchold »

Что именно не понятно? name или value???
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: FindAll и CGridView без foreach???

Сообщение rak »

Reinchold писал(а):Что именно не понятно? name или value???

Код: Выделить всё

 'value'=>array($model,'renderName')),
 
это откуда?
нужно так

Код: Выделить всё

 'value'=>'$data->renderName',
 
rak
Сообщения: 2181
Зарегистрирован: 2010.11.02, 23:40
Контактная информация:

Re: FindAll и CGridView без foreach???

Сообщение rak »

Короче говоря вот:

Код: Выделить всё

        public function renderStudentName($separator = '<br>')
        {   
            $result = array();
            $items = Student::model()->findAll('tutor_id=:postID', array(':postID'=>$this->id));
            foreach ($items as $item){
                $result[] =  $item->user->name . ', ' . $item->user->surname;
            }
            return implode($separator, $result);
        }

Код: Выделить всё

<?php
    $this->widget('zii.widgets.grid.CGridView', array(
    //'id'=>'school-grid',
    'dataProvider'=> Tutor::model()->search(),
    'filter'=> Tutor::model()->model(),
    'columns'=>array(
           'id',
           'user_search_name'
                array('name'=>'user_search_name',     'value'=>'$data->user_search_name'),
                array('name'=>'user_search_surname',     'value'=>'$data->user_search_surname'),
                array('name'=>'school_name',     'value'=>'$data->school_name'),
                array('name'=>'student',    'value'=> '$data->renderStudentName()'),
    ),
)); ?>
Аватара пользователя
lancecoder
Сообщения: 2532
Зарегистрирован: 2012.06.26, 17:16

Re: FindAll и CGridView без foreach???

Сообщение lancecoder »

или так

Код: Выделить всё

array('name'=>'student',    'value'=>function($data)
        {   
            $result = array();
            if (!($items = Student::model()->findAll('tutor_id=:postID', array(':postID'=>$data->id))) return ;
            foreach ($items as $item){
                $result[] =  $item->user->name . ', ' . $item->user->surname;
            }
            return implode('<br />', $result);
        }), 
а вообще вот это наверно лучше вынести в relation Student::model()->findAll('tutor_id=:postID', array(':postID'=>$data->id)
Reinchold
Сообщения: 48
Зарегистрирован: 2013.01.17, 02:19

Re: FindAll и CGridView без foreach???

Сообщение Reinchold »

rak писал(а):
Reinchold писал(а):Что именно не понятно? name или value???

Код: Выделить всё

 'value'=>array($model,'renderName')),
 
это откуда?
нужно так

Код: Выделить всё

 'value'=>'$data->renderName',
 
Спасибо за поправку!

Попробовал так " 'value'=>'$data->renderName', ", к сожалению не работает таким образом.
Последний раз редактировалось Reinchold 2013.03.19, 18:04, всего редактировалось 1 раз.
Reinchold
Сообщения: 48
Зарегистрирован: 2013.01.17, 02:19

Re: FindAll и CGridView без foreach???

Сообщение Reinchold »

lancecoder писал(а):или так

Код: Выделить всё

array('name'=>'student',    'value'=>function($data)
        {   
            $result = array();
            if (!($items = Student::model()->findAll('tutor_id=:postID', array(':postID'=>$data->id))) return ;
            foreach ($items as $item){
                $result[] =  $item->user->name . ', ' . $item->user->surname;
            }
            return implode('<br />', $result);
        }), 
а вообще вот это наверно лучше вынести в relation Student::model()->findAll('tutor_id=:postID', array(':postID'=>$data->id)
а можно ли здесь свою таблицу встроить? вроде этого:

Код: Выделить всё

            
array('name'=>'student',    'value'=>function($data)
        { 
            $result = array();
            if (!($items = Student::model()->findAll('tutor_id=:postID', array(':postID'=>$data->id)))) return ;
            echo "<table>";
            foreach ($items as $item){
                echo "<tr><td>";
                $result[] = $item->user->name . ', ' . $item->user->surname;
                echo "</td></tr>";
            }
            echo "</table>";
            return implode('; ', $result);
        }),
у меня почему то не получается, туда суда покидал, всё путается, подскажите пож.
Reinchold
Сообщения: 48
Зарегистрирован: 2013.01.17, 02:19

Re: FindAll и CGridView без foreach???

Сообщение Reinchold »

И ещё одно, почему когда я хочу убрать в return функцию implode(), и сделать так:

Код: Выделить всё

return $result; 
выбивает эту штуку:
htmlspecialchars() expects parameter 1 to be string, array given
...
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: FindAll и CGridView без foreach???

Сообщение anton44eg »

потому что вы возвращаете массив, а должны строку
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: FindAll и CGridView без foreach???

Сообщение Nafania »

А зачем вы делаете echo и return? Чего вы ожидаете от такого решения?
htmlspecialchars() expects parameter 1 to be string, array given
http://www.yiiframework.com/doc/api/1.1 ... lue-detail
Тип string, а вы пытаетесь массив подсунуть.
Reinchold
Сообщения: 48
Зарегистрирован: 2013.01.17, 02:19

Re: FindAll и CGridView без foreach???

Сообщение Reinchold »

Nafania писал(а):А зачем вы делаете echo и return? Чего вы ожидаете от такого решения?
htmlspecialchars() expects parameter 1 to be string, array given
http://www.yiiframework.com/doc/api/1.1 ... lue-detail
Тип string, а вы пытаетесь массив подсунуть.
Я написал сверху, что пытаюсь сделать дополнительную таблицу, можно сказать в таблице от
CGridView будет моя дополнительная таблица.
к примеру имя учителя и напротив может куча учеников выводиться...
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: FindAll и CGridView без foreach???

Сообщение anton44eg »

так возвращайте из функции html
Reinchold
Сообщения: 48
Зарегистрирован: 2013.01.17, 02:19

Re: FindAll и CGridView без foreach???

Сообщение Reinchold »

anton44eg писал(а):так возвращайте из функции html
В смысле без return, просто всё с echo вывести?
Аватара пользователя
anton44eg
Сообщения: 2716
Зарегистрирован: 2012.01.25, 13:37
Откуда: Киев

Re: FindAll и CGridView без foreach???

Сообщение anton44eg »

вы возврат функции от вывода отличаете?
Nafania
Сообщения: 1227
Зарегистрирован: 2011.01.31, 13:12

Re: FindAll и CGridView без foreach???

Сообщение Nafania »

Reinchold писал(а):
anton44eg писал(а):так возвращайте из функции html
В смысле без return, просто всё с echo вывести?
Наоборот. Конкатенация и return в конце.
anton44eg писал(а):вы возврат функции от вывода отличаете?
Судя по коду - нет.
Ответить