Как вызвать функцию модели из значения Yii2 Gridview - PullRequest
0 голосов
/ 06 марта 2020

Я пытаюсь отобразить данные модели в значении столбца GridView, но он продолжает отображать ошибку: Вызов функции-члена getUSD () для строки .
Я хочу отобразить только один данные в этой ячейке данных. Может кто-нибудь знает в чем проблема?

Код модели:

public static function getUSD(){
    $getUSD = Rate::find()
            ->select('rate')
            ->where(['currency_name' => 'USD'])
            ->orderBy('rate_id DESC')
            ->one();
        return $getUSD;
}

Код в GirdView:

<?= GridView::widget([
'dataProvider' => $dataProvider,
'summary' => '',
'columns' => [
    [
        'label' => 'USD',
        'value' => function($model){
            return $model->getUSD();
        }
    ],

Ожидаемый результат:

|USD|  
| 4.102|

Ответы [ 3 ]

0 голосов
/ 06 марта 2020

Проблема в том, что функция getUSD() не возвращает строку, возвращает объект с атрибутом rate.

Для того, чтобы он работал как вы, вы должны непосредственно вернуть значение объект типа:

public static function getUSD(){

    $getUSD = Rate::find()
            ->select('rate')
            ->where(['currency_name' => 'USD'])
            ->orderBy('rate_id DESC')
            ->one();

        return $getUSD ? $getUSD->rate : null;
}

Теперь вы сначала проверяете, нашел ли запрос что-то, и если он что-то нашел, то вы возвращаете свойство rate.

Тогда getUSD - это состояние c метод, поэтому вы не должны делать, как $model->getUsd(), но $model::getUSD().

0 голосов
/ 06 марта 2020

Вы возвращаете объект из функции, а не фактическое значение столбца rate, вместо этого вы должны получить ошибку

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

скорее тот, который вы упоминаете, потому что столбец gridview ожидает, что вы вернете строку, и при попытке отобразить ячейку, используя yii\grid\DataColumn::renderDataCellContent, который вызывает yii\i18n\Formatter для отображения в виде текста, который находит объект вместо этого в вашем случае.

Также вы определили функцию как getter, и yii говорит:

Почти каждый базовый класс в структуре Yii начинается с yii\base\BaseObject или дочернего класса. Это означает, что всякий раз, когда вы видите геттер или сеттер в базовом классе, вы можете использовать его как свойство.

И изменить свою функцию на

public static function getUSD()
{
    $rate = Rate::find()
        ->select('rate')
        ->where(['currency_name' => 'USD'])
        ->orderBy('rate_id DESC')
        ->one();

    return null !== $rate ? $rate->rate : 'NA';
}

И вызвать ее как показано ниже.

echo GridView::widget(
    [
        'dataProvider' => $dataProvider,
        'summary' => '',
        'columns' => [
            [
                'label' => 'USD',
                'value' => function ($model) {
                    return $model->USD;
                },

            ],
        ],
    ]
);

Если вы не хотите sh изменить функцию getUSD(), то вам, возможно, придется проверить ее в сетке, как показано ниже

echo GridView::widget(
    [
        'dataProvider' => $dataProvider,
        'summary' => '',
        'columns' => [
            [
                'label' => 'USD',
                'value' => function ($model) {
                    return null !== $model->USD ? $model->USD->rate: 'NA';
                },

            ],
        ],
    ]
);
0 голосов
/ 06 марта 2020

Если вы обрабатываете одни и те же данные снова и снова в одно и то же время, я бы посоветовал вызывать их не статически и сохранять где-то (между) результаты (например, в свойстве класса), избавляя вас от необходимости слишком много запросов.

Как ответ на ваш вопрос Вы можете назвать его так:

return $model::getUSD()->rate; //Call to a static method from current model

или

return 'USD ' . $model::getUSD()->rate; //Call to a static method from current model

Как опцию, описанную в начале, вы можете сделать так же:

$model = new MyModel();
$rate = MyModel::getUSD()->rate;//get value of current rate

//Gridview

<?= GridView::widget([
'dataProvider' => $dataProvider,
'summary' => '',
'columns' => [
    [
        'label' => 'USD',
        'value' => function($model) use ($rate){
            return 'USD' . $rate; //Your initially stored rate
        }
    ],
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...