Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

[Решено] Помогите с Ajax


Recommended Posts

Добрый день, нужна помощь.

Opencart Version 2.1.0.2 (rs.1)
Есть некий модуль:
во фронте модалка, в которую пользователь оставляет заявку.
в админке форма со всеми заявками.
Модуль делал я сам, когда только знакомился с opencart (далеко я с тех пор не ушел :-D)
нашел в инете какойто мануал и тупо оттуда все слизывал, меняя некоторые мелочи под себя.
И вот сейчас потребовалось его модифицировать, в частности добавить возможность массово удалять заявки.
Ковыряюсь целый день, штурмую гугл, но после бесчисленного количества попыток я решил попросить помощи)
Собственно в чем проблема:

<td>
  <a href="#" data-toggle="tooltip" title="" class="btn btn-danger comment-delete" data-original-title="Удалить без подтверждения">
    <i class="fa fa-trash-o">
      <input type="hidden" name="id" value="<?php echo $comment['id']; ?>"/>
    </i>
  </a>
</td>

у каждой записи есть кнопка, внутри которой скрытый инпут со значением равным id записи.
по нажатию на кнопку отрабатывает Ajax и id улетает в бэкенд
 

	$('.comment-delete').click(function(){
		gems = $(this).find('input');
		$.ajax({
			url: 'index.php?route=module/comments/deleteComment&token=<?php echo $token; ?>',
			type: 'post',
			data: gems,
			dataType: 'json',
			beforeSend: function() {
				console.log(gems);
			},
			error: function (json) {
				console.log(json);		
			},
			success: function(json) {
				console.log(json);		
				// location.reload();			
			}
		});
		return false;
	});

Все работает, все отлично. И тут в дело вступаю я и делаю вместо кнопок чекбоксы:
 

<input class="box" type="checkbox" name="id" value="<?php echo $comment['id']; ?>">

И меняю скрипт :
 

	$('.comment-delete').click(function(){
		gems = $.map( $(".box:checked"), function(el){ return $(el); });

		$.ajax({
			url: 'index.php?route=module/comments/deleteComment&token=<?php echo $token; ?>',
			type: 'post',
			data: gems,
			dataType: 'json',
			beforeSend: function() {
				console.log(gems);
			},
			error: function (json) {
				console.log(json);		
			},
			success: function(json) {
				console.log(json);		
				// location.reload();			
			}
		});
		return false;
	});

В ответ я получаю балалайку.
в лог падает ошибка что id не определен
вот метод deleteComment из контроллера: 
 

	public function deleteComment(){
		
		// получаем значения
		$text = ($this->request->post['id']) ? $this->request->post['id'] : 0;
		// массив вывода
		$json = array();
		if (!$text) {
			$json['error'] = 'no id';
		} else {
			$this->load->model('comments/comments');
			$json['com_id'] = $this->model_comments_comments->deleteRow($text);
		}
		$this->response->addHeader('Content-Type: application/json');
		$this->response->setOutput(json_encode($json));
	}


З.Ы.

Изначально я в массив собирал значения с боксов: 

var gems = $.map( $(".box:checked"), function(el){ return $(el).val(); });

Потом обратил внимание что в варианте с кнопками оно в переменную пишет Jquery обьект инпута и не его значение, и изменил на :
 

gems = $.map( $(".box:checked"), function(el){ return $(el); });

Потом еще было много извращений с массивами, я сам уже перестал понимать что делаю :( :
 

var gems = $('.box').map(function(i,el){
	if($(el).prop('checked')){
		return $(el).val();
	}
}).get();



Помогите кто-нибудь)

Змінено користувачем f4rr3ll1990
Надіслати
Поділитися на інших сайтах


если хотите удалять сразу несколько, то как-то так

<input class="box" type="checkbox" name="id[]" value="11">
<input class="box" type="checkbox" name="id[]" value="22">
<input class="box" type="checkbox" name="id[]" value="33">
<button class="comment-delete">delete</button>
 <script>
    $(function(){
        $(".comment-delete").click(function(){
         $.ajax({
                 url:  'index.php?route=module/comments/deleteComment&token=<?php echo $token; ?>',
                 type: 'post',
                 data: $(".box:checked"),
                 dataType: 'json',
                 beforeSend: function() {
                         console.log(gems);
                 },
                 error: function (json) {
                         console.log(json);		
                 },
                 success: function(json) {
                         console.log(json);		
                         // location.reload();			
                 }
         });
        })
    })
 </script>
public function deleteComment(){

        // получаем значения
        $text = ($this->request->post['id']) ? $this->request->post['id'] : 0;
        // массив вывода
        $json = array();
        if (!$text) {
                $json['error'] = 'no id';
        } else {
                $this->load->model('comments/comments');
                foreach($text as $t){
                    $json['com_id'][] = $this->model_comments_comments->deleteRow($t);
                }

        }
        $this->response->addHeader('Content-Type: application/json');
        $this->response->setOutput(json_encode($json));
}

или сделать еще функцию массового удаления.  передаете туда массив id,  там формируете строку типа

$srt_id = implode(',',$arr_id);

и потом  where id in ( '". $str_id ." ')

  • +1 1
Надіслати
Поділитися на інших сайтах

если я правильно понял, то:

сделайте отдельную кнопку, например

.var-comments-delete

На её нажатие сделайте обработчик (тот скрипт оставьте на случай если надо будет поштучно удалять):

$('.var-comments-delete').click(function(){
		$.map( $(".box:checked"), function(el){ return $(el); }).each(function(){ //делаю предположение, что эта строка вытягивает нужные вам строки, (я бы написал по-другому, но не вижу код страницы, поэтому оставил так)
		
		gems = $(this).find('input');
		$.ajax({
			url: 'index.php?route=module/comments/deleteComment&token=<?php echo $token; ?>',
			type: 'post',
			data: gems,
			dataType: 'json',
			beforeSend: function() {
				console.log(gems);
			},
			error: function (json) {
				console.log(json);		
			},
			success: function(json) {
				console.log(json);		
				// location.reload();			
			}
		});
		return false;
	});
});

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

Надіслати
Поділитися на інших сайтах


47 минут назад, fanatic сказал:

если хотите удалять сразу несколько, то как-то так

Спасибо огромное)
Я около 12 часов эту мелочь ковырял)
кстати был в голове вариант с
 

data: $(".box:checked")

но я почемуто подумал что оно возмет только первый чекбокс:-D
учиться мне еще и учиться)

Змінено користувачем f4rr3ll1990
Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.