我想使用此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,
`name` varchar(255) 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>
一切正常,所有数据都使用languageID正确地插入到FaqCategoryTranslation表中。但是当我想从转换表中获取这些值时,它只返回FaqCategory表中name字段的值。最后,我还没有完全理解 AttributeDefaultValueMap 。这个属性用于什么?换句话说,如果我们的默认应用语言是 en ,为什么不使用 en 标题作为默认值。 谢谢!
答案 0 :(得分:1)
我想你应该参考: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`
}