php – 不能变化
发布时间:2020-12-13 17:34:59 所属栏目:PHP教程 来源:网络整理
导读:我想使用这个 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`)) EN
我想使用这个
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 yiidbActiveRecord { 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 yiidbActiveQuery */ public function getTranslations() { return $this->hasMany(FaqCategoryTranslation::className(),['catID' => 'id']); } /** * @return yiidbActiveQuery */ public function getDefaultTranslation() { return $this->hasDefaultVariationRelation(); // convert "has many translations" into "has one defaultTranslation" } /** * @return yiidbActiveQuery */ 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` } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |