Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Всем привет. Нужна помощь. Должно работать так: Есть форма где вводится текст с комментарием. По нажатию кнопки 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 вернуть, но толку опять же нет. одно и тоже.
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.
Не в сети
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() { // выводим инфу о ошибки } }); }
Решение не помогло. Проблема так и осталась актуальной.
Почему он все в белый экран возвращает я не понимаю.
Не в сети
Не может ли быть проблема в том что я неверно прописал роутер в данном случае? Конечно очень мало вероятно.
Route::match(['post'], '/preview/{id?}', ['uses' => 'HomeController@add_comment']);
Не в сети
ответ то пришёл, значит проблема в 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.
Не в сети
а вообще, я логики немного не пойму, раз у вас нет в форме урла, для отправки, значит без аякса вы не отправите форму (разве что на ту-же страницу). Т.е. если вы не планируете отправлять форму без аякса (хотя можно предусмотреть), тогда уберите 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.
Не в сети
ответ то пришёл, значит проблема в 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>
Ошибка и проблема аналогичная. Все как на прошлом скриншоте.
Не в сети
странно, чудес не бывает
Стукните в скайп: 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.
Не в сети
а вообще, я логики немного не пойму, раз у вас нет в форме урла, для отправки, значит без аякса вы не отправите форму (разве что на ту-же страницу). Т.е. если вы не планируете отправлять форму без аякса (хотя можно предусмотреть), тогда уберите 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".
Не в сети
$('body').on('button', '#form_id', function(e) {
Это что за событие button?
http://api.jquery.com/on/
Если форма есть изначально в документе то
$( '#form_id').on('submit', function () {});
Не в сети