Разделы
Теги | RSS © 2008 – 2017
Контакты
email: igor@veselov.sumy.ua
skype: utz0r2
» » smarty

Список товаров в категории ShopOS


Список товаров в категории ShopOS

Немного теории:
http://www.getinfo.ru/article610.html - крутая статья!
http://phpclub.ru/detail/article/db_tree

По топику понятно, что он посвящён именно двигу ShopOS. Классный, в бесплатной сборке он идет без почты (функция умело удалена), но имея гугл и сноровку можно допилить его, что бы он заработал как полнофункциональный магазинчик. Дальше о категориях.

Для начало нужно было получить вот такое меню:
Список товаров в категории ShopOS

Что бы при нажатии на главную категорию выпадал список товаров. Не долго мучаясь отписал на официальном форуме . Увы ответов не получил, готовых решений нет. Понял, что придётся самому.

С ЧПУ (вставить в index.html вашего шаблона):
<ul id="my-menu">
        {php}        
        $sql = "SELECT cat.categories_id, cd.categories_name FROM vip_categories cat, vip_categories_description cd WHERE cat.categories_status = '1' AND cd.categories_id = cat.categories_id";
        $sql = osDBquery($sql);
        while ($row = os_db_fetch_array($sql)) {
                $menu[$row['categories_id']] = $row['categories_name'];
        }
        foreach ($menu as $CatId => $CatName )
        {
            echo "<li><a href=\"#\">".$CatName."</a>";
            echo "<ul>";
                $query = "SELECT * FROM
                    vip_products p,
                    vip_products_description pd,
                    vip_products_to_categories p2c,
                    vip_categories c
                WHERE
                    c.categories_status='1'
                    and p.products_status = '1'
                    and p.products_id = p2c.products_id
                    and p.products_id=pd.products_id
                    and p2c.categories_id = '".$CatId."'
                    and c.categories_id = '".$CatId."'
                ORDER by p.products_date_added";
                $query = osDBquery($query);
                while ($row1 = os_db_fetch_array($query)) {
                    echo "<li><a href=\"{$row1['products_page_url']}\">".$row1['products_name']."</a></li>";
                }
            echo "</ul></li>";
        }
        {/php}            
</ul>


На выходе:
<ul>
    <li><a href="#">Категория 1</a>
        <ul>
            <li><a href="url">Товар 1</a></li>
            <li><a href="url">Товар 2</a></li>
            <li><a href="url">Товар 3</a></li>
        </ul>
    </li>
    <li><a href="#">Категория 2</a></li>
</ul>


Оказалось что необходимость в данном меню отпадает, но появляется новая!
Список товаров в категории ShopOS

Класс! Теперь есть еще уровень вложенности.

С ЧПУ (вставить в index.html вашего шаблона):
<ul id="my-menu">
{php}
$sql = "SELECT cat.categories_id, cat.parent_id, cat.categories_url, cd.categories_name FROM vip_categories cat, vip_categories_description cd WHERE cat.categories_status = '1' AND cd.categories_id = cat.categories_id ORDER BY cat.parent_id, cat.categories_id";
$sql = osDBquery($sql);
while ($row = os_db_fetch_array($sql)) {
        $menu[$row['parent_id']][$row['categories_id']] = $row['categories_name'];
}
foreach ($menu[0] as $CatId => $CatName )
{
 echo "<li><a href=\"#\">".$CatName."</a>";
 if (isset($menu[$CatId])) {
        echo "<ul>";
         foreach ($menu[$CatId] as $ItemId => $ItemName)
         {
          echo "<li><a href=\"#\">".$ItemName."</a>";
          echo "<ul>";
                $query = "SELECT * FROM
                        vip_products p,
                        vip_products_description pd,
                        vip_products_to_categories p2c,
                        vip_categories c
                WHERE
                        c.categories_status='1'
                        and p.products_status = '1'
                        and p.products_id = p2c.products_id
                        and p.products_id=pd.products_id
                        and p2c.categories_id = '".$ItemId."'
                        and c.parent_id = '".$CatId."'
                ORDER by p.products_date_added";
                $query = osDBquery($query);
                while ($row1 = os_db_fetch_array($query)) {
                        echo "<li><a href=\"{$row1['products_page_url']}\">".$row1['products_name']."</a></li>";
                }  
           echo "</ul>";
          echo "</li>";
         }
        echo "</ul></li>";
 } else { echo "</li>";}
}
{/php}
</ul>


На выходе:
<ul>
    <li><a href="#">Категория 1</a>
        <ul>
            <li><a href="#">ПодКатегория 1</a>
                <ul>
                    <li><a href="url">Товар 1</a></li>
                    <li><a href="url">Товар 2</a></li>
                    <li><a href="url">Товар 3</a></li>
                </ul>
            </li>
        </ul>
    </li>
    <li><a href="#">Категория 2</a></li>
</ul>



Мне ЧПУ не надо - БЕЗ ЧПУ (вставить в index.html вашего шаблона):

<ul id="my-menu">
{php}
$sql = "SELECT cat.categories_id, cat.parent_id, cat.categories_url, cd.categories_name FROM vip_categories cat, vip_categories_description cd WHERE cat.categories_status = '1' AND cd.categories_id = cat.categories_id ORDER BY cat.parent_id, cat.categories_id";
$sql = osDBquery($sql);
while ($row = os_db_fetch_array($sql)) {
        $menu[$row['parent_id']][$row['categories_id']] = $row['categories_name'];
}
foreach ($menu[0] as $CatId => $CatName )
{
 echo "<li><a href=\"/index.php?cat={$CatId}\">".$CatName."</a>";
 if (isset($menu[$CatId])) {
        echo "<ul>";
         foreach ($menu[$CatId] as $ItemId => $ItemName)
         {
          echo "<li><a href=\"/index.php?cat={$ItemId}\">".$ItemName."</a>";
          echo "<ul>";
                $query = "SELECT * FROM
                        vip_products p,
                        vip_products_description pd,
                        vip_products_to_categories p2c,
                        vip_categories c
                WHERE
                        c.categories_status='1'
                        and p.products_status = '1'
                        and p.products_id = p2c.products_id
                        and p.products_id=pd.products_id
                        and p2c.categories_id = '".$ItemId."'
                        and c.parent_id = '".$CatId."'
                ORDER by p.products_date_added";
                $query = osDBquery($query);
                while ($row1 = os_db_fetch_array($query)) {
                        //echo "<pre>";
                        //print_r($row1);
                        //echo "</pre>";
                        echo "<li><a href=\"/product_info.php?products_id={$row1['products_id']}\">".$row1['products_name']."</a></li>";
                }  
           echo "</ul>";
          echo "</li>";
         }
        echo "</ul></li>";
 } else { echo "</li>";}
}
{/php}
</ul>


На выходе:
<ul>
    <li><a href="/index.php?cat=ID">Категория 1</a>
        <ul>
            <li><a href="/index.php?cat=ID">ПодКатегория 1</a>
                <ul>
                    <li><a href="/product_info.php?products_id=ID">Товар 1</a></li>
                    <li><a href="/product_info.php?products_id=ID">Товар 2</a></li>
                    <li><a href="/product_info.php?products_id=ID">Товар 3</a></li>
                </ul>
            </li>
            <li><a href="/index.php?cat=ID">ПодКатегория 2</a></li>
            <li><a href="/index.php?cat=ID">ПодКатегория 3</a></li>
        </ul>
    </li>
    <li><a href="#">Категория 2</a></li>
</ul>

Получили что хотели, на не совсем так. Теперь я не могу попасть в раздел КАТЕГОРИИ, он то не кликабельный (я использую ява меню при клике на категорию выпадает вложенный UL), а это существенно и в ТЗ прописано.

Поэтому этот вариант мне не подходит, совсем. Будем работать с {$box_CATEGORIES}.

Идем в наш_сайт\themes\наш_шаблон\source\inc\show_category.inc.php. Проверяем что бы параметр $MaxLevel равен был 1, это значит, что по умолчанию будет показываться 1 уровень вложенности.
В том же файлике находим:
if ($old_level > $level) {

и после вставляем:
                        if ( isset($GLOBALS['cPath']) ) { 
                            if ( !strpos($GLOBALS['cPath'], "_")===false ) {
                            $path = explode('_',$GLOBALS['cPath']);
                                $query = "SELECT * FROM
                                    vip_products p,
                                    vip_products_description pd,
                                    vip_products_to_categories p2c,
                                    vip_categories c
                                WHERE
                                    c.categories_status='1'
                                    and p.products_status = '1'
                                    and p.products_id = p2c.products_id
                                    and p.products_id=pd.products_id
                                    and p2c.categories_id = '".$path[1]."'
                                    and c.parent_id = '".$path[0]."'
                                ORDER by p.products_date_added";
                                $query = osDBquery($query);
                                $categories_string .= "<ul>";
                                while ($row1 = os_db_fetch_array($query)) {
                                    $categories_string .= "<li><a href=\"/product_info.php?products_id={$row1['products_id']}\">".$row1['products_name']."</a></li>";
                                }      
                                $categories_string .= "</ul>";
                            }
                        }

Итого: если есть параметр cPath (он показывает категорию текущую), то смотрим вложенная она, если да, то разбиваем и получаем айди категории и подкатегории. А дальше запрос - рисуем список.
Список товаров в категории ShopOS

Теперь, когда вы нажимаете на подкатегорию выпадает еще и список товаров. Оптимизируйте и ковыряйте -) Да и не забудьте в коде поменять префикс БД на свой.

UPD 02.09.11. для еще одного уровня + оптимизирован код.
вставить в оригинальный файл show_category.inc.php после ( $foo[$cid]['name'].$ProductsCount. ''; - 114 строчка)
                        if ($level == 3) {
                            if ( !empty($Aktiv)) {
                                //$categories_string .= $cid;
                                $query = "SELECT * FROM
                                    vip_products_to_categories p2c,
                                    vip_products p,
                                    vip_products_description pd
                                WHERE
                                    p2c.categories_id = '".$cid."'
                                    and p.products_status = '1'
                                    and p.products_id = p2c.products_id
                                    and p.products_id=pd.products_id
                                ORDER by p.products_date_added";
                                $query = osDBquery($query);
                                $categories_string .= "<ul>";
                                while ($row1 = os_db_fetch_array($query)) {
                                    $categories_string .= "<li />[url=/product_info.php?products_id={$row1[]".$row1['products_name']."[/url]";
                                }      
                                $categories_string .= "</ul>";
                            }
                        }
Вверх