Показать все категории на странице товара Prestashop

Мне нужно получить список всех категорий и их идентификаторов на странице продукта в Prestashop (я использую v 1.6.0.9).

Я пытался сделать что-то вроде этого:

$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 }
}

Но это не работает.

$category->name дает мне только имя текущей открытой категории, а не название каждой категории в списке. Я не знаю что поставить вместо something? И это работает только, когда я использую $category->getProducts, Вот у вас есть мой магазин (см. «Сопутствующие товары»).

Это мой третий магазин, и я два дня борюсь с этой проблемой.

5

Решение

В PS 1.6 есть Category класс, он содержит несколько удобных статических методов, используемых в вашем контроллере: getCategories(...), getNestedCategories(...), getSimpleCategories — это все статические (и публичные), вы называете их как Category::funcName(...)

Для вас, я думаю, лучшим вариантом будет getNestedCategories() который имеет этот заголовок:

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

В вашем контроллере вы можете сделать что-то вроде:

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

Тогда в вашем файле шаблона что-то вроде

{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}

Если вы хотите иметь только подкатегории домашней категории, вы можете использовать getHomeCategories($id_lang, $active = true, $id_shop = false):

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

Также удобной является статическая функция getCategoryInformations($ids_category, $id_lang = null)

=> ОЧЕНЬ полезно, когда у вас есть список определенных идентификаторов категорий, которые вы хотите получить — вы просто передаете их как массив — пример использования:

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

Другие решения

Посмотри на модуль домашних категорий Я протестировал этот модуль с PS 1.6, он работает. Вы можете изменить крючок модуля в соответствии с вашими потребностями. Я сделал некоторые личные изменения для отображения подкатегорий тоже. (Извините за плохой английский, не мой родной язык)

Вот мой пользовательский код php для модуля, хранящий элементы категории и подкатегории в smarty и связанный с файлом tpl.

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');
}
}
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}
0
По вопросам рекламы [email protected]