2015-11-19 17 views
10

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!

Trả lời

1

Tôi cho rằng bạn nên tham khảo này: https://github.com/yii2tech/ar-variation

Ví dụ:

$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` 
} 
+0

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. :) –

Các vấn đề liên quan