【问题标题】:Kartik Select2 return nullKartik Select2 返回 null
【发布时间】:2018-11-16 09:36:41
【问题描述】:

我对 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']],
    ];
}

【问题讨论】:

  • 提交后Yii::$app-&gt;request-&gt;post()的结果是什么?
  • Yii::$app->request->post() 如果表单已经发送并且数据作为 post 发送,则返回 true。用户和 Auth_assignment 正常保存,只是我不能保存用户大学的信息。
  • 您的表单中是否有多个名称为 university_id 的下拉菜单?
  • 是的,我使用 Kartik Select2 进行多个下拉菜单。一切都很好,但返回值为空。
  • 很抱歉再问一次,但我知道这是一个multi-dropdown,但是对于同一字段university_id,您是否有多个multi-dropdowns

标签: php arrays yii2 jquery-select2


【解决方案1】:

查看您的代码,在您开始循环 university_id 之前,我无法看到您将发布请求中的数据加载到 $user_university 的位置。您需要致电$user_university-&gt;load(Yii::$app-&gt;request-&gt;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

【讨论】:

    【解决方案2】:

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

    请检查数据属性..检查您是否传递了正确的数组。

    【讨论】:

    • 这就是现在回答问题的方式,因为问题与插件的使用无关,您从未在您关注的代码中解决问题,因为用户能够从下拉列表中选择大学并且不能只保存,你不应该发布假设的答案
    猜你喜欢
    • 2017-10-16
    • 1970-01-01
    • 2020-03-06
    • 1970-01-01
    • 2023-03-29
    • 2023-04-01
    • 1970-01-01
    • 2016-07-14
    • 2015-12-02
    相关资源
    最近更新 更多