Display all categories on product page Prestashop

David Jindra picture David Jindra · Oct 27, 2014 · Viewed 17.3k times · Source

I need to get list of all categories and their ids on product page in Prestashop (I am using v 1.6.0.9).

I tried to do something like this:

$other_categories = $something->getCategories($this->context->language->id, 1, 100);

foreach($other_categories as something)
{   
    // now if the id of the category isnt "1", display name of category
    if($category->id != "1") { $category->name }
} 

But, this is not working.

$category->name gives me only the name of current open category, not the name of each category in the list. I don't know what to put instead of something? And it works only, when I use $category->getProducts. Here you have my shop (see "related products").

It is my third shop and I am struggling with this problem for two days.

Answer

jave.web picture jave.web · Aug 29, 2015

In PS 1.6 there is a Category class, it contains some handy static methods usable in your controller: getCategories(...), getNestedCategories(...), getSimpleCategories - these are all static (and public) sou you call them like Category::funcName(...)

For your purpose I thing the best option would be getNestedCategories() which has this header:

public static function getNestedCategories(
   $root_category = null,
   $id_lang = false,
   $active = true,
   $groups = null,
   $use_shop_restriction = true,
   $sql_filter = '',
   $sql_sort = '',
   $sql_limit = ''
)

In your controller you could do something like:

$allCategories = Category::getNestedCategories(null, $this->context->language->id);
$this->context->smarty->assign( 'allCategories' , $allCategories );

Then in your template file something like

{foreach from=$allCategories item=mainCategory}
  <div class="categoryBox">
    <h2>{$mainCategory.name}</h2>
    <p>{$mainCategory.description}</p>  
  </div>
  {foreach from=$mainCategory.children item=subCategory}
    <div class="categoryBox">
      <h3>{$subCategory.name}</h3>
      <p>{$subCategory.description}</p>
    </div>
  {/foreach}

{/foreach}

If you would like to have only subcategories of Home category, you can use getHomeCategories($id_lang, $active = true, $id_shop = false):

$allCategories = Category::getHomeCategories( $this->context->language->id );

Also handy one is static function getCategoryInformations($ids_category, $id_lang = null)
=> VERY useful when you have a list of some particular ids of categories you want to get - you just pass them as array - example of usage:

$myCustomCatIDs = array( 5 , 20 , 7);
$myCustomCats = Category::getCategoryInformations( $myCustomCatIDs );