Laravel по-русски

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

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

#1 12.02.2016 16:03:52

Fixlix

laravel jquery php отправление данные и возвращение ответа

Всем привет. Нужна помощь. Должно работать так: Есть форма где вводится текст с комментарием. По нажатию кнопки js запускает экшен и передает в него POST данные. Далее данные сохраняются в БД. И экшен возвращает JS-у ответ "Комментарий отправлен на модерирование".

Ну данные передаются в БД записываются, но ответ возвращается в виде белого экрана со строкой "Комментарий успешно добавлен".
А должен возвращаться в виде строки под формой. И что я только не пытался сделать ничего не выходит. Помогите плз.

Пробовал так:
                       

<form class="form-horizontal" method="POST" id="form_id" enctype = "multipart/form-data">
                            <input type="hidden" name="_token" value="{{ csrf_token() }}">
                            <div id="heretext"></div>
                            <div class="your-review">
                                <div>
                                    <span><label>Комментарий<span class="red">*</span></label></span>
                                    <span><textarea type="text" name="comment" class="form-control" rows="6" placeholder="Текст комментария"></textarea></span>
                                </div>
                                <div>
                                    <span><button type="submit" name="submit" class="btn btn-danger">Отправить</button></span>
                                </div>
                                <script type="text/javascript">
                                    $(document).ready(function() {
                                        $('#form_id').submit(function(e) {
                                            e.preventDefault();
                                            $.ajax({
                                                type: 'post',
                                                dataType: 'json',
                                                url: '<?php echo URL::action("HomeController@add_comment")?>',
                                                callback: function(responce){
                                                    $('<div id="heretext"></div>').fadeOut(2000);
                                                },
                                            });
                                            $.ajaxSetup({
                                                headers: {
                                                    'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
                                                }
                                            });
                                        });
                                    });
                                </script>
                            </div>
                        </form>

И так:

                       

<form class="form-horizontal" method="POST" id="form_id" enctype = "multipart/form-data">
                            <input type="hidden" name="_token" value="{{ csrf_token() }}">
                            <div id="heretext"></div>
                            <div class="your-review">
                                <div>
                                    <span><label>Комментарий<span class="red">*</span></label></span>
                                    <span><textarea type="text" name="comment" class="form-control" rows="6" placeholder="Текст комментария"></textarea></span>
                                </div>
                                <div>
                                    <span><button type="submit" name="submit" class="btn btn-danger">Отправить</button></span>
                                </div>
                                <script type="text/javascript">
                                    $(document).ready(function() {
                                        $('#form_id').submit(function() {
                                            $.ajax({
                                                type: 'post',
                                                dataType: 'json',
                                                url: '<?php echo URL::action("HomeController@add_comment")?>',
                                                callback: function(responce){
                                                    $('<div id="heretext"></div>').fadeOut(2000);
                                                },
                                            });
                                        });
                                    });
                                </script>
                            </div>
                        </form>

И еще много чего пробовал. Но толку нет.
Вот код контроллера:

    public function add_comment(Request $request, $id)
    {
        if($request->has('comment') && Auth::user()) {
            $comment_model = new Comments();
            $comment_model->comment = $request->input('comment');
            $comment_model->item_id = $id;
            $comment_model->user_id = Auth::user()->id;
            $comment_model->save();
            return "Комментарий был отправлен на модерирование!";
        }

Даже пробовал в виде json вернуть, но толку опять же нет. одно и тоже.

#2 12.02.2016 16:57:12

Artdevue
Откуда: Kiev
Сообщений: 119
Сайт

Re: laravel jquery php отправление данные и возвращение ответа

dataType: 'json' - и возвращайте ему json тоже
контролер

public function add_comment(Request $request, $id)
{
	$out = ['error' => 'Что-то пошло не так :('];
	if($request->has('comment') && Auth::user())
	{
	    $comment_model = new Comments();
	    $comment_model->comment = $request->input('comment');
	    $comment_model->item_id = $id;
	    $comment_model->user_id = Auth::user()->id;
	    $comment_model->save();
	    $out['success'] = 'Комментарий был отправлен на модерирование!';
	} 
	else {
		$out['error'] = 'У вас нет доступа или комментарий пустой';
	}

	return Response::json($out);

}

ну и js что-то типа

$('body').on('submit', '#form_id', function(e) {
	e.preventDefault();
	$.ajax({
            type: "POST",
            url: "/ip/general/get-country",
            cache: false,
            dataType: "json",
            headers: {
                'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
            },
            beforeSend: function(){
            	$('#heretext').removeClass(error);
                // выводим инфу, что идёт обработка
            },
            success: function(data){
                if (data.success) {
                    $('#heretext').html(data.success).fadeOut(2000);
                } else {
                    $('#heretext').addClass('error').html(data.error).fadeOut(2000);
                }
            },
            error: function() {
                // выводим инфу о ошибки
            }
        });
}

If you think it’s expensive to hire a professional to do the job, wait until you hire an amateur.

Не в сети

#3 12.02.2016 18:19:03

Re: laravel jquery php отправление данные и возвращение ответа

Artdevue пишет:

dataType: 'json' - и возвращайте ему json тоже
контролер

public function add_comment(Request $request, $id)
{
	$out = ['error' => 'Что-то пошло не так :('];
	if($request->has('comment') && Auth::user())
	{
	    $comment_model = new Comments();
	    $comment_model->comment = $request->input('comment');
	    $comment_model->item_id = $id;
	    $comment_model->user_id = Auth::user()->id;
	    $comment_model->save();
	    $out['success'] = 'Комментарий был отправлен на модерирование!';
	} 
	else {
		$out['error'] = 'У вас нет доступа или комментарий пустой';
	}

	return Response::json($out);

}

ну и js что-то типа

$('body').on('submit', '#form_id', function(e) {
	e.preventDefault();
	$.ajax({
            type: "POST",
            url: "/ip/general/get-country",
            cache: false,
            dataType: "json",
            headers: {
                'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
            },
            beforeSend: function(){
            	$('#heretext').removeClass(error);
                // выводим инфу, что идёт обработка
            },
            success: function(data){
                if (data.success) {
                    $('#heretext').html(data.success).fadeOut(2000);
                } else {
                    $('#heretext').addClass('error').html(data.error).fadeOut(2000);
                }
            },
            error: function() {
                // выводим инфу о ошибки
            }
        });
}

Решение не помогло. Проблема так и осталась актуальной.
Почему он все в белый экран возвращает я не понимаю.
s_1455290251_6298445_ef8f68ef2c.png

Не в сети

#4 12.02.2016 18:38:23

Re: laravel jquery php отправление данные и возвращение ответа

Не может ли быть проблема в том что я неверно прописал роутер в данном случае? Конечно очень мало вероятно.

Route::match(['post'], '/preview/{id?}', ['uses' => 'HomeController@add_comment']);

Не в сети

#5 12.02.2016 19:19:35

Artdevue
Откуда: Kiev
Сообщений: 119
Сайт

Re: laravel jquery php отправление данные и возвращение ответа

ответ то пришёл, значит проблема в js .. т.е. у вас submit не остановился.
1) попробуйте убрать e.preventDefault(); и в конце? после аякса прописать

return false; // вырубaeм стaндaртную oтпрaвку фoрмы

If you think it’s expensive to hire a professional to do the job, wait until you hire an amateur.

Не в сети

#6 12.02.2016 19:26:48

Artdevue
Откуда: Kiev
Сообщений: 119
Сайт

Re: laravel jquery php отправление данные и возвращение ответа

а вообще, я логики немного не пойму, раз у вас нет в форме урла, для отправки, значит без аякса вы не отправите форму (разве что на ту-же страницу). Т.е. если вы не планируете отправлять форму без аякса (хотя можно предусмотреть), тогда уберите submit с формы, а поставьте  type="button", и отлавливайте по нему. Плюс, я не вижу, что вы передаёте поле comment через аякс, т.е нужно передать ещё

data: $("#form_id").serialize(),

If you think it’s expensive to hire a professional to do the job, wait until you hire an amateur.

Не в сети

#7 12.02.2016 19:33:07

Re: laravel jquery php отправление данные и возвращение ответа

Artdevue пишет:

ответ то пришёл, значит проблема в js .. т.е. у вас submit не остановился.
1) попробуйте убрать e.preventDefault(); и в конце? после аякса прописать

return false; // вырубaeм стaндaртную oтпрaвку фoрмы

Если все правильно понял, то вот код который получился сейчас:

<script type="text/javascript">
                                    $('body').on('submit', '#form_id', function(e) {
                                        $.ajax({
                                            type: "POST",
                                            url: "<?php echo URL::action("HomeController@add_comment")?>",
                                            cache: false,
                                            dataType: "json",
                                            headers: {
                                                'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
                                            },
                                            beforeSend: function(){
                                                $('#heretext').removeClass(error);
                                                // выводим инфу, что идёт обработка
                                            },
                                            success: function(data){
                                                if (data.success) {
                                                    $('#heretext').html(data.success).fadeOut(2000);
                                                } else {
                                                    $('#heretext').addClass('error').html(data.error).fadeOut(2000);
                                                }
                                            },
                                            error: function() {
                                                // выводим инфу о ошибки
                                            }
                                        });
                                        return false; // вырубaeм стaндaртную oтпрaвку фoрмы
                                    });
                                </script>

Ошибка и проблема аналогичная. Все как на прошлом скриншоте.

Не в сети

#8 12.02.2016 19:41:24

Artdevue
Откуда: Kiev
Сообщений: 119
Сайт

Re: laravel jquery php отправление данные и возвращение ответа

странно, чудес не бывает smile
Стукните в скайп: artdevue , так как где-то мелочь, а мы будем гадать или не обращать внимание на неё.
Или откройте доступ на время к shop com

Изменено Artdevue (12.02.2016 19:43:41)


If you think it’s expensive to hire a professional to do the job, wait until you hire an amateur.

Не в сети

#9 12.02.2016 19:50:24

Re: laravel jquery php отправление данные и возвращение ответа

Artdevue пишет:

а вообще, я логики немного не пойму, раз у вас нет в форме урла, для отправки, значит без аякса вы не отправите форму (разве что на ту-же страницу). Т.е. если вы не планируете отправлять форму без аякса (хотя можно предусмотреть), тогда уберите submit с формы, а поставьте  type="button", и отлавливайте по нему. Плюс, я не вижу, что вы передаёте поле comment через аякс, т.е нужно передать ещё

data: $("#form_id").serialize(),

Вот тут мне было сложно понять вас. И того что я прочитал я понял и написал вот это:

<form class="form-horizontal" method="POST" id="form_id" enctype = "multipart/form-data">
                            <input type="hidden" name="_token" value="{{ csrf_token() }}">
                            <div id="heretext"></div>
                            <div class="your-review">
                                <div>
                                    <span><label>Комментарий<span class="red">*</span></label></span>
                                    <span><textarea type="text" name="comment" class="form-control" rows="6" placeholder="Текст комментария"></textarea></span>
                                </div>
                                <div>
                                    <span><button type="button" name="button" class="btn btn-danger">Отправить</button></span>
                                </div>
                                <script type="text/javascript">
                                    $('body').on('button', '#form_id', function(e) {
                                        $.ajax({
                                            type: "POST",
                                            data: $("#form_id").serialize(),
                                            url: "<?php echo URL::action("HomeController@add_comment")?>",
                                            cache: false,
                                            dataType: "json",
                                            headers: {
                                                'X-CSRF-TOKEN': $('meta[name="_token"]').attr('content')
                                            },
                                            beforeSend: function(){
                                                $('#heretext').removeClass(error);
                                                // выводим инфу, что идёт обработка
                                            },
                                            success: function(data){
                                                if (data.success) {
                                                    $('#heretext').html(data.success).fadeOut(2000);
                                                } else {
                                                    $('#heretext').addClass('error').html(data.error).fadeOut(2000);
                                                }
                                            },
                                            error: function() {
                                                // выводим инфу о ошибки
                                            }
                                        });
                                        return false; // вырубaeм стaндaртную oтпрaвку фoрмы
                                    });
                                </script>
                            </div>
                        </form>

Вы меня если что сильно не пинайте. Я на js не писал ранее. Только php.
Если выполнять тот код который опубликован в данном сообщении - ничего не происходит. И оно понятно. Тут явный косяк с type="button".

Не в сети

#10 13.02.2016 10:51:37

Re: laravel jquery php отправление данные и возвращение ответа

Fixlix пишет:

$('body').on('button', '#form_id', function(e) {

Это что за событие button?
http://api.jquery.com/on/

Если форма есть изначально в документе то
$( '#form_id').on('submit', function () {});

Не в сети

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