我想使用这个
extension实现ActiveRecord类FaqCategory的i18n功能.
这是我的表:
这是我的表:
CREATE TABLE `FaqCategory` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(255) DEFAULT NULL,`icon` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 CREATE TABLE `FaqCategoryTranslation` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT,`catID` int(10) unsigned DEFAULT NULL,`languageID` tinyint(2) unsigned NOT NULL,`title` varchar(255) DEFAULT NULL,`slug` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`),KEY `catID` (`catID`) USING BTREE,KEY `languageID` (`languageID`),CONSTRAINT `FCT_FK1` FOREIGN KEY (`catID`) REFERENCES `FaqCategory` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,CONSTRAINT `FCT_FK2` FOREIGN KEY (`languageID`) REFERENCES `Language` (`id`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 CREATE TABLE `Language` ( `id` tinyint(2) unsigned NOT NULL AUTO_INCREMENT,`locale` varchar(2) DEFAULT NULL,PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8
FaqCategory型号:
class FaqCategory extends \yii\db\ActiveRecord { public function behaviors() { return [ 'translationBehavior' => [ 'class' => VariationBehavior::className(),'variationsRelation' => 'translations','defaultVariationRelation' => 'defaultTranslation','variationOptionReferenceAttribute' => 'languageID','optionModelClass' => Language::className(),'defaultVariationOptionReference' => function () { return Yii::$app->language; },'variationAttributeDefaultValueMap' => [ 'title' => 'name' ],],]; } /** * @inheritdoc */ public static function tableName() { return 'FaqCategory'; } /** * @inheritdoc */ public function rules() { return [ [['icon','name'],'string','max' => 255] ]; } /** * @inheritdoc */ public function attributeLabels() { return [ 'id' => 'ID','name' => 'Name','icon' => 'Icon',]; } public static function find() { return parent::find()->with('defaultTranslation'); } /** * @return \yii\db\ActiveQuery */ public function getTranslations() { return $this->hasMany(FaqCategoryTranslation::className(),['catID' => 'id']); } /** * @return \yii\db\ActiveQuery */ public function getDefaultTranslation() { return $this->hasDefaultVariationRelation(); // convert "has many translations" into "has one defaultTranslation" } /** * @return \yii\db\ActiveQuery */ public function getFaqs() { return $this->hasMany(Faq::className(),['catID' => 'id']); }
创建动作:
public function actionCreate() { $model = new FaqCategory(); $post = Yii::$app->request->post(); if ($model->load($post) && Model::loadMultiple($model->getVariationModels(),$post) && $model->save()) { return $this->redirect(['index']); } else return $this->render('create',[ 'model' => $model,]); }
并查看文件:
<div class="faq-category-create"> <h1><?= Html::encode($this->title) ?></h1> <div class="faq-category-form"> <?PHP $form = ActiveForm::begin(); ?> <?= $form->field($model,'name'); ?> <? foreach ($model->getVariationModels() as $index => $variationModel): ?> <?= $form->field($variationModel,"[{$index}]title")->label($variationModel->getAttributeLabel('title') . ' (' . $variationModel->languageID . ')'); ?> <?PHP endforeach; ?> <div class="form-group"> <?= Html::submitButton('Save',['class' => 'btn btn-primary']) ?> </div> <?PHP ActiveForm::end(); ?> </div> </div>
在前端:
public function actionIndex() { $categories = FaqCategory::find()->with('translations')->all(); return $this->render('index',["categories" => $categories]); }
查看actionIndex文件:
<div class="cat-descr"><?= $category->title ?></div>
一切都OK,所有的数据都被正确地发送到具有languageID的FaqCategoryTranslation表中.但是,当我想从转换表中获取这些值时,它只返回FaqCategory表中名称字段的值.最后,我没有完全了解AttributeDefaultValueMap.这个属性用于什么?换句话说,如果我们的默认应用程序语言是例如,为什么不使用en标题作为默认值.
谢谢!
我想你应该参考这个:
https://github.com/yii2tech/ar-variation
例如:
$items = Item::find()->with('translations')->all(); // only 2 queries will be performed foreach ($items as $item) { echo $item->title . '<br>'; // add other stuffs you want to produce,like name,id or whatever you may have. var_dump($item->defaultTranslation); // no extra query,`defaultTranslation` is populated from `translations` }