Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 05.04.2015 18:32:35

nemocoder
Откуда: Almaty, Kazakhstan
Сообщений: 69

ajax форма

Выходит ошибка что  MethodNotAllowedHttpException
вот код

форма
                        {{Form::open(array('id'=>'frm'))}}
                            <label class="h6">Имя / Фамилия</label>
                            <input type="text" name="name" required="required" class="form-control">
                            <label class="h6">E-mail</label>
                            <input type="email" name="email" required="required" class="form-control">
                            <label class="h6">Сообщение</label>
                            <textarea rows="7" name="message" required="required" class="form-control"></textarea><br />

                            <button type="submit" class="btn btn-primary" ><span class="fui-mail"></span></button>
                        {{Form::close()}}
<script>

        $("document").ready(function(){
            $("#frm").submit(function(e){
                e.preventDefault();
                var name = $("input[name=name]").val();
                var email = $("input[name=email]").val();
                var message = $("textarea[name=message]").val();
                var dataString = 'name='+name+'&email='+email+'&message'+message;
                $.ajax({
                    type: "POST",
                    url : "http://example.com/contact",
                    data : dataString,
                    dataType : "json",
                    success : function(msg){

                        if (msg == 'ok'){
                            sweetAlert("Good job!", "Ваша заявка отправлена!", "success");
                        }else {
                            sweetAlert("Oops...", "Вы ввели не всю информацию, вернитесь и заполните все поля!", "error");
                        }

                    }

                },"json");

            });
        });
    </script>
Route::post('/contact', function(){
    if (Request::ajax()){
        $user = array(
            'email' => Input::get('email')
        );
        $data = array(
            'name' => Input::get('name'),
            'email' => Input::get('email'),
            'message_body' => Input::get('message')
        );
        $rules = array(
            'name'  => 'required|max:50',
            'email' => 'required|email',
            'message_body' => 'required|min:6',
        );
        $validation = Validator::make($data, $rules);

        if ($validation->fails())
        {
            return Redirect::to('/about')->withErrors($validation)->withInput();
        }


        Mail::send('emails.contact', $data, function($message) use ($user) {
            $message->to('test@example.com', 'RS Staff')->subject('Новое сообщение ');
        });
        return Response::json(array('msg' => 'ok'));
    }
});

может где не так сделал по советуйте что делать и посмотрите со стороны виднее будет если где то что не так

Не в сети

#2 06.04.2015 07:15:54

Re: ajax форма

method="post" на форме забыл?

Не в сети

#3 07.04.2015 10:41:43

nemocoder
Откуда: Almaty, Kazakhstan
Сообщений: 69

Re: ajax форма

constb пишет:

}%method="post" на форме забыл?

разве не автоматом ?

Не в сети

#4 07.04.2015 20:15:54

nemocoder
Откуда: Almaty, Kazakhstan
Сообщений: 69

Re: ajax форма

вечно выдает что ошибка с js возвращает не msg == true

                                                        {{Form::open(array('id' => 'frm', 'method' => 'post' ))}}
                                                        <div class="form-group">

                                                            {{ Form::email('email', null, array('class' => 'form-control',"placeholder" => "Your E-mail")) }}
                                                        </div>
                                                        <div class="form-group">
                                                            <div>

                                                                {{ Form::password('password', array('class' => 'form-control', "placeholder" => "Password")) }}
                                                                <br />
                                                            </div>


                                                        </div>
                                                        <div class="form-group">
                                                            <button type="submit" class="btn btn-block btn-warning btn-embossed">Sign Up</button>
                                                        </div>
                                                    {{Form::close()}}
$("document").ready(function(){
                $("#frm").submit(function(e){
                    e.preventDefault();
                    
                    var query = "email=" + $("input[name=email]").val() +
                            "&password=" + $("input[name=password]").val();
                    $.ajax({
                        type: "POST",
                        url : "http://localhost:8000/frontend/users/register",
                        data : query,
                        cache: false,
                        //dataType : "json",
                        success : function(msg){

                            if (msg == 'true'){
                                sweetAlert("Good job!", "Ваша заявка отправлена!", "success");
                            }else {
                                sweetAlert("Oops...", "Вы ввели не всю информацию, вернитесь и заполните все поля!", "error");
                            }

                        }

                    },"json");

                });
            });
public function postRegister() {
        if(Request::ajax()){
            $rules = User::$validation;
            $validation = Validator::make(Input::all(), $rules);
            if ($validation->fails()) {
                
                return Response::json(array('msg'=> false,));
            }
            $user = new User();
            $user->fill(Input::all());

            $id = $user->register();
            
            return Response::json(array('msg'=> true,));
           
        }

    }

в модели

public function register() {
        $this->password = Hash::make($this->password);
        $this->activationCode = $this->generateCode();
        $this->save();
        Log::info("User [{$this->email}] registered. Activation code: {$this->activationCode}");
        $this->sendActivationMail();
        return $this->id;
    }
    public function sendActivationMail() {
        $activationUrl = action(
            'UsersController@getActivate',
            array(
                'userId' => $this->id,
                'activationCode'    => $this->activationCode,
            )
        );
        $that = $this;
        Mail::send('emails/activation',
            array('activationUrl' => $activationUrl),
            function ($message) use($that) {
                $message->to($that->email)->subject('Спасибо за регистрацию!');
            }
        );
    }

Изменено nemocoder (07.04.2015 20:16:42)

Не в сети

#5 07.04.2015 20:55:01

Re: ajax форма

Попробуйте так:

if (msg ){
                                sweetAlert("Good job!", "Ваша заявка отправлена!", "success");
                            }else {
                                sweetAlert("Oops...", "Вы ввели не всю информацию, вернитесь и заполните все поля!", "error");
                            }

Если не поможет - то смотрите, что приходит в msg, вначале success-функции добавьте:

console.log(msg);

И посмотрите, что в консоли выведется.

Не в сети

#6 07.04.2015 21:12:01

nemocoder
Откуда: Almaty, Kazakhstan
Сообщений: 69

Re: ajax форма

Дмитрий пишет:

Попробуйте так:

if (msg ){
                                sweetAlert("Good job!", "Ваша заявка отправлена!", "success");
                            }else {
                                sweetAlert("Oops...", "Вы ввели не всю информацию, вернитесь и заполните все поля!", "error");
                            }

Если не поможет - то смотрите, что приходит в msg, вначале success-функции добавьте:

console.log(msg);

И посмотрите, что в консоли выведется.

возвращает false
я не пойму почему валидацию не проходит база пустая и все равно, может где ошибка есть я не вижу ?

Не в сети

#7 07.04.2015 22:36:16

nemocoder
Откуда: Almaty, Kazakhstan
Сообщений: 69

Re: ajax форма

решено!

if (msg ['msg'] == true){
                                sweetAlert("Good job!", "Ваша заявка отправлена!", "success");
                            }else {
                                sweetAlert("Oops...", "Вы ввели не всю информацию, вернитесь и заполните все поля!", "error");
                            }

Не в сети

#8 08.04.2015 08:09:46

Re: ajax форма

if (msg ['msg'] == true)

Странно, если у Вас в консоли выводилось "false". Там должен был быть Array.

Изменено Дмитрий (08.04.2015 08:11:33)

Не в сети

#9 08.04.2015 08:45:08

Re: ajax форма

вместо e.preventDefault() достаточно вернуть из обработчика false — это обеспечит и preventDefault и stopPropagation причём кроссбраузерно, не только для современных браузеров. вторая проблема — при таком способе формирования payload’а запроса не искейпится содержимое полей. учитывая что в обработчике форма приходит в виде this достаточно в качестве data передать $(this).serialize() — это и проще и правильнее, а главное в форме присутствует и csrf-токен, который тоже будет передан. cache: false на post-запросе не нужен — посты не кэшируются. и можно использовать $.post вместо общего $.ajax.

js$.post($(this).attr('action'), $(this).serialize(), function (responce) {
    ...
}, 'json');
return false;

как-то так

Не в сети

#10 08.04.2015 13:10:21

nemocoder
Откуда: Almaty, Kazakhstan
Сообщений: 69

Re: ajax форма

constb пишет:

}%вместо %%e.preventDefault()%% достаточно вернуть из обработчика %%false%% - это обеспечит и %%preventDefault%% и %%stopPropagation%% причём кроссбраузерно, не только для современных браузеров. вторая проблема - при таком способе формирования payload'а запроса не искейпится содержимое полей. учитывая что в обработчике форма приходит в виде %%this%% достаточно в качестве %%data%% передать %%$(this).serialize()%% - это и проще и правильнее, а главное в форме присутствует и csrf-токен, который тоже будет передан. %%cache: false%% на post-запросе не нужен - посты не кэшируются. и можно использовать %%$.post%% вместо общего %%$.ajax%%.

%%(js)
$.post($(this).attr('action'), $(this).serialize(), function (responce) {
    ...
}, 'json');
return false;
%%

как-то так

спасибо учту

Не в сети

Подвал раздела