Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Sign Up

[Решено] Помогите с 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();



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

Edited by f4rr3ll1990
Link to post
Share on other sites

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

<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
Link to post
Share on other sites

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

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

.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;
	});
});

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

Link to post
Share on other sites

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

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

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

data: $(".box:checked")

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

Edited by f4rr3ll1990
Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.