Joomla 2.5 Вывод товаров подкатегории в категории

Discussion in 'Управление товарами, атрибутами, свойствами и цена' started by Dark19, Jan 11, 2015.

  1. Dark19
    Offline

    Dark19 Пользователь

    Joined:
    Aug 18, 2014
    Messages:
    55
    Likes Received:
    0
    Добрый день. Подскажите как вывести товары подкатегории в категории вместо вывода категорий. В общем есть главная категория например: Отопление, в ней есть подкатегория 2-ого уровня - Котлы, а в ней еще несколько разных подкатегорий. Так вот как вывести в подкатегории Котлы вместо ее подкатегорий просто товары этих подкатегорий?
    Вот главная категория: http://aqualink.com.ua/otoplenie.html
     
  2.  
  3. AKopytenko
    Offline

    AKopytenko Russian Joomla! Team Staff Member

    Joined:
    Sep 1, 2011
    Messages:
    1,963
    Likes Received:
    168
    Gender:
    Male
    Тогда в чём вообще смысл делать подкатегории?
     
  4. Dark19
    Offline

    Dark19 Пользователь

    Joined:
    Aug 18, 2014
    Messages:
    55
    Likes Received:
    0
    там еще сортировка будет по этим подкатегориям отдельно
     
  5. AKopytenko
    Offline

    AKopytenko Russian Joomla! Team Staff Member

    Joined:
    Sep 1, 2011
    Messages:
    1,963
    Likes Received:
    168
    Gender:
    Male
    Ок...
    Вечером отпишусь :)
     
  6. Dark19
    Offline

    Dark19 Пользователь

    Joined:
    Aug 18, 2014
    Messages:
    55
    Likes Received:
    0
    ну так что, поможете?
     
  7. AKopytenko
    Offline

    AKopytenko Russian Joomla! Team Staff Member

    Joined:
    Sep 1, 2011
    Messages:
    1,963
    Likes Received:
    168
    Gender:
    Male
    да! на работе закрутился просто, забыл вообще про эту тему)
    щас...
     
  8. Dark19
    Offline

    Dark19 Пользователь

    Joined:
    Aug 18, 2014
    Messages:
    55
    Likes Received:
    0
    хорошо, жду...
     
  9. AKopytenko
    Offline

    AKopytenko Russian Joomla! Team Staff Member

    Joined:
    Sep 1, 2011
    Messages:
    1,963
    Likes Received:
    168
    Gender:
    Male
    Так и не смог сесть покопаться :)
    В общем смотри, если без API Virtuemart делать, то смысл такой:
    1. Получить ID всех дочерних категорий и сохранить их в массив. В файле
      Код (PHP):
      1. if (!empty($this->category->children)) {
      2.     $catIds = Array();
      3.     foreach ($this->category->children as $category) {
      4.         $catIds[] = $category->virtuemart_category_id;
      5.     }
      6. }
    2. Прогнать массив с ID категорий через цикл FOREACH. Внутри цикла запрос к базе: SELECT virtuemart_product_id FROM *****_virtuemart_product_categories WHERE virtuemart_category_id = ID_категории. По аналогии с п.1 каждую итерацию добавляем полученный результат с массив (например, $prodIds). Получим ID всех товаров вложенных категорий.
    3. Програть массив с ID товаров через цикл FOREACH. Внутри цикла запрос к базе: SELECT product_name,product_desc,slug FROM *****_virtuemart_product_ru_ru WHERE virtuemart_category_id = ID_товара
    Логика такая. Главное - получить ID товара, а дальше просто запросы к базе и выборка нужных полей из нужных таблиц по ID товара.
    Но в целом это волокита, т.к. у VM2 есть свой API, используя который можно просто вставлять ID категорий или товаров в функцию и получать их объект со всеми свойствами. Не нашёл сегодня как сделать, может на неделе ещё время будет! Или напиши на форум Virtuemart тему "Как получить объект товара через API Virtuemart 2?" :)
     
  10. Dark19
    Offline

    Dark19 Пользователь

    Joined:
    Aug 18, 2014
    Messages:
    55
    Likes Received:
    0
    Написал вот так:
    Код (PHP):
    1. <?php if (!empty($this->category->children)) {
    2. $catIds = Array();
    3. foreach ($this->category->children as $category) {
    4. $catIds[] = $category->virtuemart_category_id;
    5. }
    6. }if (!empty($this->category->children)) {
    7. foreach ($catIds as $item) {
    8. $prodIds = mysql_query("SELECT virtuemart_product_id FROM c9qo6_virtuemart_product_categories WHERE virtuemart_category_id = $item");
    9. }
    10. }
    11. while($row = mysql_fetch_array($prodIds)){
    12. $item2 = $row['virtuemart_product_id'];
    13. $pr = mysql_query("SELECT product_name, product_desc, slug FROM c9qo6_virtuemart_products_ru_ru WHERE virtuemart_product_id = $item2");
    14. }
    15. while($r = mysql_fetch_array($pr)){echo $r['product_name'];echo $r['product_desc'];echo $r['slug'];
    16. }
    17. ?>

    но выводит только 1 товар
     
  11. AKopytenko
    Offline

    AKopytenko Russian Joomla! Team Staff Member

    Joined:
    Sep 1, 2011
    Messages:
    1,963
    Likes Received:
    168
    Gender:
    Male
    Ну, по меньшей мере не нужно использовать запросы к базе в чистом виде...
    Узнать ID товаров подкатегорий можно так:
    Код (PHP):
    1. if (!empty($this->category->children)) {
    2.  
    3.     $catIds = Array();
    4.     foreach ($this->category->children as $category) {
    5.         $catIds[] = $category->virtuemart_category_id;
    6.     }
    7.  
    8.     $prodIds = Array();
    9.     $db = JFactory::getDbo();
    10.     foreach ($catIds as $catId) {
    11.  
    12.         $query->select('virtuemart_product_id');
    13.         $query->from('c9qo6_virtuemart_product_categories');
    14.         $query->where('virtuemart_category_id = '.$catId);
    15.  
    16.         $db->setQuery($query);
    17.         $results = $db->loadObjectList();
    18.  
    19.         $prodIds[] = $result->virtuemart_product_id;
    20.  
    21.     }
    22. }
     
  12. Dark19
    Offline

    Dark19 Пользователь

    Joined:
    Aug 18, 2014
    Messages:
    55
    Likes Received:
    0
    что-то стили слетели и крокозябры полезли после этого кода
     
  13. Dark19
    Offline

    Dark19 Пользователь

    Joined:
    Aug 18, 2014
    Messages:
    55
    Likes Received:
    0
    Подправил немного Ваш код, заработало, но все равно не выводит айдишники продуктов, пишет null. Проследил путь где не передаются данные в переменные:
    Код (PHP):
    1. $results = $db->loadObjectList();

    Но не могу понять почему, вроде бы, все правильно...
     
  14. woojin
    Offline

    woojin Местный Staff Member => Cпециалист <=

    Joined:
    May 31, 2009
    Messages:
    3,204
    Likes Received:
    334
    Gender:
    Male
    вообще не понятно (из последнего кода) на фига каждый ID передавать в запрос что что бы получить все ID из категории
    проще уж сделать так:
    Код (PHP):
    1. $cids = explode(',', $catIds);
    2. if (count($catIds)>1) {
    3.    $ids = " IN ($cids)";
    4. } else {
    5.    $ids = " = $cids";
    6. }
    7. $query->where('virtuemart_category_id '.$ids);

    таким кодом меньше будет грузиться БД
    и у класса QUERY есть хорошая функция которая выдаёт полностью сформированный SQL запрос который потом можно проверить в PhpMyAdmin:
    Код (PHP):
    1. $sql = $query->__toString();

    или "эхни" (echo) эту переменную ($sql) или если работаешь с дубугером просто тормозни после данной строки возьми сформированный запрос и проверь его

    P.S. не забудь заменить "#__" на свой префикс таблиц
     
    Dark19 likes this.
  15. Dark19
    Offline

    Dark19 Пользователь

    Joined:
    Aug 18, 2014
    Messages:
    55
    Likes Received:
    0
    Это конечно, хорошо, но я не могу никак вывести товары в главную категорию вместо вывода категорий. Мне бы хоть как-то их айдишники повытягивать, чтобы их вывести.
     
  16. woojin
    Offline

    woojin Местный Staff Member => Cпециалист <=

    Joined:
    May 31, 2009
    Messages:
    3,204
    Likes Received:
    334
    Gender:
    Male
    этот код выдаёт тебе список всех ID которые указаны в списке категорий $catIds
    что именно не получается?
    не знаешь куда дальше вставлять полученный список ID товаров?
     
  17. Dark19
    Offline

    Dark19 Пользователь

    Joined:
    Aug 18, 2014
    Messages:
    55
    Likes Received:
    0
    Ваш код выдает вот такой запрос:
    Код (PHP):
    1. SELECT virtuemart_product_id,virtuemart_product_id,virtuemart_product_id,virtuemart_product_id,virtuemart_product_id,virtuemart_product_id FROM c9qo6_virtuemart_product_categories,c9qo6_virtuemart_product_categories,c9qo6_virtuemart_product_categories,c9qo6_virtuemart_product_categories,c9qo6_virtuemart_product_categories,c9qo6_virtuemart_product_categories WHERE virtuemart_category_id = 5 AND virtuemart_category_id = 6 AND virtuemart_category_id = 7 AND virtuemart_category_id = 8 AND virtuemart_category_id = 9 AND virtuemart_category_id = 4 AND virtuemart_category_id IN ()


    Не могу понять, что с ним дальше делать?
     
  18. woojin
    Offline

    woojin Местный Staff Member => Cпециалист <=

    Joined:
    May 31, 2009
    Messages:
    3,204
    Likes Received:
    334
    Gender:
    Male
    мой код используется без цикла ;)

    для начинающих, показываю:
    Код (PHP):
    1. if (!empty($this->category->children)) {
    2.  
    3.     $catIds = Array();
    4.     foreach ($this->category->children as $category) {
    5.         $catIds[] = $category->virtuemart_category_id;
    6.     }
    7.  
    8.        $cids = explode(',', $catIds);
    9.        if (count($catIds)>1) {
    10.           $ids = " IN ($cids)";
    11.        } else {
    12.           $ids = " = $cids";
    13.        }
    14.         $query->select('virtuemart_product_id');
    15.         $query->from('c9qo6_virtuemart_product_categories');
    16.         $query->where('virtuemart_category_id '.$ids);
    17.  
    18.        $sql = $query->__toString();
    19.  
    20.         $db->setQuery($query);
    21.         $results = $db->loadObjectList();
    22.  
    23.         $prodIds[] = $result->virtuemart_product_id;
    24.  
    25.     }
    26. }

    ещё вопросы?
     
  19. Dark19
    Offline

    Dark19 Пользователь

    Joined:
    Aug 18, 2014
    Messages:
    55
    Likes Received:
    0
    код не работал, крокозябры выдавал и стилей не было, то есть что-то неправильно было там. Я добавил 2 строчки
    Код (PHP):
    1. $db = JFactory::getDbo();$query = $db->getQuery(true);


    перед запросами к базе и заработало, но $prodIds выводит null
     
  20. woojin
    Offline

    woojin Местный Staff Member => Cпециалист <=

    Joined:
    May 31, 2009
    Messages:
    3,204
    Likes Received:
    334
    Gender:
    Male
    какие на фиг стили?
    к тому же (если мне память не изменяет) это $db->loadObjectList(); выдаёт список объектов, а не в одном объекте список полей в котором есть одно поле с именем virtuemart_product_id
    если уж очень хочется объект перевести в массив то сделай так $prodIds= (array)$db->loadObjectList();
    но лучше использовать спец. класс(JArray) для работы с массивами, там есть функция преобразования объекта в массив
     
  21. Dark19
    Offline

    Dark19 Пользователь

    Joined:
    Aug 18, 2014
    Messages:
    55
    Likes Received:
    0
    только что проверял
    Код (PHP):
    1. var_dump($sql);


    идет вот такой запрос
    Код (sql):
    1. SELECT virtuemart_product_id FROM c9qo6_virtuemart_product_categories WHERE virtuemart_category_id IN ()

    $ids я так понял пустое
     

Share This Page

Loading...