Question

Je crée une application où utilisateur peut créer des champs de méta pour stocker des données sur la base de données, ces champs recevront différents types de données, comme les dates ou les valeurs monétaires.

Mon idée initiale de créer ce champs est ce magasin dans une table de base de données. (Par exemple: meta_fields), le nom, la valeur et de validation ce champ

Après la période de l'utiliser sur une application, je compte étendre les méthodes AR __get et __set d'utiliser le champ de nom d'un attribut.

Exemple:

Si sur ma table meta_fields j'ai ces valeurs:

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

Je compte utiliser dans mes vues et contrôleurs comme il:

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

Maintenant, les questions sont:

1 - Comment puis-je utiliser ce genre de champs à des valeurs et la récupération stocker? 2 - Comment l'utilisateur différents types de validation à ces champs? Depuis que je stocke le tableau en tant que valeurs de validation sérialisés sur la base de données?

Merci.

Était-ce utile?

La solution

Peut-être que vous devriez regarder dans une implémentation EAV ? Quelqu'un a créé un comportement EAV pour Yû dans le YiiExt, ici (je ne l'ai pas utilisé). EAV est complexe et (souvent) un peu inefficaces (beaucoup de jointures!), Mais il est la voie à suivre si vous voulez avoir un nombre arbitraire et le type de champs attachés à un DB « ligne ».

Autres conseils

En fait ce que vous devez accomplir ici est une classe de base ActiveRecord personnalisée. Si vous regardez CActiveRecord vous verrez qu'il récupère toutes sortes de méta-informations de votre base de données de choix. Etant donné que dans votre cas, les informations méta est dans une table, vous devez créer une classe de base ActiveRecord personnalisée qui gère ce fait CActiveRecord.

Notez que avec une table personnalisée méta comme celui que vous décrivez ci-dessus ne sera pas facile de faire des opérations de recherche normales et les groupes.

Ne serait-il plus facile pour vous si vous utilisez une table simple avec identifiant et la valeur où la valeur contient des données JSON?

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

et puis quelque chose comme:

$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();

jeter un oeil à cette extension. Il a implemenation de ce que vous avez besoin pour les champs de profil. http://www.yiiframework.com/extension/yii-user-management

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top