Авто-генерируемые модели в виде 2 файлов ActiveRecord

Выкладываем свои наработки
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение zelenin » 2015.06.09, 19:44

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'];
ну вы сделали проще, но функционал не покрыли

mj4444
Сообщения: 25
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 » 2015.06.10, 12:39

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] : [];
    } 
Дальше уже ваше дело как транслировать названия...

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение zelenin » 2015.06.10, 12:43

return isset($const[$field]) ? $const[$field] : [];
передавать массив не имеет смысла, т.к. если не isset, то это ошибка. throw new

mj4444
Сообщения: 25
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 » 2015.06.10, 14:09

zelenin писал(а):return isset($const[$field]) ? $const[$field] : [];
передавать массив не имеет смысла, т.к. если не isset, то это ошибка. throw new
да я думал над этим и решил что это было бы неплохо сделать опциональным, но пока не добрался до этого...

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение zelenin » 2015.06.10, 14:22

mj4444 писал(а):
zelenin писал(а):return isset($const[$field]) ? $const[$field] : [];
передавать массив не имеет смысла, т.к. если не isset, то это ошибка. throw new
да я думал над этим и решил что это было бы неплохо сделать опциональным, но пока не добрался до этого...
разработчик сразу должен узнать, что у него ошибка. Опциональным это будет, если нужно, с помощью try catch

Аватара пользователя
S c
Сообщения: 875
Зарегистрирован: 2012.04.11, 14:46

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение S c » 2015.06.10, 14:23

зачем выдумывать если выше предложен отличный вариант, который сразу решает много задач:
1) получения массива констант, который можно использовать
а) в валидации
б) в формах (<select>-ы)
2) получение текстового представление константы (с добавленной возможностью перевода), можно использовать
а) в обычных view-ах
в) в grid\listView
и так далее.

Кстати в вашем варианты что в БД хранится будет? текст "deduction" или номер попорядку от сюда?

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

'operation' => [self::OPERATION_ADD, self::OPERATION_DEDUCTION, self::OPERATION_CORRECTION] 

mj4444
Сообщения: 25
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 » 2015.06.10, 15:27

zelenin писал(а):
mj4444 писал(а):
zelenin писал(а):return isset($const[$field]) ? $const[$field] : [];
передавать массив не имеет смысла, т.к. если не isset, то это ошибка. throw new
да я думал над этим и решил что это было бы неплохо сделать опциональным, но пока не добрался до этого...
разработчик сразу должен узнать, что у него ошибка. Опциональным это будет, если нужно, с помощью try catch
А на рабочей копии? Возможно пусть где то не будет выбора, чем совсем всё сломается...
Хотя думаю вы всё же правы...

mj4444
Сообщения: 25
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 » 2015.06.10, 15:35

S c писал(а):зачем выдумывать если выше предложен отличный вариант, который сразу решает много задач:
1) получения массива констант, который можно использовать
а) в валидации
б) в формах (<select>-ы)
2) получение текстового представление константы (с добавленной возможностью перевода), можно использовать
а) в обычных view-ах
в) в grid\listView
и так далее.

Кстати в вашем варианты что в БД хранится будет? текст "deduction" или номер попорядку от сюда?

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

'operation' => [self::OPERATION_ADD, self::OPERATION_DEDUCTION, self::OPERATION_CORRECTION]
Подготовка данных для отображения дело не модели... Модель просто данные отдаёт в чистом виде... А этим могут заняться хелперы всякие...

PS: На счёт того что будет в БД храниться: А вы вообще понимаете что такое поля енум и сет в базе данных? Их хранение - забота БД и для нас это значения не имеет...

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение zelenin » 2015.06.10, 15:40

mj4444 писал(а):А на рабочей копии? Возможно пусть где то не будет выбора, чем совсем всё сломается......
на проде выйдет красиво оформленная ошибка например: Ошибка в выводе статусов, или Код ошибки 514, сообщите администрации сайта, или.... В общем пусть ломается сейчас, чтобы не ломалось постоянно без вашего ведома.

Аватара пользователя
S c
Сообщения: 875
Зарегистрирован: 2012.04.11, 14:46

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение S c » 2015.06.10, 20:49

PS: На счёт того что будет в БД храниться: А вы вообще понимаете что такое поля енум и сет в базе данных? Их хранение - забота БД и для нас это значения не имеет...
Хватит умничать. Я задал простой вопрос - либо давайте ответ, либо просто проигнорируйте. Я хочу увидеть ваше ведение всей законченной "картины"
Подготовка данных для отображения дело не модели... Модель просто данные отдаёт в чистом виде... А этим могут заняться хелперы всякие...
отдать массив типа array(0 => 'Deleted', 1 => 'Active') для модели как по мне - нормальное поведение

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение zelenin » 2015.06.10, 21:10

mj4444 писал(а): Подготовка данных для отображения дело не модели... Модель просто данные отдаёт в чистом виде... А этим могут заняться хелперы всякие...
тут вы правы в целом. но тогда и валидацией должны заниматься не модели, и методы attributeLabels и attributeHints надо вынести в другой слой, а они являются полными аналогами предложенного метода getStatus.

mj4444
Сообщения: 25
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 » 2015.06.11, 17:33

S c писал(а):
PS: На счёт того что будет в БД храниться: А вы вообще понимаете что такое поля енум и сет в базе данных? Их хранение - забота БД и для нас это значения не имеет...
Хватит умничать. Я задал простой вопрос - либо давайте ответ, либо просто проигнорируйте. Я хочу увидеть ваше ведение всей законченной "картины"
Подготовка данных для отображения дело не модели... Модель просто данные отдаёт в чистом виде... А этим могут заняться хелперы всякие...
отдать массив типа array(0 => 'Deleted', 1 => 'Active') для модели как по мне - нормальное поведение
в sql передаются строковые идентификаторы...

mj4444
Сообщения: 25
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 » 2015.06.11, 17:34

zelenin писал(а):
mj4444 писал(а): Подготовка данных для отображения дело не модели... Модель просто данные отдаёт в чистом виде... А этим могут заняться хелперы всякие...
тут вы правы в целом. но тогда и валидацией должны заниматься не модели, и методы attributeLabels и attributeHints надо вынести в другой слой, а они являются полными аналогами предложенного метода getStatus.
вы правы... переделаю по аналогии с attributeLabels...

mj4444
Сообщения: 25
Зарегистрирован: 2015.06.08, 19:56

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение mj4444 » 2015.06.11, 19:20

Получилось как то так

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

    public function attributeEnumLabels()
    {
        return [
            'operation' => [
                'add' => Yii::t('app', 'Add')
                'deduction' => Yii::t('app', 'Deduction')
                'correction' => Yii::t('app', 'Correction')
            ],
        ];
    } 

Аватара пользователя
S c
Сообщения: 875
Зарегистрирован: 2012.04.11, 14:46

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение S c » 2015.06.11, 20:16

Я не ради флейма. Я почему уточнял что в вашем варианте в БД хранится - я просто привык\люблю\считаю правильным хранить числовой идентификатор для подобных вещей. В int-овом поле (уменьшенном, например tiny\small Int (3)). Где только не работал - везде были споры на тему - число в инт поле, либо идентификатор в енум\сет полях. И для меня самый удобный вариант, предложенный ранее

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

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;
    }  
так же еще его можно дополнить параметром - $keysOnly - при нужде выводить только ключи (в нашем случае валидный перечень статусов) и использовать массив ключей для валидации. Но обычно чтоб не нагружать функцию параметрами использую array_keys() для результата функции.

Аватара пользователя
S c
Сообщения: 875
Зарегистрирован: 2012.04.11, 14:46

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение S c » 2015.06.11, 20:19

кстати еще бывают ситуации, когда в зависимости от ситуации используются не все а только определенные статусы (админ редактирует новость или обычный редактор?). Это всё я к тому, что это всё лучше и правильнее делать руками сразу. Валидацию автогенерируемую толковую не сделаешь, увы.

zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение zelenin » 2015.06.11, 20:19

S c писал(а):Я не ради флейма. Я почему уточнял что в вашем варианте в БД хранится - я просто привык\люблю\считаю правильным хранить числовой идентификатор для подобных вещей. В int-овом поле (уменьшенном, например tiny\small Int (3)). Где только не работал - везде были споры на тему - число в инт поле, либо идентификатор в енум\сет полях. И для меня самый удобный вариант, предложенный ранее

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

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;
    } 
так же еще его можно дополнить параметром - $keysOnly - при нужде выводить только ключи (в нашем случае валидный перечень статусов) и использовать массив ключей для валидации. Но обычно чтоб не нагружать функцию параметрами использую array_keys() для результата функции.
я честно говоря даже не стал комментировать предыдущий вариант. Я уже слишком много здесь прокомментировал, а автор поста далек от правил хорошего тона, принятых в большинстве приложений, чтобы в очередной раз переубеждать. Пройдет время - сам научится.

lynicidn
Сообщения: 2221
Зарегистрирован: 2014.05.24, 15:12

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение lynicidn » 2015.06.12, 00:12

S c писал(а):Я не ради флейма. Я почему уточнял что в вашем варианте в БД хранится - я просто привык\люблю\считаю правильным хранить числовой идентификатор для подобных вещей. В int-овом поле (уменьшенном, например tiny\small Int (3)). Где только не работал - везде были споры на тему - число в инт поле, либо идентификатор в енум\сет полях. И для меня самый удобный вариант, предложенный ранее

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

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;
    } 
так же еще его можно дополнить параметром - $keysOnly - при нужде выводить только ключи (в нашем случае валидный перечень статусов) и использовать массив ключей для валидации. Но обычно чтоб не нагружать функцию параметрами использую array_keys() для результата функции.
как показывает практика удобнее хранить под будущее, вдруг ты захочешь перевести статусы в справочники и создать модельку

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

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 раза.

lynicidn
Сообщения: 2221
Зарегистрирован: 2014.05.24, 15:12

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение lynicidn » 2015.06.12, 00:15

+parent::fields() + ['status' => 'statusLabel']

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

//grid: 
[
'attribute' => 'status'
'value' => 'statusLabel'
]
//detail: 
[
'attribute' => 'status'
'value' => $model->statusLabel
]
 

lynicidn
Сообщения: 2221
Зарегистрирован: 2014.05.24, 15:12

Re: Авто-генерируемые модели в виде 2 файлов ActiveRecord

Сообщение lynicidn » 2015.06.12, 00:16

+ $form->field($model, 'status')->dropDownList($model->statusLabels);

Ответить