Пользуясь расширением
LAV45 подключил мультиязычность для контента.
Теперь не могу понять, почему не добавляет в БД при insert?
Целый день провозился, все проверил, и я понимаю что просто я зеленый в Yii, как собственно и в разработке, и в этом вся и беда. Помогите, в тупике.
Все fk совпадают с pk по типу, создавал с помощью миграций.
<?php
namespace common\models\category;
use lav45\translate\TranslatedTrait;
use lav45\translate\TranslatedBehavior;
use Yii;
class Category extends \yii\db\ActiveRecord
{
use TranslatedTrait;
public $notIncludeInResult;
public static function tableName()
{
return 'category';
}
public function rules()
{
return [
[['parent_id', 'catalog_type'], 'integer'],
[['icon_code'], 'string', 'max' => 50],
[['id'], 'safe'],
[['parent_id'], 'default', 'value' => null],
[['catalog_type'], 'default', 'value' => 0],
[['parent_id'], 'exist', 'skipOnError' => true,
'targetClass' => Category::className(), 'targetAttribute' => ['parent_id' => 'id']],
];
}
public function behaviors()
{
return [
[
'class' => TranslatedBehavior::className(),
'translateRelation' => 'categoryTranslates',
'languageAttribute' => 'language_id',
'translateAttributes' => [
'url_type_article',
'title',
'mkeywords',
'mdescription',
]
]
];
}
public function getParentTitle()
{
$parentId = $this->parent->id;
return Category::find()->joinWith('category_translate')
->where(['category_translate.parent_id' => $parentId])->one();
}
public function getParentCategoriesTree()
{
$categories = CategoryTranslate::find()
->joinWith('category')->all();
$list = [];
if (!empty($categories)){
foreach ($categories as $item){
$list[$item->id] = [
'id' => $item->id,
'title' => (isset($item->category->parent_id) ?
$item->category->parent_id.' - '.$item->title :
$item->title
),
'parent' => (isset($item->category->parent_id) ?
$item->category->parent_id :
null
),
];
}
if ($this->notIncludeInResult !== null){
unset($list[intval($this->notIncludeInResult)]);
}
return $list;
}else{
return false;
}
}
public function getParent()
{
return $this->hasOne(Category::className(), ['id' => 'parent_id']);
}
public function getCategories()
{
return $this->hasMany(Category::className(), ['parent_id' => 'id']);
}
public function getCategoryTranslates()
{
return $this->hasMany(CategoryTranslate::className(), ['category_id' => 'id']);
}
public static function find()
{
return new CategoryQuery(get_called_class());
}
}
<?php
namespace common\models;
use common\models\category\CategoryTranslate;
use Locale;
use Yii;
use yii\db\ActiveRecord;
class Language extends ActiveRecord
{
const STATUS_DISABLED = 0;
const STATUS_ACTIVATED = 1;
static $current = null;
public static function tableName()
{
return 'language';
}
public function behaviors()
{
return [
'timestamp' => [
'class' => 'yii\behaviors\TimestampBehavior',
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['date_create', 'date_update'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['date_update'],
],
],
];
}
static function getCurrent()
{
if( self::$current === null ){
self::$current = self::getDefaultLang();
}
return self::$current;
}
public function isSourceLanguage()
{
return $this->getOldAttribute('id') == Locale::getPrimaryLanguage(Yii::$app->sourceLanguage);
}
static function setCurrent($url = null)
{
$language = self::getLangByUrl($url);
self::$current = ($language === null) ? self::getDefaultLang() : $language;
Yii::$app->language = self::$current->local;
}
static function getDefaultLang()
{
return Language::find()->where('`default` = :default', [':default' => 1])->one();
}
static function getLangByUrl($url = null)
{
if ($url === null) {
return null;
} else {
$language = Language::find()->where('url_address = :url_address', [':url_address' => $url])->one();
if ( $language === null ) {
return null;
}else{
return $language;
}
}
}
public static function getList($active = false)
{
$query = static::find()
->select(['name', 'id'])
->orderBy('id')
->indexBy('id');
if ($active == true) {
$query->active();
}
return $query->column();
}
public function rules()
{
return [
[['url_address', 'local', 'name', 'date_updated', 'date_created'], 'required'],
[['default', 'date_updated', 'date_created'], 'integer'],
[['url_address', 'local', 'name'], 'string', 'max' => 255],
];
}
public function getCategoryTranslates()
{
return $this->hasMany(CategoryTranslate::className(), ['language_id' => 'id']);
}
}
<?php
namespace common\models\category;
use common\models\Language;
use Yii;
class CategoryTranslate extends \yii\db\ActiveRecord
{
public static function tableName()
{
return 'category_translate';
}
public function rules()
{
return [
[['category_id', 'language_id'], 'integer'],
[['mdescription'], 'string'],
[['url_type_article'], 'trim'],
[['language_id'], 'default', 'value' => 2],
[['url_type_article', 'title', 'mkeywords'], 'string', 'max' => 255],
[['category_id'], 'exist', 'skipOnError' => true, 'targetClass' => Category::className(), 'targetAttribute' => ['category_id' => 'id']],
[['language_id'], 'exist', 'skipOnError' => true, 'targetClass' => Language::className(), 'targetAttribute' => ['language_id' => 'id']],
];
}
public function getCategory()
{
return $this->hasOne(Category::className(), ['id' => 'category_id']);
}
public function getLanguage()
{
return $this->hasOne(Language::className(), ['id' => 'language_id']);
}
public static function find()
{
return new CategoryTranslateQuery(get_called_class());
}
public function beforeSave($insert)
{
$this->url_type_article = str_replace(' ','_',$this->url_type_article);
return parent::beforeSave($insert);
}
}
CategoryController стандартный CRUD, плюс то, с чем я возился весь день:
<?php
public function actionCreate()
{
$category = new Category();
$category_translate = new CategoryTranslate();
if ($category->load(Yii::$app->request->post()) && $category_translate->load(Yii::$app->request->post())) {
$transaction = CategoryTranslate::getDb()->beginTransaction();
try {
$category->save();
$category_translate->category_id = $category->id;
$category_translate->language_id = $_POST['CategoryTranslate']['language_id'];
$category_translate->save();
$transaction->commit();
} catch(\Exception $e) {
$transaction->rollBack();
throw $e;
}
} else {
return $this->render('create', [
'category' => $category,
'category_translate' => $category_translate,
]);
}
}
}
view:
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>
<div class="category-form">
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($category, 'id')->textInput() ?>
<?= $form->field($category, 'parent_id')->textInput() ?>
<?= $form->field($category_translate, 'title')->textInput() ?>
<?= $form->field($category_translate, 'language_id')->textInput(['value'=>2]) ?>
<?= $form->field($category_translate, 'url_type_article')->textInput() ?>
<?= $form->field($category_translate, 'mkeywords')->textInput() ?>
<?= $form->field($category_translate, 'mdescription')->textInput() ?>
<?= $form->field($category, 'icon_code')->textInput(['maxlength' => true]) ?>
<?= $form->field($category, 'catalog_type')->textInput() ?>
<div class="form-group">
<?= Html::submitButton($category->isNewRecord ? Yii::t('shop', 'Create') : Yii::t('shop', 'Update'), ['class' => $category->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
При сохранении: