Всем привет) Есть модели, например User, contracts, accounts, в моделях нужно динамически создавать и выводить (с фильтрами и сортировками) разные статистические поля, например balance, contracts_count, win_contracts_count и выводить их нужно в разных валютах, например balanceRub, balanceUsd, balanceEur, добавить эти поля в селект можно так
$query->select[] = 'some select AS balanceRub';
$query->select[] = 'some select AS balanceUsd';
$query->select[] = 'some select AS balanceEur';
Разумеется в цикле по валютам. Если поля будут в селекте по ним работают фильтры и прочее, то есть проблема динамического добавления в грид от части решена. Но в классе приходится писать
public balanceRub;
public balanceUsd;
public balanceEur;
и так далее, 100 полей, так как статистических колонок много и надо для каждой валюты свойство делать. Хочется сделать это как-то динамически, в цикле, но без использования dinamicModel, так как много переделывать. Типа перебирать в цикле массив по валютам и формировать свойства модели. На обычном php если попытаться задать значение не существующему свойству проблем не будет, оно создастся, а в yii падает exception, что такого свойства не существует. Помогите найти решение. Массив свойств не предлагать, так как тогда фильтры не будут работать.
Samdark, elisdn может подскажете? Спасибо)
Динамическое создание свойств модели
- Sereja3578
- Сообщения: 204
- Зарегистрирован: 2016.09.21, 11:15
- Контактная информация:
Re: Динамическое создание свойств модели
Перепишите фильтры, чтобы работали с массивом.Sereja3578 писал(а): ↑2019.02.19, 08:49 Массив свойств не предлагать, так как тогда фильтры не будут работать.
Код: Выделить всё
[
'label' => 'Balance ' . $curr,
'attribute' => 'balance.' . $curr,
...
]
Re: Динамическое создание свойств модели
А в Yii необычный PHP что ли?)
Exception бросают методы __set() и __get() класса Component
Если вам точно нужны свойства, то записываете все в массив и перекрываете метод __get()
Тогда свойства будут доступны на чтение через $model->property
Exception бросают методы __set() и __get() класса Component
Если вам точно нужны свойства, то записываете все в массив и перекрываете метод __get()
Код: Выделить всё
public function __get($name)
{
if ($name === 'Наше св-во') {
return значение_из_массива или null;
} else {
return parent::__get($name);
}
}
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.