Page 1 of 1

по модулю cataloger

Posted: Mon Jul 12, 2010 3:42 am
by nadezhda
В модуле каталогер, сделала категорию, подкатегорию и элемент. Необходимо выводить на страницу только категории и подкатегории. Как в шаблоне вывода можно сделать, чтобы у категорий и подкатегорий были разные стили (сейчас они выводятся в одном стиле). Например:
Hats //категория
  Fashion hat //подкатегория
  Work Hats//подкатегория

clothers //категория
  Fashion clothers//подкатегория
  Work clothers//подкатегория

Использую шаблон:
{$title}
{section name=numimg loop=$image_url_array}{/section}
{$notes}

  {if $hasnav == 1}
{$prev}{$navstr}{$next}
  {/if}
    {section name=numloop loop=$items}

       








{$items[numloop].title}





    {/section}
    {if $hasnav == 1}
{*
The number that is without a link (a href) have a {$prev}{$navstr}{$next}
  {/if}

Для вывода:

{cms_module module='Cataloger' action='all' sub_template='cat' alias='/' items_per_page='6' recurse='categories_one'}

Re: по модулю cataloger

Posted: Tue Jul 13, 2010 1:02 pm
by Fenik17
Сложное программирование смарти-шалонов - это жуткая вещь...
Я бы лучше плагином сделал. Например, что-то вроде такого:

Code: Select all

function smarty_cms_function_children_list($params, &$smarty)
{
	global $gCms;
	$manager =& $gCms->GetHierarchyManager();
	$thisPage = $gCms->variables['page_name'];
	$currentNode = &$manager->sureGetNodeByAlias($thisPage);
	$nodes = $currentNode->getChildren();
	if ($currentNode->hasChildren()) {
		foreach ($nodes as $node) {
			$content = $node->getContent();
			if ($content instanceof CatalogCategory) {
				echo "<div class=\"1\"><a ....  >...</a></div>";
				// .... if ($content->hasChildren() ...
			}
		}
	}
}
А на нужной странице просто {children_list}

Re: по модулю cataloger

Posted: Tue Jul 13, 2010 6:44 pm
by nadezhda
Спасибо за помощь:) ))
Я никогда не устанавливала плагины, так что поправьте меня, если что не так.

Вставила код в раздел теги пользователя, на нужной странице пишу:
{cms_module module='Cataloger' action='all' sub_template='cat' alias='/' recurse='mixed_all' items_per_page='6'} {children_list}

Все отображается по прежнему (категории и саб категории одним стилем). Новый класс к саб категориям не применился.
Может что-то не так сделала...

Re: по модулю cataloger

Posted: Wed Jul 14, 2010 12:07 am
by Fenik17
Да, что-то не так )
Чтобы добавить свой плагин, нужно:
1. В папке plugins создать файл function.children_list.php.
2. В этом файле реализовать функции:
function smarty_cms_function_children_list($params, &$smarty)
function smarty_cms_help_function_children_list()
function smarty_cms_about_function_children_list()
3. Уже после этого в нужном месте вставлять тег {children_list}.

Категории и подкатегории - это элементы контента, которые обычно имеют один корневой элемент (например, разделитель), у которого есть свой алиас. Если задача вывести все категории и подкатегории от конкретного корневого элемента, необходимо при вызове нашего плагина передавать ему алиас корневого элемента. Например, так: {children_list root='hats-catalog'}. Тогда в реализации плагина можно будет взять элемент с этим алиасом и сканировать его вложенные элемента, выискивая категории и подкатегории..
Вот рабочий пример реализации функции плагина (smarty_cms_function_children_list), который выводит все дочерние категории и подкатегории, указав им классы 'category' и 'subcategory':

Code: Select all

function print_categories(&$root, $cat_class_name, $sub_cat_class_name) {
	if (isset($root) && $root->hasChildren()) {
		$nodes = $root->getChildren();
		foreach ($nodes as $node) {
			$content = $node->getContent();
			if ($content instanceof CatalogCategory) {
/*
				// вариант со ссылками на страницы категорий:
				echo 	"<div class=\"$cat_class_name\">\n";
				echo	'<p><a href="'.$content->GetURL().'">'.$content->Name()."</a></p>\n";
				if (isset($sub_cat_class_name))
					print_categories($node, $sub_cat_class_name, null);
				echo	"</div>\n";
*/
				echo 	"<div class=\"$cat_class_name\">".$content->Name()."</div>\n";
				if (isset($sub_cat_class_name))
					print_categories($node, $sub_cat_class_name, null);
			}
		}
	}

}

function smarty_cms_function_children_list($params, &$smarty)
{
	global $gCms;
	$manager = &$gCms->GetHierarchyManager();
	if (isset($params) && isset($params['root'])) {
		$rootAlias = $params['root'];
	}
	else {
		/* Если параметр root не задан, берем текущую страницу 
	 	  (с который был вызов плагина) как корневой элемент */
		$rootAlias = $gCms->variables['page_name'];
	}
	/* Получаем ссылку на корневой контент */
	$rootNode = &$manager->sureGetNodeByAlias($rootAlias);
	print_categories($rootNode, 'category', 'subcategory');
}

Re: по модулю cataloger

Posted: Wed Jul 14, 2010 7:29 pm
by nadezhda
Спасибо,
опять ничего не изменилось...  :'(
1. в папке плагинс создала файл function.children_list.php
2. поместила в него код:
"
hasChildren()) {
$nodes = $root->getChildren();
foreach ($nodes as $node) {
$content = $node->getContent();
if ($content instanceof CatalogCategory) {
/*
// вариант со ссылками на страницы категорий:
echo "\n";
echo 'GetURL().'">'.$content->Name()."\n";
if (isset($sub_cat_class_name))
print_categories($node, $sub_cat_class_name, null);
echo "\n";
*/
echo "".$content->Name()."\n";
if (isset($sub_cat_class_name))
print_categories($node, $sub_cat_class_name, null);
}
}
}

}

function smarty_cms_function_children_list($params, &$smarty)
{
global $gCms;
$manager = &$gCms->GetHierarchyManager();
if (isset($params) && isset($params['root'])) {
$rootAlias = $params['root'];
}
else {
/* Если параметр root не задан, берем текущую страницу
  (с который был вызов плагина) как корневой элемент */
$rootAlias = $gCms->variables['page_name'];
}
/* Получаем ссылку на корневой контент */
$rootNode = &$manager->sureGetNodeByAlias($rootAlias);
print_categories($rootNode, 'category', 'subcategory');
}
function smarty_cms_help_function_children_list() {
  echo lang('help_function_children_list');
}

function smarty_cms_about_function_children_list() {
    ?>
    Author: XXX<info@mail.ru>
    Version: 1.0
   
    Change History:
    None
   
   
"
3. на страницу вставила {children_list} (без указания root)

Re: по модулю cataloger

Posted: Wed Jul 14, 2010 8:10 pm
by Fenik17
А если закомментировать строку

Code: Select all

if ($content instanceof CatalogCategory) {
и соответствующую закрывающую фигурную скобку?

Возможно тип контента вложенных страниц не того типа. Должен быть - "Страница категории". А может класс CatalogCategory не подгружается.
Я проверял на CMSMS 1.7.1 + Cataloger 0.7.7 - у меня работает.

И какая версия php? instanceof появилось в php 5.0. Причем в 5.1 работа немного отличается.

Re: по модулю cataloger

Posted: Sat Jul 17, 2010 9:01 am
by nadezhda
Большое спасибо, заработало :) Разобралась.