PHP Laravel如何检查控制器中的复选框是否已选中

时间:2019-05-24 11:56:15

标签: javascript php jquery laravel

我正在构建一个laravel-app,将mailchimp连接到联系表。用户必须接受条件,并可以通过选中复选框来接收新闻通讯。现在,当用户同时接受条件和新闻通讯时,表单已成功提交,但是当用户未选中新闻通讯复选框时,表单未提交,我也不知道为什么。

此处输入

<input name="conditions" value="1" type="checkbox" class="custom-control-input" id="applyConditions" required>
<input type="checkbox" name="newsletter" class="custom-control-input" id="contactNewsletterSubscribe">

和我的控制器:

class ContactController extends Controller
{
public function store()
{
    $validator = Validator::make(request()->all(), [
        'email' => ['required', 'email'],
        'name' => ['required', 'string'],
        'phone' => ['string'],
        'subject' => ['required', 'string'],
        'message' => ['required', 'string'],
        'conditions' => ['accepted', 'boolean'],
    ]);

    if ($validator->fails()) {
        return response()
            ->json($validator->messages(), 400);
    }

    if (request()->has('newsletter')) {
        Newsletter::subscribePending(request()->email);

        if (!Newsletter::lastActionSucceeded()) {
            return response()
                ->json($validator->messages(), 400);
        }
    }

    Mail::to('my@mail.com')
        ->send(new ContactUsMessage([
            'email' => request()->email,
            'name' => request()->name,
            'phone' => request()->phone,
            'subject' => request()->subject,
            'message' => request()->message,
        ]));

    return response()->json('OK', 200);
}

}

当我同时选中conditionsnewsletter复选框时,表单数据返回:

conditions: 1
newsletter: on

接受条件但未选中“新闻通讯”复选框时,表单数据将返回:

conditions: 1
newsletter: undefined

有人可以告诉我我在做什么错吗?

编辑

我正在使用jquery / axios发送表单数据:

if ($('#contact input[name="newsletter"]:checked')) {
    formData.append(
       "newsletter",
       $('#contact input[name="newsletter"]:checked').val()
   );
} else {
    formData.append(
       "newsletter",
       $('#contact input[name="newsletter"]').val()
    );
}

2 个答案:

答案 0 :(得分:1)

尝试一下:

if ($('#contact input[name="newsletter"]:checked')) {
    formData.append(
       "newsletter",
       $('#contact input[name="newsletter"]:checked').val()
   );
} else {
    formData.append(
       "newsletter",
       "off"
    );
}

因此它应该是服务器上的newsletter: off

P。 S.我建议对复选框使用布尔值。

答案 1 :(得分:1)

  

有人可以告诉我我在做什么错吗?

首先,您的jQuery代码使用率不高:

if ($('#contact input[name="newsletter"]:checked')) {
    formData.append(
       "newsletter",
       $('#contact input[name="newsletter"]:checked').val()
   );
} else {
    formData.append(
       "newsletter",
       $('#contact input[name="newsletter"]').val()
    );
}

在两种情况下,您都试图获取不存在的value属性。并且得到on的唯一原因是,当On标签没有<input>属性时,将value的值分配给选中的复选框是浏览器的默认行为。

此外,如果设置了属性,则无论复选框checked的状态如何,您将始终获得其值。试试看,看看自己。

接下来,我将使用一个简单的代码,如下所示:

formData.append(
    "newsletter",
    $('#contact input[name="newsletter"]:checked').length
);

无任何条件。在控制器中,您将得到10

然后,在控制器中,您可以这样:

if (!empty(request()->newsletter)) {
    ...
}