[Помогите] Переделать "добавить в сравнение"

Тема в разделе "OpenCart", создана пользователем alex5151, 19 апр 2013.

  1. alex5151

    alex5151

    Регистрация:
    15 ноя 2012
    Сообщения:
    165
    Симпатии:
    26
    Стоит задача переделать механизм добавления товаров в сравнение. А именно заменить стандартную ссылку "добавить в сравнение" чекбоксом.
    Заменил:
    Код:
    <a onclick="addToCompare('<?php echo $product['product_id']; ?>');">
    
    на это:
    Код:
    <input type="checkbox" onclick="addToCompare('<?php echo $product['product_id']; ?>');">
    
    В результате товар добавляется в сравнение, однако этого недостаточно. Отмеченные чекбоксы при обновлении страницы становятся не отмеченными. Плюс ко всему необходимо реализовать удаление из списка сравнения путём снятия чекбокса.
    Нуждаюсь в помощи знающих людей, или может кто видел готовое решение. Буду очень признателен.
     
  2. alex5151

    alex5151

    Регистрация:
    15 ноя 2012
    Сообщения:
    165
    Симпатии:
    26
    Так и не нашёл решение задачи(
    Как вариант подошло бы, чтобы при нажатии на ссылку "в сравнение" она менялась на ссылку "удалить из сравнения" с соответствующей её названию функцией.
    Странно что вопрос до сих пор не поднимался, это же как минимум не логично, когда не видно добавлен товар в сравнение или нет.
    Подскажите хоть в какую сторону копать или поделитесь опытом, если уже реализовывали такое. Думаю будет полезно многим.
     
  3. alex5151

    alex5151

    Регистрация:
    15 ноя 2012
    Сообщения:
    165
    Симпатии:
    26
    Всё ещё пытаюсь добиться желаемого, а именно вывести на странице категории кнопку "удалить из сравнения". Решил действовать по аналогии с кнопкой "добавить в сравнение"
    в category.php после
    Код:
    $this->data['button_compare'] = $this->language->get('button_compare');
    добавил
    Код:
    $this->data['button_compare_remove'] = $this->language->get('button_compare_remove');
    в russian.php после
    Код:
    $_['button_compare']		= 'В сравнение';
    добавил
    Код:
    $_['button_compare_remove'] = 'Удалить';
    в category.tpl это
    Код:
    <div class="compare"><a onclick="addToCompare('<?php echo $product['product_id']; ?>');"><?php echo $button_compare; ?></a></div>
    заменил на
    Код:
    <div class="compare">
    <a onclick="addToCompare('<?php echo $product['product_id']; ?>');"><?php echo $button_compare; ?></a>
    <a onclick="remFromCompare('<?php echo $product['product_id']; ?>');"><?php echo $button_compare_remove; ?></a>
    </div>
    В common.js создал функцию remFromCompare. По аналогии с функцией addToCompare получается
    Код:
    function remFromCompare(product_id) {
    $.ajax({
    url: 'index.php?route=product/compare/remove',
    type: 'post',
    data: 'product_id=' + product_id,
    dataType: 'json',
    success: function(json) {
    $('.success, .warning, .attention, .information').remove();
     
    if (json['success']) {
    $('#notification').html('<div class="success" style="display: none;">' + json['success'] + '<img src="catalog/view/theme/default/image/close.png" alt="" class="close" /></div>');
     
    $('.success').fadeIn('slow');
     
    $('#compare-total').html(json['total']);
     
    $('html, body').animate({ scrollTop: 0 }, 'slow');
    }
    }
    });
    }
    Далее в compare.php создал функцию public function remove по аналогии с public function add
    Что менять в public function remove я не знаю.
    У кого-нибудь есть идеи? Или может что-то не так делаю и можно сделать иначе?
     
  4. kama812

    kama812

    Регистрация:
    30 мар 2013
    Сообщения:
    311
    Симпатии:
    194
    млять, написал здоровый пост, нажал наверно куда то, перешел по ссылке, восстнавливать всё влом
    смотри, в compare.php уже есть функция удаления из сравнения. только она идет на get, вот в свою public function remove

    ставишь
    public function remove() {
    if (isset($this->request->post['product_id'])) {
    $key = array_search($this->request->post['product_id'], $this->session->data['compare']);
    $json = array();
    if ($key !== false) {
    unset($this->session->data['compare'][$key]);

    $this->load->model('catalog/product');
    $product_info = $this->model_catalog_product->getProduct($this->request->post['product_id']));
    //ну и соответственно создай
    $json['success'] = 'Товар '.$product_info['name'].' удален из сравнения!'
    }

    }
    $this->response->setOutput(json_encode($json));
    }

    может где то ошибся, сам не проверял, смысл такой, приходит номер продукта постом на функцию remove(), проверяется есть ли номер в массиве сравнения, лежащем в сессии, если есть
    то удаляется из массива, смотрится имя продукта, чтоб послать его в сообщении об успехе, формируется сообщение, отправляется json
    хорошо бы еще дописать сообщение об ошибки если номер не найден в массиве, по языкам я не проводил, так что придется перекодировать файл в utf8 без bom
     
    alex5151 нравится это.
  5. alex5151

    alex5151

    Регистрация:
    15 ноя 2012
    Сообщения:
    165
    Симпатии:
    26
    Ура, заработало. только убрал лишнюю скобку и добавил недостающую точку с запятой. Большое спасибо.
     
  6. Alexandr

    Alexandr

    Регистрация:
    6 ноя 2012
    Сообщения:
    178
    Симпатии:
    52
    alex5151, может поделишься, что исправил/добавил?
     
  7. kur1977

    kur1977

    Регистрация:
    11 фев 2013
    Сообщения:
    123
    Симпатии:
    59
    Ага. Только сделал ли топикстартер такую фишку, чтобы это "убрать из сравнения" выводилось только у тех товаров, которые в этом сравнении находятся. ?????
     
  8. alex5151

    alex5151

    Регистрация:
    15 ноя 2012
    Сообщения:
    165
    Симпатии:
    26
    Если использовать только один язык то достаточно
    в \catalog\view\theme\Ваша тема\template\product\category.tpl
    это
    Код:
    <div class="compare"><a onclick="addToCompare('<?php echo $product['product_id']; ?>');"><?php echo $button_compare; ?></a></div>
    заменить на это
    Код:
    <div class="compare">
    <a onclick="addToCompare('<?php echo $product['product_id']; ?>');"><?php echo $button_compare; ?></a>
    <a onclick="remFromCompare('<?php echo $product['product_id']; ?>');">Удалить</a>
    </div>
    не забыть поменять кодировку category.tpl на UTF-8 без BOM

    Далее в \catalog\view\javascript\common.js
    в самом конце добавить это
    Код:
    function remFromCompare(product_id) {
    $.ajax({
    url: 'index.php?route=product/compare/remove',
    type: 'post',
    data: 'product_id=' + product_id,
    dataType: 'json',
    success: function(json) {
    $('.success, .warning, .attention, .information').remove();
     
    if (json['success']) {
    $('#notification').html('<div class="success" style="display: none;">' + json['success'] + '<img src="catalog/view/theme/default/image/close.png" alt="" class="close" /></div>');
     
    $('.success').fadeIn('slow');
     
    $('#compare-total').html(json['total']);
     
    $('html, body').animate({ scrollTop: 0 }, 'slow');
    }
    }
    });
    }
    
    Далее в \catalog\controller\product\compare.php
    в коце файла перед
    Код:
    }
    ?>
    добавить это
    Код:
     public function remove() {
    if (isset($this->request->post['product_id'])) {
    $key = array_search($this->request->post['product_id'], $this->session->data['compare']);
    $json = array();
    if ($key !== false) {
    unset($this->session->data['compare'][$key]);
    $this->language->load('product/compare');
    $this->load->model('catalog/product');
    $product_info = $this->model_catalog_product->getProduct($this->request->post['product_id']);
    $json['success'] = 'tovar '.$product_info['name'].'Удалён';
    $json['total'] = sprintf($this->language->get('text_compare'), (isset($this->session->data['compare']) ? count($this->session->data['compare']) : 0));
    }
    }
    $this->response->setOutput(json_encode($json));
    }
    
    кодировку compare.php поменять на UTF-8 без BOM

    Эту "фишку" до конца не сделал. При Использовании hide/show работает, однако при обновлении страницы всё сбрасывается Если кто знает как это сделать прошу поделится.
     
  9. kama812

    kama812

    Регистрация:
    30 мар 2013
    Сообщения:
    311
    Симпатии:
    194
    в контроллере категории перед
    $this->data['products'][] = array(
    нужно добавить

    $in_compare = 0;
    if (isset($this->session->data['compare'])) {
    $key = array_search($result['product_id'], $this->session->data['compare']);
    if ($key !== false) {
    $in_compare = 1;
    }

    }

    далее В $this->data['products'][] = array(
    добавить
    'in_compare' => $in_compare,

    получается что если продукт в сравнении, то в шаблоне категории у продукта $product['in_compare'] будет равно 1
    отсюда выводим код который необходим
    <?php if ($product['in_compare'] == 1) { ?>
    код кнопки для удаления продукта из сравнения
    <?php } ?>


    думаю для упрощения жизни код кнопок (и добавить в сравнении и кнопки убрать из сравнения) ваще не убирать со страницы, а в зависимости от php прятать его
    прятать его

    <?php if ($product['in_compare'] == 1) { ?>
    style="dispaly:block"
    <?php } else { ?>
    style="dispaly:none"
    <?php } ?>
    или прятать классами, как хотите
    тогда будет просто в js функции добавить появление одной и исчезновение другой кнопки, так сказать что б сразу было видно
     
    alex5151 нравится это.
  10. angur

    angur

    Регистрация:
    21 окт 2013
    Сообщения:
    20
    Симпатии:
    1
    А можно демо посмотреть? Хочу понять для себя насколько это полезно или нет