PHP Laravel, как проверить, установлен ли флажок в контроллере - PullRequest
2 голосов
/ 24 мая 2019

Я создаю приложение laravel, где я подключаю 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);
}

}

Когда я проверяю оба флажка conditions и newsletter, данные формы возвращаются:

conditions: 1
newsletter: on

Когда условия приняты, но флажок новостной рассылки снят, данные формы возвращаются:

conditions: 1
newsletter: undefined

Может кто-нибудь сказать мне, что я делаю не так?

EDIT

Я отправляю данные формы с помощью 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 ]

1 голос
/ 24 мая 2019

Может кто-нибудь сказать мне, что я делаю не так?

Прежде всего, ваш код 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
);

без каких-либо условий.в контроллере вы получите либо 1, либо 0.

, затем в контроллере вы можете сделать так:

if (!empty(request()->newsletter)) {
    ...
}
1 голос
/ 24 мая 2019

Попробуйте это:

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

Так должно быть newsletter: off на сервере.

P. S. Я бы предложил использовать логические значения для флажков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...