Display all categories on product page Prestashop
Asked Answered
V

3

5

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.

Virtues answered 27/10, 2014 at 6:37 Comment(0)
S
8

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 );
Stony answered 29/8, 2015 at 19:54 Comment(0)
P
0

Have a look at home categories module I tested this module with PS 1.6, it works. You can modify the module's hook to your needs. I've done some personnal modification to have the subcategories displayed too. (Sorry for bad english, not my native language)

Here is my custom php code for the module, storing the category and subcategory items in smarty, and linked to a tpl file.

class Homecategories extends Module
{
    private $_html = '';
    private $_postErrors = array();    
    function __construct()
    {
        $this->name = 'homecategories';
        $this->tab = 'front_office_features';
        $this->version = 1.3;
        $this->author = 'John Stocks';
        $this->need_instance = 0;    
        parent::__construct(); // The parent construct is required for translations    
        $this->page = basename(__FILE__, '.php');
        $this->displayName = $this->l('Homepage Categories for v1.5');
        $this->description = $this->l('Displays categories on your homepage');
    }    
    function install()
    {
        return (parent::install() AND $this->registerHook('home') AND $this->registerHook('header'));
    }
    public function hookHeader()
    {
        Tools::addCSS(($this->_path).'homecategories.css', 'all');
    }
    function hookHome($params)
    {
        global $smarty, $cookie, $link;
        $id_customer = (int)$params['cookie']->id_customer;
        $id_group = $id_customer ? Customer::getDefaultGroupId($id_customer) : _PS_DEFAULT_CUSTOMER_GROUP_;
        $id_lang = (int)$params['cookie']->id_lang;
        $result = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
            SELECT c.*, cl.*
            FROM `'._DB_PREFIX_.'category` c
            LEFT JOIN `'._DB_PREFIX_.'category_lang` cl ON (c.`id_category` = cl.`id_category` AND `id_lang` = '.$id_lang.')
            LEFT JOIN `'._DB_PREFIX_.'category_group` cg ON (cg.`id_category` = c.`id_category`)
            WHERE level_depth > 1 And level_depth < 3
            AND c.`active` = 1
            AND cg.`id_group` = '.$id_group.'
            ORDER BY `level_depth` ASC, c.`position` ASC');    
        $category = new Category(1);
        $nb = intval(Configuration::get('HOME_categories_NBR'));    
        global $link;
        $this->context->smarty->assign(array(
            'categories' => $result, Category::getRootCategories(intval($params['cookie']->id_lang), true),
            'link' => $link));    
        $this->context->smarty->assign(array(
            'category' => $category,
            'lang' => Language::getIsoById(intval($params['cookie']->id_lang)),
        ));
        $result2 = Db::getInstance(_PS_USE_SQL_SLAVE_)->ExecuteS('
            SELECT c.*, cl.* 
            FROM ps_category c 
            LEFT JOIN `ps_category_lang` cl ON (c.`id_category` = cl.`id_category` AND `id_lang` = '.$id_lang.') 
            LEFT JOIN ps_category_group cg ON (cg.`id_category` = c.`id_category`) 
            WHERE level_depth > 2 And level_depth < 4
            AND cg.`id_group` = '.$id_group.'
            AND c.`active` = 1
            ORDER BY `level_depth` ASC, c.`position` ASC ');
        global $link;
        $this->context->smarty->assign(array(
            'subcategories' => $result2, Category::getRootCategories(intval($params['cookie']->id_lang), true),
            'sublink' => $link));

        $this->context->smarty->assign(array(
            'category' => $subcategory,
            'lang' => Language::getIsoById(intval($params['cookie']->id_lang)),
        ));    
        return $this->display(__FILE__, 'homecategories.tpl');
    }
}
Perlie answered 31/10, 2014 at 15:4 Comment(1)
While this link may answer the question, it is better to include the essential parts of the answer here and provide the link for reference. Link-only answers can become invalid if the linked page changes.Betoken
P
0
Try-
Add in controller function-

$categoryList = Category::getCategories();

and assign the variable in smarty.

$this->smarty->assign(array(
'displayCategoryList' => $categoryList,
                ));
Add in tpl file-

{$displayCategoryList|@print_r}
Pickpocket answered 4/2, 2019 at 7:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.