Tôi muốn triển khai tính năng i18n cho lớp FaqCategory ActiveRecord bằng cách sử dụng extension này. Dưới đây là bảng của tôi: Mô hìnhKhông thể nhận các biến thể
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']);
}
Tạo tác vụ:
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,
]);
}
Và xem file:
<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>
Trong frontend:
public function actionIndex()
{
$categories = FaqCategory::find()->with('translations')->all();
return $this->render('index', ["categories" => $categories]);
}
Xem tập tin của actionIndex:
<div class="cat-descr"><?= $category->title ?></div>
Tất cả mọi thứ là ok, tất cả dữ liệu insterted đúng cách để bảng FaqCategoryTranslation với languageID. Nhưng khi tôi muốn nhận các giá trị này từ bảng dịch, nó chỉ trả về giá trị của trường tên trong bảng FaqCategory. Cuối cùng, tôi không hoàn toàn hiểu được AttributeDefaultValueMap. Thuộc tính này được sử dụng để làm gì? Nói cách khác, nếu ngôn ngữ ứng dụng mặc định của chúng tôi là ví dụ vi lý do tại sao không sử dụng tên vi làm mặc định. Cảm ơn!
Hãy thử làm print_r ($ categories). Xem những gì nó trở lại và tôi sẽ rất vui nếu bạn có thể chia sẻ nó ở đây. :) –