ну вы сделали проще, но функционал не покрылиmj4444 писал(а):Ну данный вариант пересекается со стандартным геттером свойства, я решил не мудрить и сделать прощеzelenin писал(а):Код: Выделить всё
public static function getStatus($id = null) { $statuses = [ self::STATUS_ACTIVE => Module::t('Active'), self::STATUS_INACTIVE => Module::t('Inactive'), self::STATUS_BANNED => Module::t('Banned') ]; if ($id !== null) { return ArrayHelper::getValue($statuses, $id, null); } return $statuses; }
Код: Выделить всё
const OPERATION_ADD = 'add'; const OPERATION_DEDUCTION = 'deduction'; const OPERATION__VALUES = ['add', 'deduction'];
Авто-генерируемые модели в виде 2 файлов ActiveRecord
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
Это уже частный случай локализации...zelenin писал(а):ну вы сделали проще, но функционал не покрыли
Сейчас сделал в виде функции
Код: Выделить всё
public function enumValues($field = null)
{
$consts = [
'operation' => [self::OPERATION_ADD, self::OPERATION_DEDUCTION, self::OPERATION_CORRECTION]
];
if (is_null($field)) {
return $consts;
}
return isset($const[$field]) ? $const[$field] : [];
}
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
return isset($const[$field]) ? $const[$field] : [];
передавать массив не имеет смысла, т.к. если не isset, то это ошибка. throw new
передавать массив не имеет смысла, т.к. если не isset, то это ошибка. throw new
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
да я думал над этим и решил что это было бы неплохо сделать опциональным, но пока не добрался до этого...zelenin писал(а):return isset($const[$field]) ? $const[$field] : [];
передавать массив не имеет смысла, т.к. если не isset, то это ошибка. throw new
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
разработчик сразу должен узнать, что у него ошибка. Опциональным это будет, если нужно, с помощью try catchmj4444 писал(а):да я думал над этим и решил что это было бы неплохо сделать опциональным, но пока не добрался до этого...zelenin писал(а):return isset($const[$field]) ? $const[$field] : [];
передавать массив не имеет смысла, т.к. если не isset, то это ошибка. throw new
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
зачем выдумывать если выше предложен отличный вариант, который сразу решает много задач:
1) получения массива констант, который можно использовать
а) в валидации
б) в формах (<select>-ы)
2) получение текстового представление константы (с добавленной возможностью перевода), можно использовать
а) в обычных view-ах
в) в grid\listView
и так далее.
Кстати в вашем варианты что в БД хранится будет? текст "deduction" или номер попорядку от сюда?
1) получения массива констант, который можно использовать
а) в валидации
б) в формах (<select>-ы)
2) получение текстового представление константы (с добавленной возможностью перевода), можно использовать
а) в обычных view-ах
в) в grid\listView
и так далее.
Кстати в вашем варианты что в БД хранится будет? текст "deduction" или номер попорядку от сюда?
Код: Выделить всё
'operation' => [self::OPERATION_ADD, self::OPERATION_DEDUCTION, self::OPERATION_CORRECTION]
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
А на рабочей копии? Возможно пусть где то не будет выбора, чем совсем всё сломается...zelenin писал(а):разработчик сразу должен узнать, что у него ошибка. Опциональным это будет, если нужно, с помощью try catchmj4444 писал(а):да я думал над этим и решил что это было бы неплохо сделать опциональным, но пока не добрался до этого...zelenin писал(а):return isset($const[$field]) ? $const[$field] : [];
передавать массив не имеет смысла, т.к. если не isset, то это ошибка. throw new
Хотя думаю вы всё же правы...
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
Подготовка данных для отображения дело не модели... Модель просто данные отдаёт в чистом виде... А этим могут заняться хелперы всякие...S c писал(а):зачем выдумывать если выше предложен отличный вариант, который сразу решает много задач:
1) получения массива констант, который можно использовать
а) в валидации
б) в формах (<select>-ы)
2) получение текстового представление константы (с добавленной возможностью перевода), можно использовать
а) в обычных view-ах
в) в grid\listView
и так далее.
Кстати в вашем варианты что в БД хранится будет? текст "deduction" или номер попорядку от сюда?Код: Выделить всё
'operation' => [self::OPERATION_ADD, self::OPERATION_DEDUCTION, self::OPERATION_CORRECTION]
PS: На счёт того что будет в БД храниться: А вы вообще понимаете что такое поля енум и сет в базе данных? Их хранение - забота БД и для нас это значения не имеет...
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
на проде выйдет красиво оформленная ошибка например: Ошибка в выводе статусов, или Код ошибки 514, сообщите администрации сайта, или.... В общем пусть ломается сейчас, чтобы не ломалось постоянно без вашего ведома.mj4444 писал(а):А на рабочей копии? Возможно пусть где то не будет выбора, чем совсем всё сломается......
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
Хватит умничать. Я задал простой вопрос - либо давайте ответ, либо просто проигнорируйте. Я хочу увидеть ваше ведение всей законченной "картины"PS: На счёт того что будет в БД храниться: А вы вообще понимаете что такое поля енум и сет в базе данных? Их хранение - забота БД и для нас это значения не имеет...
отдать массив типа array(0 => 'Deleted', 1 => 'Active') для модели как по мне - нормальное поведениеПодготовка данных для отображения дело не модели... Модель просто данные отдаёт в чистом виде... А этим могут заняться хелперы всякие...
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
тут вы правы в целом. но тогда и валидацией должны заниматься не модели, и методы attributeLabels и attributeHints надо вынести в другой слой, а они являются полными аналогами предложенного метода getStatus.mj4444 писал(а): Подготовка данных для отображения дело не модели... Модель просто данные отдаёт в чистом виде... А этим могут заняться хелперы всякие...
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
в sql передаются строковые идентификаторы...S c писал(а):Хватит умничать. Я задал простой вопрос - либо давайте ответ, либо просто проигнорируйте. Я хочу увидеть ваше ведение всей законченной "картины"PS: На счёт того что будет в БД храниться: А вы вообще понимаете что такое поля енум и сет в базе данных? Их хранение - забота БД и для нас это значения не имеет...
отдать массив типа array(0 => 'Deleted', 1 => 'Active') для модели как по мне - нормальное поведениеПодготовка данных для отображения дело не модели... Модель просто данные отдаёт в чистом виде... А этим могут заняться хелперы всякие...
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
вы правы... переделаю по аналогии с attributeLabels...zelenin писал(а):тут вы правы в целом. но тогда и валидацией должны заниматься не модели, и методы attributeLabels и attributeHints надо вынести в другой слой, а они являются полными аналогами предложенного метода getStatus.mj4444 писал(а): Подготовка данных для отображения дело не модели... Модель просто данные отдаёт в чистом виде... А этим могут заняться хелперы всякие...
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
Получилось как то так
Код: Выделить всё
public function attributeEnumLabels()
{
return [
'operation' => [
'add' => Yii::t('app', 'Add')
'deduction' => Yii::t('app', 'Deduction')
'correction' => Yii::t('app', 'Correction')
],
];
}
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
Я не ради флейма. Я почему уточнял что в вашем варианте в БД хранится - я просто привык\люблю\считаю правильным хранить числовой идентификатор для подобных вещей. В int-овом поле (уменьшенном, например tiny\small Int (3)). Где только не работал - везде были споры на тему - число в инт поле, либо идентификатор в енум\сет полях. И для меня самый удобный вариант, предложенный ранее
так же еще его можно дополнить параметром - $keysOnly - при нужде выводить только ключи (в нашем случае валидный перечень статусов) и использовать массив ключей для валидации. Но обычно чтоб не нагружать функцию параметрами использую array_keys() для результата функции.
Код: Выделить всё
public static function getStatus($id = null)
{
$statuses = [
self::STATUS_ACTIVE => Module::t('Active'),
self::STATUS_INACTIVE => Module::t('Inactive'),
self::STATUS_BANNED => Module::t('Banned')
];
if ($id !== null) {
return ArrayHelper::getValue($statuses, $id, null);
}
return $statuses;
}
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
кстати еще бывают ситуации, когда в зависимости от ситуации используются не все а только определенные статусы (админ редактирует новость или обычный редактор?). Это всё я к тому, что это всё лучше и правильнее делать руками сразу. Валидацию автогенерируемую толковую не сделаешь, увы.
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
я честно говоря даже не стал комментировать предыдущий вариант. Я уже слишком много здесь прокомментировал, а автор поста далек от правил хорошего тона, принятых в большинстве приложений, чтобы в очередной раз переубеждать. Пройдет время - сам научится.S c писал(а):Я не ради флейма. Я почему уточнял что в вашем варианте в БД хранится - я просто привык\люблю\считаю правильным хранить числовой идентификатор для подобных вещей. В int-овом поле (уменьшенном, например tiny\small Int (3)). Где только не работал - везде были споры на тему - число в инт поле, либо идентификатор в енум\сет полях. И для меня самый удобный вариант, предложенный ранеетак же еще его можно дополнить параметром - $keysOnly - при нужде выводить только ключи (в нашем случае валидный перечень статусов) и использовать массив ключей для валидации. Но обычно чтоб не нагружать функцию параметрами использую array_keys() для результата функции.Код: Выделить всё
public static function getStatus($id = null) { $statuses = [ self::STATUS_ACTIVE => Module::t('Active'), self::STATUS_INACTIVE => Module::t('Inactive'), self::STATUS_BANNED => Module::t('Banned') ]; if ($id !== null) { return ArrayHelper::getValue($statuses, $id, null); } return $statuses; }
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
как показывает практика удобнее хранить под будущее, вдруг ты захочешь перевести статусы в справочники и создать моделькуS c писал(а):Я не ради флейма. Я почему уточнял что в вашем варианте в БД хранится - я просто привык\люблю\считаю правильным хранить числовой идентификатор для подобных вещей. В int-овом поле (уменьшенном, например tiny\small Int (3)). Где только не работал - везде были споры на тему - число в инт поле, либо идентификатор в енум\сет полях. И для меня самый удобный вариант, предложенный ранеетак же еще его можно дополнить параметром - $keysOnly - при нужде выводить только ключи (в нашем случае валидный перечень статусов) и использовать массив ключей для валидации. Но обычно чтоб не нагружать функцию параметрами использую array_keys() для результата функции.Код: Выделить всё
public static function getStatus($id = null) { $statuses = [ self::STATUS_ACTIVE => Module::t('Active'), self::STATUS_INACTIVE => Module::t('Inactive'), self::STATUS_BANNED => Module::t('Banned') ]; if ($id !== null) { return ArrayHelper::getValue($statuses, $id, null); } return $statuses; }
Код: Выделить всё
interface UserStatusInterface
{
public static function getStatusLabels();
public function getStatusLabel();
}
class User
{
public static function getStatusLabels()
{
return UserStatus::find()->select(['name', 'id'])->indexBy('id')->column();
}
public function getStatusRel()
{
return $this->hasOne(UserStatus::classname(), ['id' => 'status']);
}
public function getStatusLabel()
{
return $this->statusRel->name;
}
}
Последний раз редактировалось lynicidn 2015.06.12, 00:20, всего редактировалось 4 раза.
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
+parent::fields() + ['status' => 'statusLabel']
Код: Выделить всё
//grid:
[
'attribute' => 'status'
'value' => 'statusLabel'
]
//detail:
[
'attribute' => 'status'
'value' => $model->statusLabel
]
Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord
+ $form->field($model, 'status')->dropDownList($model->statusLabels);