Помогите разобраться с выводом дополнительной информации в карточку товара

Тема в разделе "OpenCart", создана пользователем symbol, 12 фев 2020.

  1. symbol

    symbol

    Регистрация:
    12 фев 2020
    Сообщения:
    7
    Симпатии:
    1
    Пытаюсь добавить в карточку товара вывод аналогов каталожных номеров, сделал в базе таблицу аналогов написал запрос к БД, в консоли phpmayadmin проверял все работает как нужно, но не получается сделать вывод в карточку товара.
    в моделе сделал запрос к БД

    public function getProductCross($product_id) {
    $query = $this->db->query("SELECT copy_number FROM oc_product JOIN oc_my_cross ON model = orig_number WHERE model = '7701477028'");
    return $query->rows;

    в контроллере
    $data['cross_list'] = $this->model_catalog_product->getProductCross($product_id);

    в tpl делаю так

    <?php if ($cross_list) { ?>
    <?php foreach ($cross_list as $cros_name) { ?>
    <li><?php echo $cros_name['name']; ?></li>
    <?php } ?>
    <?php } ?>

    на сайте получаю ошибку Notice: Undefined index: name in.....
    не могу сообразить что поправить в tpl
     
  2. Baco

    Baco Антихронофаг Команда форума

    Регистрация:
    9 окт 2012
    Сообщения:
    803
    Симпатии:
    399
    PHP:
    public function getProductCross($product_id) {
        
    $query $this->db->query("SELECT mc.copy_number as name FROM " DB_PREFIX "product p
            LEFT JOIN " 
    DB_PREFIX "my_cross mc ON (p.model = mc.orig_number)
                WHERE p.product_id = '"
    .(int)$product_id."'");
        if (
    $query->num_rows) {
            return 
    $query->row;
        } else {
            return 
    '';
        }  
    }
    [​IMG]
     
    Последнее редактирование: 13 фев 2020
  3. symbol

    symbol

    Регистрация:
    12 фев 2020
    Сообщения:
    7
    Симпатии:
    1
    Спасибо,
    INNER JOIN то же работает, по крайней мере в mysql, LEFT JOIN показывают одинаковый результат. Возможно LEFT JOIN будет более уместным, но я когда разбирался в этом пришел к выводу что INNER JOIN нужен. Не могли бы прояснить, . DB_PREFIX . для чего, в сети так и не нашел что это и с чем его едят)).
    Еще вопрос (int)$product_id, я так понимаю это id продукта в котором мы находимся приведенный к числовому значению?
    У меня сравнение в таблицах идет не по id а по модели, применимо ли это для такого? Мне ведь нужно выводить аналог по модели а не по product_id, в моделе каталожный номер детали.

    В таком виде выдает ошибку: Warning: Illegal string offset 'name' in....
     
  4. chukcha

    chukcha

    Регистрация:
    9 окт 2014
    Сообщения:
    448
    Симпатии:
    119
    @Baco в данном случае нужен JOIN (inner join)
    Т.е. получить полное соответствие

    Все эти картинки просто запутывают и не дают полного понимания соеденений


    меняем на

    Код:
    public function getProductCross($product_id) {
        $query = $this->db->query("SELECT mc.copy_number as name FROM " . DB_PREFIX . "my_cross mc
            LEFT JOIN " . DB_PREFIX . "product p ON (p.model = mc.orig_number)
                WHERE p.product_id = '".(int)$product_id."'");
    
            return $query->rows;
    }
    И тогда мы получим кортеж из соответствующих моделей/номеров из my_cross





    Тогда это должно работать

    Код:
    <?php if ($cross_list) { ?>
    <?php foreach ($cross_list as $cros_name) { ?>
    <li><?php echo $cros_name['name']; ?></li>
    <?php } ?>
    <?php } ?>
    
     
  5. symbol

    symbol

    Регистрация:
    12 фев 2020
    Сообщения:
    7
    Симпатии:
    1
    Спасибо, все работает так как задумано. Далее думаю как лучше подтянуть товары по этим номерам в карточку товара
     
  6. symbol

    symbol

    Регистрация:
    12 фев 2020
    Сообщения:
    7
    Симпатии:
    1
    Посоветуйте, как лучше реализовать следующее, после получения аналога товара в карточке товара, эти номера сделать ссылками на товар, тогда получится дополнительная ссылка внутри магазина, это вроди не совсем хорошо, или делать дополнительный запрос к БД на основании полученного результата выводить конкретный товар который соответствует номеру аналога и в карточку выводить уже товар, по типу рекомендуемых товаров, т.е. открыли карточку товара и в ней ниже аналоги товаров.
     
  7. symbol

    symbol

    Регистрация:
    12 фев 2020
    Сообщения:
    7
    Симпатии:
    1
    Хочу из БД с помощью запроса вытянуть product_id на основании полученного номера аналога из предыдущего запроса, что б потом на основании product_id вывести товар.
    Составил запрос к БД с подзапросом такого вида:

    SELECT model, product_id
    FROM oc_product
    WHERE model = ANY (SELECT copy_number
    FROM oc_product
    JOIN oc_my_cross
    ON model = orig_number
    WHERE model = '7701477028')
    в mysql при вводе в консоль работает отлично
    оформляю его в файле:

    public function getProductCross($product_id) {
    $query = $this->db->query("SELECT p.product_id FROM" . DB_PREFIX . "oc_product op WHERE p.model = ANY"("SELECT mc.copy_number as name FROM " . DB_PREFIX . "my_cross mc LEFT JOIN " . DB_PREFIX . "product p ON (p.model = mc.orig_number)
    WHERE p.product_id = '".(int)$product_id."'"));

    return $query->rows;
    }

    выдает ошибку синтаксическую Parse error: syntax error, unexpected '(' in /...
    скобка не нравится, пробовал убирать, тогда то же лезет ошибка, подскажите как правильно оформить
     
  8. symbol

    symbol

    Регистрация:
    12 фев 2020
    Сообщения:
    7
    Симпатии:
    1
    Разобрался уже,
    public function getProductCross($product_id) {
    $query = $this->db->query("SELECT p.product_id FROM " . DB_PREFIX . "product p WHERE p.model = ANY (SELECT mc.copy_number as name FROM " . DB_PREFIX . "my_cross mc LEFT JOIN " . DB_PREFIX . "product p ON (p.model = mc.orig_number)
    WHERE p.product_id = '".(int)$product_id."')");

    return $query->rows;
    }

    так работает
     
    Baco нравится это.
  9. symbol

    symbol

    Регистрация:
    12 фев 2020
    Сообщения:
    7
    Симпатии:
    1
    если делать по аналогии с похожими товарами, т.е. что б отображались фото товара, модель, производитель, цена и название, нужно в запросе добавить еще вывод этих полей.
    получится вот так:
    public function getProductCross($product_id) {
    $query = $this->db->query("SELECT p.product_id, p.image, p.price, p.model, (SELECT md.name FROM " . DB_PREFIX . "manufacturer_description md WHERE md.manufacturer_id = p.manufacturer_id AND md.language_id = '" . (int)$this->config->get('config_language_id') . "') AS manufacturer, (SELECT pd.name FROM " . DB_PREFIX . "product_description pd WHERE pd.product_id = p.product_id ) AS name FROM " . DB_PREFIX . "product p WHERE p.model = ANY (SELECT mc.copy_number as name FROM " . DB_PREFIX . "my_cross mc LEFT JOIN " . DB_PREFIX . "product p ON (p.model = mc.orig_number)
    WHERE p.product_id = '".(int)$product_id."')");
    return $query->rows;
    }