Kartik Select2 вернуть ноль - PullRequest
0 голосов
/ 16 ноября 2018

У меня проблема с Kartik Select2. Когда я хочу сохранить несколько данных в моем контроллере, ничего не сохраняется. И я удаляю foreach в контроллере, Yii возвращает мне ошибку с информацией о $ university_id IS NULL.

Форма пользователя

<?= $form->field($user_university, 'university_id')->widget(Select2::classname(),[
    'name' => 'university_id[]',
    'data' => ArrayHelper::map(
        \app\models\University::find()->asArray()->all(),
        'id',
        function ($university) {
            return $university['name'];
        }
    ),
    'size' => Select2::MEDIUM,
    'options' => ['placeholder' => 'Select a state ...', 'multiple' => true],
    'pluginOptions' => [
        'allowClear' => true
    ],
]); ?>

Пользовательский контроллер

 $user = new User();
    $user->scenario = User::SCENARIO_CREATE;
    $auth_assignment = new AuthAssignment();
    $user_company = new UserCompany();
    $user_university = new UserUniversity();
    $user_status = UserStatus::find()
        ->select('id')
        ->where(['name' => UserStatus::NON_AUTHORIZED_USER])
        ->one();

    if ($user->load(Yii::$app->request->post()) && $auth_assignment->load(Yii::$app->request->post())) {

        $user->auth_key = Yii::$app->getSecurity()->generateRandomString();
        $user->password_hash = Yii::$app->getSecurity()->generatePasswordHash($user->password);
        $user->password_reset_token = Yii::$app->getSecurity()->generateRandomString();
        $user->status_id = $user_status->id;
        $user->created_at = date('Y-m-d H:i:s');
        $user->updated_at = date('Y-m-d H:i:s');


        if ($user->save()) {
            $auth_assignment->user_id = $user->id;
            $auth_assignment->created_at = date('Y-m-d H:i:s');

            $universities = $user_university->university_id;
            foreach((array) $universities as $university)
            {
                $newUserUniversity = new UserUniversity();
                $newUserUniversity->user_id = $user->id;
                $newUserUniversity->university_id = $university;
                $newUserUniversity->created_at = date('Y-m-d H:i:s');
                $newUserUniversity->save(false);

            }...

Пользовательское правило модели университета

public function rules()
{
    return [
        [['user_id', 'university_id', 'created_at'], 'required'],
        [['user_id', 'university_id','confirm'], 'integer'],
        [['created_at','university_id'], 'safe'],
        [['university_id'], 'exist', 'skipOnError' => true, 'targetClass' => University::className(), 'targetAttribute' => ['university_id' => 'id']],
        [['user_id'], 'exist', 'skipOnError' => true, 'targetClass' => User::className(), 'targetAttribute' => ['user_id' => 'id']],
    ];
}

Ответы [ 2 ]

0 голосов
/ 16 ноября 2018

Глядя на ваш код, я не вижу, куда вы загружаете данные из почтового запроса в $user_university перед тем, как начать цикл на university_id.Вам нужно позвонить $user_university->load(Yii::$app->request->post()), найти следующий фрагмент кода из вашего скрипта

if ($user->save()) {
   $auth_assignment->user_id = $user->id;
   $auth_assignment->created_at = date('Y-m-d H:i:s');

   // this below line will give you an empty string rather than 
   // the selected ids of the `university` that you selected 
   // in the multi-dropdown

   $universities = $user_university->university_id;  

, и следующая строка - это foreach((array) $universities as $university), в которой вы пытаетесь сохранить, которая не будет запущена ни разу, так как нет никакого массива, загруженного в $unversities.Таким образом, вы можете добавить вызов до того, как получите массив из атрибута, не знаю, должны ли ваши требования возвращать пользователя с ошибкой, если данные не загружаются для $user_university, в противном случае вам нужно добавить его в основную проверку

if ($user->load(Yii::$app->request->post()) && $auth_assignment->load(Yii::$app->request->post()) &&
$user->university->load(Yii::$app->request->post())) {

Таким образом, ваш код должен выглядеть следующим образом

$user = new User();
$user->scenario = User::SCENARIO_CREATE;
$auth_assignment = new AuthAssignment();
$user_company = new UserCompany();
$user_university = new UserUniversity();
$user_status = UserStatus::find()
    ->select('id')
    ->where(['name' => UserStatus::NON_AUTHORIZED_USER])
    ->one();

//validate all models
$allModelsValid=$user->load(Yii::$app->request->post()) && $auth_assignment->load(Yii::$app->request->post()) && $user_university->load(Yii::$app->request->post());

if ($allModelsValid) {

    $user->auth_key = Yii::$app->getSecurity()->generateRandomString();
    $user->password_hash = Yii::$app->getSecurity()->generatePasswordHash($user->password);
    $user->password_reset_token = Yii::$app->getSecurity()->generateRandomString();
    $user->status_id = $user_status->id;
    $user->created_at = date('Y-m-d H:i:s');
    $user->updated_at = date('Y-m-d H:i:s');


    if ($user->save()) {
        $auth_assignment->user_id = $user->id;
        $auth_assignment->created_at = date('Y-m-d H:i:s');

        $universities = $user_university->university_id;
        foreach((array) $universities as $university)
        {
            $newUserUniversity = new UserUniversity();
            $newUserUniversity->user_id = $user->id;
            $newUserUniversity->university_id = $university;
            $newUserUniversity->created_at = date('Y-m-d H:i:s');
            $newUserUniversity->save(false);

        }...

Кроме того, я не нахожу причину использовать имя в качестве university_id[] для раскрывающегося списка, а не university_id

0 голосов
/ 16 ноября 2018

Существует несколько способов использования select2, в настоящее время вы используете Usage with ActiveForm and model, см. Ниже несколько способов.

use kartik\select2\Select2

// Usage with ActiveForm and model
echo $form->field($model, 'state_1')->widget(Select2::classname(), [
    'data' => $data,
    'options' => ['placeholder' => 'Select a state ...'],
    'pluginOptions' => [
        'allowClear' => true
    ],
]);

// With a model and without ActiveForm
echo Select2::widget([
    'model' => $model,
    'attribute' => 'state_2',
    'data' => $data,
    'options' => ['placeholder' => 'Select a state ...'],
    'pluginOptions' => [
        'allowClear' => true
    ],
]);

// Without model and implementing a multiple select
echo '<label class="control-label">Provinces</label>';
echo Select2::widget([
    'name' => 'state_10',
    'data' => $data,
    'options' => [
        'placeholder' => 'Select provinces ...',
        'multiple' => true
    ],
]);

// A disabled select2 list input
echo '<label class="control-label">State</label>';
echo Select2::widget([
    'name' => 'state_11',
    'data' => $data,
    'disabled' => true
]);

Полагаю, ваша проблема в:

'data' => ArrayHelper::map(
        \app\models\University::find()->asArray()->all(),
        'id',
        function ($university) {
            return $university['name'];
        }
    ),

Пожалуйста, проверьте атрибут данных. Проверьте, передаете ли вы правильный массив или нет.

...