2015-11-19 18 views
10

Ich möchte i18n-Funktion für Active Klasse implementieren FaqCategory dieses extension verwenden. Hier sind meine Tabellen:Kann nicht Variationen bekommen

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 Modell:

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']); 
    } 

erstellen Aktion:

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, 
     ]); 
    } 

Und Ansicht Datei:

<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> 

Im Frontend:

public function actionIndex() 
    { 
     $categories = FaqCategory::find()->with('translations')->all(); 
     return $this->render('index', ["categories" => $categories]); 

    } 

Ansicht Datei von actionIndex:

<div class="cat-descr"><?= $category->title ?></div> 

Alles war in Ordnung, werden alle Daten insterted richtig FaqCategoryTranslation Tabelle mit languageID. Wenn ich diese Werte jedoch aus der Übersetzungstabelle abrufen möchte, wird nur der Wert des Namensfelds in der Tabelle "FaqCategory" zurückgegeben. Zuletzt werde ich nicht vollständig verstanden AttributeDefaultValueMap. Wofür wird dieses Attribut verwendet? Mit anderen Worten, zum Beispiel, wenn unsere Standard-App Sprache en deshalb nicht en Titel als Standard zu verwenden. Danke!

Antwort

1

Ich nehme an, Sie bezeichnen dies sollte: https://github.com/yii2tech/ar-variation

Zum Beispiel:

$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

Versuchen print_r ($ Kategorien) zu tun. Sehen Sie, was es zurückgibt, und ich würde mich freuen, wenn Sie es hier teilen können. :) –