Yii2 MultilingualBehavior抛出getPrimaryKey错误

时间:2018-03-28 13:59:54

标签: yii2 yii2-advanced-app multilingual

我想在我的表中保存多语言记录,但发生了一些错误 - Call to a member function getPrimaryKey() on string。我正在使用multilingual behavior 这不是第一次。制作了两个表system_informationsystem_informationLang。这是我的模特:

<?php

namespace app\models;

use backend\models\CActiveRecord;
use Yii;
use omgdef\multilingual\MultilingualBehavior;
use omgdef\multilingual\MultilingualQuery;
/**
 * This is the model class for table "system_information".
 *
 * @property int $id
 * @property int $city_id
 *
 * @property SystemInformationlang[] $systemInformationlangs
 */
class SystemInformation extends CActiveRecord
{
    public static function find()
    {
        return new MultilingualQuery(get_called_class());
    }

    public function behaviors()
    {
        $allLanguages = [];
        foreach (Yii::$app->params['languages'] as $title => $language) {
            $allLanguages[$title] = $language;
        }

        return [
            'ml' => [
                'class' => MultilingualBehavior::className(),
                'languages' => $allLanguages,
                //'languageField' => 'language',
                //'localizedPrefix' => '',
                //'requireTranslations' => false',
                //'dynamicLangClass' => true',
                //'langClassName' => PostLang::className(), // or namespace/for/a/class/PostLang
                'defaultLanguage' => Yii::$app->params['languageDefault'],
                'langForeignKey' => 'system_id',
                'tableName' => "{{%system_informationlang}}",
                'attributes' => [
                    'name',
                    'email',
                    'phone',
                    'address',
                    'facebook',
                    'instagram',
                    'google',
                    'linkin',
                    'fax',
                    'owner',
                    'latitude',
                    'longitude'
                ]
            ],
        ];
    }
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'system_information';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        $string_255_lang = $this->multilingualFields([
            'name',
            'email',
            'phone',
            'address',
            'facebook',
            'instagram',
            'google',
            'linkin',
            'fax',
            'owner',
            'latitude',
            'longitude'
        ]);

        $string_255 = [
            'name',
            'email',
            'phone',
            'address',
            'facebook',
            'instagram',
            'google',
            'linkin',
            'fax',
            'owner',
            'latitude',
            'longitude'
        ];

        $require = ['name', 'phone', 'email', 'owner', 'address'];

        $email_lang = $this->multilingualFields(['email']);

        $email = ['email'];

        return [
            [$require, 'required'],
            [$string_255, 'string', 'max' => 255],
            [$string_255_lang, 'string', 'max' => 255],
            [['city_id'], 'integer'],
            [$email_lang, 'email'],
            ['email', 'email'],
        ];
    }

    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'id' => Yii::t('app', 'ID'),
            'city_id' => Yii::t('app', 'City ID'),
        ];
    }

}

这是用于创建语言字段的自定义函数:

protected function multilingualFields($fields){

        $output = [];

        foreach ($fields as $field){
            foreach (Yii::$app->params['languages'] as $language) {
                if(Yii::$app->params['languageDefault'] != $language){
                    $output[] = "{$field}_{$language}";
                }
            }
        }

        return $output;
    }

最后我的控制器:

public function actionCreate()
    {
        $model = new SystemInformation();

        if ($model->load(Yii::$app->request->post())) {

            $model->multilingualLoad($model, [
                'name',
                'email',
                'phone',
                'address',
                'facebook',
                'instagram',
                'google',
                'linkin',
                'fax',
                'owner',
                'latitude',
                'longitude'
            ]);
var_dump($model->save());
var_dump($model->getErrors());die;
            if($model->save()){
                return $this->redirect(['view', 'id' => $model->id]);
            }else{
                Yii::$app->session->setFlash('error',  Yii::t('app', 'Something went wrong. Please, try again later!'));
                return $this->render('create', [
                    'model' => $model,
                ]);
            }

        }

        return $this->render('create', [
            'model' => $model,
        ]);
    }

multilingualLoad也是填充语言字段的自定义函数:

public function multilingualLoad($model, $props = []){
        $model_name = explode('\\', get_class($model));
        $model_name = end($model_name);

        foreach (Yii::$app->params['languages'] as $language){
            if(Yii::$app->params['languageDefault'] != $language){
                foreach ($props as $property){
                    $prop_lang = "{$property}_{$language}";
                    $model->$prop_lang = Yii::$app->request->post($model_name)["{$property}_{$language}"];
                }
            }
        }
    }

我得到了Yii2错误的图片。我想它正在搜索lang表但不知何故$owner获取字符串的值。 error image 提前谢谢!

0 个答案:

没有答案