Как узнать ID категории 1-го уровня у товара?

Допустим товар "Шнурок" лежит тут:,
Одежда
- Обувь
- - Кроссовки
- - - Аксессуары
- - - - Шнурки

Как узнать ID "Одежды", то есть самой первой его категории?

3 ответа

  • 0
    Написать хелпер, который получит id корневой категории
    wa-apps/shop/lib/classes/shopCustom.class.php

    <?php

    class shopCustom
    {

    public static function getParentCat($id = null)
    {
    $model = new shopCategoryModel();
    $cat = $model->getById($id);

    while($cat["parent_id"]!=0){
    $cat=$model->getById($cat[id]);
    }
    return $cat["id"];
    }

    }


    В html вызываем {shopCustom::getParentCat()}
    ---------------------------
    Код на ошибки не проверял, писал так сказать на память
    Идея в том, чтобы обращаться к родительской категории пока родительская будет равна 0
    Если что-то не получится в понедельник скину рабочий вариант, так как сам уже это делал
    • 0
      в вызов надо передавать id категории товара
      {shopCustom::getParentCat(идентификатор категории)}
    • 0
      koozoo koozoo 19 апреля 2014 15:43 #
      Спасибо за ответ, но забыл уточнить, что речь о SS5 в облаке.
    • +1
      Михаил Ушенин Михаил Ушенин Webasyst 14 августа 2015 07:03 #

      В вашем варианте выполняется несколько SQL-запросов в цикле. Лучше этого избежать, получив одним запросом сразу все категории и выбирая родительские категории в полученном массиве.

      • +1
        Михаил Ушенин Михаил Ушенин Webasyst 14 августа 2015 07:22 #

        Например, так можно сделать в шаблоне category.html:

        {$categories = $wa->shop->categories()}
        
        {$_ = reset($categories)}
        {while $current = current($categories)}
            {if $current.id == $category.id}
                {$found = $current}
                {$_ = prev($categories)}
                {while $current = current($categories)}
                    {if $current.id == $found.parent_id}
                        {$found = $current}
                    {/if}
                    {if $current.depth == 0}
                        {break}
                    {/if}
                    {$_ = prev($categories)}
                {/while}
                {break}
            {/if}
            {$_ = next($categories)}
        {/while}
        
        Название самой-самой родительской категории: {$found.name|escape|default:'none'}.
        
        • +2

          Можно даже ещё проще и чуть быстрее сделать:

          {$categories = $wa->shop->categories()}
          
          {$_ = reset($categories)}
          {while $current = current($categories)}
              {if $current.depth == 0}
                  {$top_parent = $current}
              {/if}
              {if $current.id == $category.id}
                  {break}
              {/if}
              {$_ = next($categories)}
          {/while}
          
          Название самой-самой родительской категории: {$top_parent.name|escape|default:'none'}.
  • 0
    это можно сделать в облаке ss5, дело в том, что будет слишком много лишних запросов к бд, что лучше этого не делать
  • 0
    Dmitry Starkoff 14 августа 2015 03:18 #

    У меня получилось без хелпера... в Smarty по тому же принципу:

    {$parentCat = $wa->shop->category($category.id)}
    {while $parentCat.parent_id != 0}
    {$parentCat = $wa->shop->category($parentCat.parent_id)}
    {/while}
    <h3>{$parentName = $wa->shop->category($parentCat.id)}{$parentName.name}</h3>

    Соотвественно чтобы получить пункты каталога:

    {$categories = $wa->shop->categories($parentCat.id, null, true)}

Добавить ответ

Чтобы добавить комментарий, зарегистрируйтесь или войдите