Модель Yii и настраиваемые поля - PullRequest
1 голос
/ 10 декабря 2010

Я создаю приложение, в котором пользователь может создать мета-поле для хранения данных в базе данных, эти поля будут получать различные виды данных, например даты или денежные значения.

Моя первоначальная идея создать это этополя хранятся в таблице базы данных (например, meta_fields), имя, значение и проверки этого поля.

После того, как во время использования его в приложении, я намерен расширить методы AR __get и __set доиспользуйте поле имени в качестве атрибута.

Пример:

Если в моей таблице meta_поля у меня есть следующие значения:

----------------------------------------------------
| id | name     | value      | validation          |
----------------------------------------------------
| 1  | money_en | $562,00    | some validation...  |
----------------------------------------------------
| 2  | date_crt | 2010-12-09 | some validation...  |
----------------------------------------------------

Я намереваюсь использовать в моих представлениях и контроллерахкак это:

$model->money_en //will return $562,00

Теперь вопросы:

1 - Как я могу использовать этот тип полей для хранения значений и их восстановления?2 - Как я могу использовать различные виды проверки для этих полей?Так как я храню массив проверок как сериализованные значения в базе данных?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 14 декабря 2010

Может быть, вам стоит взглянуть на реализацию EAV ?Кто-то создал EAV Behavior для Yii в YiiExt, здесь (я не использовал его).EAV сложен и (часто) немного неэффективен (много объединений!), Но это путь, если вы хотите иметь произвольное число и тип полей, прикрепленных к «строке» БД.

0 голосов
/ 13 декабря 2010

взгляните на это расширение. Он имеет реализацию того, что вам нужно для полей профиля. http://www.yiiframework.com/extension/yii-user-management

0 голосов
/ 10 декабря 2010

По сути, вам необходимо создать собственный базовый класс ActiveRecord.Если вы посмотрите на CActiveRecord, вы увидите, что он получает все виды метаинформации из выбранной вами базы данных.Поскольку в вашем случае метаинформация находится в таблице, вам потребуется создать собственный базовый класс ActiveRecord, который обрабатывает действия CActiveRecord.

Обратите внимание, что с пользовательской мета таблицей, подобной описанной выше, будет нелегкоделать обычный поиск и групповые операции.

Не было бы проще для вас, если бы вы использовали простую таблицу с идентификатором и значением, где значение содержит данные JSON?

-------------------------------------------------------------------------
| ID | VALUE                                                            |
-------------------------------------------------------------------------
| 10 | {'name':'validation','money_en':'$100','dare_crt' :'2010-12-09'} |
-------------------------------------------------------------------------

, а затем что-то вроде:

$record = MyTable::model()->findByPk(10); // or some thing like this
$arr = CJSON::decode($record->VALUE);
$arr['money_en'] == '$200';
$receord->VALUE = CJSON::encode($arr);
$record->save();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...