fuction() не работает в Detailview yii2

Когда я собираюсь показать сведения о пользователе в Detailview, он выдает:

htmlspecialchars() ожидает, что параметр 1 будет строкой, заданный объект

Ниже мой код для Detailview:

view.php

        <?= DetailView::widget([
                'model' => $model,
                'attributes' => [
                    'userID',
                    'userEmail:email',
                    'userName',
                    'userMobile',
                    'userBirthDate',
                    'userGender',
                    [
                      'attribute' => 'interestName',
                      'format' => 'raw',
                      'label' => 'Interest',
                      'value' => $model->getUserinterest(),
                    ],
                      'userStatus',
                      'userType',
                ],
         ]); 

 ?>

 function getUserinterest() { 
           foreach ($model->userinterest as $userinterest) {
                $interestNames[] = $userinterest->interestName;
            }
        return implode("\n", $interestNames);
    }

person Akkie    schedule 18.01.2017    source источник
comment
Какая у вас версия Yii2?   -  person Yupik    schedule 18.01.2017
comment
Версия Yii2: 2.0.10   -  person Akkie    schedule 18.01.2017


Ответы (2)


Начиная с версии 2.0.11 value можно определить как закрытие. Обновите версию Yii до версии для разработчиков 2.0.11+, и она будет работать.

person Yupik    schedule 18.01.2017
comment
Это еще не стабильная версия. Я проверил это на github, 90% работы было сделано для выпуска. ссылка - person Akkie; 18.01.2017
comment
Это правда, поэтому я сказал версию для разработчиков :) - person Yupik; 18.01.2017
comment
Есть ли другой способ? - person Akkie; 18.01.2017
comment
1. Дождитесь официального релиза 2.0.11 2. Не используйте закрытие, создайте функцию в модели и используйте ее как 'value' => $model->getMyBlaBla() или 'value' => $model->myBlaBla, если вы назвали функцию getMyBlaBla(). - person Yupik; 18.01.2017
comment
Отредактировал мой код, как вы говорите, теперь он выдает: Объект класса yii\db\ActiveQuery не может быть преобразован в строку - person Akkie; 18.01.2017
comment
getUserinterest() находится в вашей модели или файле представления? - person Yupik; 18.01.2017
comment
Я использую концепцию соединительной таблицы, которую я получил из модели, и я хочу показать ее в подробном представлении, а также в виде сетки. Я сделал с gridview. Теперь я хочу показать это в подробностях. Метод Useinterest уже существует в модели. - person Akkie; 18.01.2017
comment
Вот почему у вас есть такое исключение .... Поместите его в модель с другим именем, на самом деле вы пытаетесь отобразить свое отношение в DetailView. Рассматриваемая функция ничего вам не даст. - person Yupik; 18.01.2017
comment
Именно то, что я сказал: создайте функцию в модели: public function getMyBlaBla() { foreach ($this->userinterest as $userinterest) { $interestNames[] = $userinterest->interestName; } return implode("\n", $interestNames); }, а затем используйте ее в DetailView 'value' => $model->myBlaBla, - person Yupik; 18.01.2017
comment
Большое спасибо за вашу идею, я сделал это по-другому. - person Akkie; 19.01.2017
comment
Можешь поделиться как ты это сделал? - person Yupik; 19.01.2017
comment
Я дал решение, пожалуйста, следуйте ему. - person Akkie; 19.01.2017

Следуйте окончательному ответу, как показано ниже:

view.php

 <?= DetailView::widget([
        'model' => $model,
        'attributes' => [
            'userID',
            'userEmail:email',
            'userName',
            'userMobile',
            'userBirthDate',
            'userGender',
            [
                'attribute' => 'interestName',
                'format' => 'raw',
                'label' => 'Interest',
                'value' => $model->getviewinterest(),
            ],
           'userStatus',
           'userType',
        ],
    ]); 

 ?>

Users.php(Модель)

public function getviewinterest() 
    { 
        foreach ($this->userinterest as $userinterest)
            { 
                $interestNames[] = $userinterest->interestName; 

            } 

            if(!empty($interestNames)){
                return implode("<br/>", $interestNames);
            }else{
                return "(not set)";
            }
    }
person Akkie    schedule 19.01.2017
comment
@Yupik Следуйте этому окончательному решению - person Akkie; 19.01.2017
comment
хорошо, как вы говорите. Он отлично работает как по вашему методу, так и по моему методу. - person Akkie; 19.01.2017
comment
Пожалуйста, не используйте фреймворк, если ваш метод вам подходит. Как насчет дополнительных SQL-запросов в вашем методе? Как насчет памяти? Как насчет 16 строк бесполезного кода? Вам платят за строки кода? - person Yupik; 19.01.2017