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

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

  1. symbol

    symbol

    Регистрация:
    12 фев 2020
    Сообщения:
    5
    Симпатии:
    0
    Пытаюсь добавить в карточку товара вывод аналогов каталожных номеров, сделал в базе таблицу аналогов написал запрос к БД, в консоли 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
    Сообщения:
    759
    Симпатии:
    374
    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 в 23:22
  3. symbol

    symbol

    Регистрация:
    12 фев 2020
    Сообщения:
    5
    Симпатии:
    0
    Спасибо,
    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
    Сообщения:
    431
    Симпатии:
    116
    @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
    Сообщения:
    5
    Симпатии:
    0
    Спасибо, все работает так как задумано. Далее думаю как лучше подтянуть товары по этим номерам в карточку товара
     
  6. symbol

    symbol

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

    symbol

    Регистрация:
    12 фев 2020
    Сообщения:
    5
    Симпатии:
    0
    Хочу из БД с помощью запроса вытянуть 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 /...
    скобка не нравится, пробовал убирать, тогда то же лезет ошибка, подскажите как правильно оформить