无法获得变化

时间:2015-11-19 13:09:30

标签: php yii2 yii-extensions

我想使用此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 标题作为默认值。 谢谢!

1 个答案:

答案 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`
}