Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can not get variations

I want to implement i18n feature for ActiveRecord class FaqCategory using this extension. Here are my tables:

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

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

Create action:

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

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

In frontend :

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

    }

View file of actionIndex:

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

Everything was ok, all data insterted properly to FaqCategoryTranslation table with languageID. But when I want to get these values from translation table, it returns only the value of name field in FaqCategory table. Lastly, I'm not completely understood AttributeDefaultValueMap. What is this attribute used for? In other words, if our default app language is for example en why not to use en title as default. Thanks!

like image 299
Sarkhan Avatar asked Nov 19 '15 13:11

Sarkhan


People also ask

Why are variations not available for this category?

Error: Amazon variations are not available for this categoryAmazon does not allow adding variations in some categories. Therefore, if there is no variation theme listed, or you get the error mentioned above, then you can't create variations and should change to a different yet relevant product category.

What are variable variations?

The changing of variable parameters is called as variation. In problems relating to two or more variables, it is seen that the value of a variable changes with the change in the value ( or values ) of the related variable (or variables).

How do I add variations to an existing Amazon listing?

Follow these steps to add a child variation to an existing Amazon listing using the Variation Wizard: On your Seller Central home page, navigate to the Inventory drop-down, click Add a Product and click Add a variation using Variation Wizard.


1 Answers

I suppose you should refer this :https://github.com/yii2tech/ar-variation

For example:

$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`
}
like image 190
Shubham Dixit Avatar answered Oct 04 '22 12:10

Shubham Dixit