Почему форма не проверяет поле FK с помощью Select2 yii2 - PullRequest
0 голосов
/ 11 февраля 2020

сейчас у меня проблема с формой проверки только при использовании виджета select2 используя список через ajax. Я ценю любую поддержку

У меня есть эта модель

enter image description here

И я установил select2 для выбора из поля предложения. Я не знаю, почему форма не проверяется, когда поле пусто. ПОЖАЛУЙСТА, ПОМОГИТЕ !!

enter image description here

Код модели table1

<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "table1".
 *
 * @property int $id_t1
 * @property string $descrip
 *
 * @property Table2[] $table2s
 */
class Table1 extends \yii\db\ActiveRecord
{
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'table1';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['descrip'], 'required'],
            [['descrip'], 'string', 'max' => 45],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id_t1' => Yii::t('app', 'Id T1'),
            'descrip' => Yii::t('app', 'Descrip'),
        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getTable2s()
    {
        return $this->hasMany(Table2::className(), ['id_t1' => 'id_t1']);
    }
}

Код модели table2

<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "table2".
 *
 * @property string $desct2
 * @property string $id_t2
 * @property int $id_t1
 *
 * @property Table1 $t1
 */
class Table2 extends \yii\db\ActiveRecord
{
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'table2';
    }

    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            [['desct2', 'id_t2', 'id_t1'], 'required'],
            [['id_t1'], 'integer'],
            [['desct2', 'id_t2'], 'string', 'max' => 45],
            [['id_t2'], 'unique'],
            [['id_t1'], 'exist', 'skipOnError' => true, 'targetClass' => Table1::className(), 'targetAttribute' => ['id_t1' => 'id_t1']],
        ];
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'desct2' => Yii::t('app', 'Desct2'),
            'id_t2' => Yii::t('app', 'Id T2'),
            'id_t1' => Yii::t('app', 'Id T1'),
        ];
    }

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getT1()
    {
        return $this->hasOne(Table1::className(), ['id_t1' => 'id_t1']);
    }
}

список функций Ajax в Table1Controller

..
...
...
public function actionFieldsList($q = null, $id = null) {

        Yii::$app->response->format = Response::FORMAT_JSON;
        $out = ['results' => ['id' => '', 'text' => '']];

        if (!is_null($q)) {
            $query = new Query;
            $query->select(['id_t1 as id' , 'descrip AS text'])
                ->from('table1')
                ->where(['like', 'descrip', $q])
                ->limit(20);
            $command = $query->createCommand();
            $data = $command->queryAll();

            $out['results'] = array_values($data);
        }
        elseif ($id > 0) {
            $out['results'] = ['id' => $id, 'text' => Table1::find($id)->descrip];
        }
        return $out;
    }

просмотр формы с select2


<?php

use app\models\Table1;
use kartik\select2\Select2;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use yii\helpers\Url;
use yii\web\JsExpression;
use yii\widgets\ActiveForm;

/* @var $this yii\web\View */
/* @var $model app\models\Table2 */
/* @var $form yii\widgets\ActiveForm */
?>

<div class="table2-form">

    <?php $form = ActiveForm::begin(); ?>



        <?=
        $form->field($model, 'id_t1')->widget(Select2::className(), [
            'initValueText' => empty($model->id_t1) ? '' : \app\models\Table1::findOne($model->id_t1)->descrip, // set the initial display text
            'language'=>'es',
            'options' => ['placeholder' => 'Select  '],
            'pluginOptions' => [

                'ajax' => [
                    'url' => Url::to(['table1/fields-list']),
                    'dataType' => 'json',
                    'cache' => true,
                    'data' => new JsExpression('function(params) { return {q:params.term}; }')
                ],
                'escapeMarkup' => new JsExpression('function (markup) { return markup; }'),
                'templateResult' => new JsExpression('function(data) { return data.text; }'),
                'templateSelection' => new JsExpression('function (data) { return data.text; }'),
            ],
        ]);
        ?>


    <?= $form->field($model, 'desct2')->textInput(['maxlength' => true]) ?>

    <?= $form->field($model, 'id_t2')->textInput(['maxlength' => true]) ?>

    <div class="form-group">
        <?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?>
    </div>

    <?php ActiveForm::end(); ?>

</div>


...