Категории

[FAQ] Часто задаваемые вопросы и ответы

Проблемы и решения

Ошибки и исправления

Общие вопросы

Расширения

Установка и обновление

Модули

Шаблоны

Локализация интерфейса

Коммерческие предложения

Учимся бизнесу

Бизнес книги

Поисковая оптимизация (SEO)

Магазины на ShopOS

Хостинг для ShopOS

Предложения и пожелания

Курилка

Плагин "Облако категорий"

Данный плагин выводит облако категорий и подкатегорий.

Плагин для версии ShopOS 2.5.2 (возможно и для 2.5.1)

Установка проста.
1 – Залить плагин в папку с плагинами
2 – в файле index.html вашего шаблона установить метку {$box_CAT_CLOUD}

Добавлены настройки:
Количество категорий в облаке
Минимальный размер шрифта
Максимальный размер шрифта
Количество символов в названиях категорий
Показывать подкатегории в облаке или нет
Новое
Сортировка (имя, id, возрастание, убывание, случайно)
Разделитель (пробел или br)
Возможность отключать случайны размер шрифта
Название заголовка блока

Спасибо grig и tulgha за помощь!!!


вывод в шаблон  {box_CAT_CLOUD} ?


ой  ;)


Да)

Забыл написать сначала))


Спасибо!


нужный плагин. сейчас потестим. спасибо!


посмотрел код.
'SIZE' => rand($MIN_FONT_SIZE,$MAX_FONT_SIZE),

имхо рандом - это конечно хорошо, но лучше было бы сделать две настройки:
1) выбор размера шрифта рандомом
2) выбор размера шрифта в зависимости от кол-ва товаров в категории



Настройку пока не вынес в плагин. Если надо, то вынесу.
Настройка всего одна - мин и макс размер шрифта - MIN_FONT_SIZE и MAX_FONT_SIZE, соответственно.


Таки выноси. Надо еще максимальное число показываемых категорий определить типа
$MAX_DISPLAY_CATS = '20';
...
...ORDER BY RAND() DESC LIMIT " . $MAX_DISPLAY_CATS;


И зачем кэшировать данные случайной выборки?


tulgha, а как не кэшировать случайную выборку?

зы. это по сути обычные категории, зачем ограничивать их вывод по количеству?


1. Не понимаю, если случайная выборка, зачем кэшировать? Если кэшировать, зачем случайная выборка? Тут - "или крестик, или трусы".
Если вопрос был не риторический ;)

;
$_box_value = $box->fetch('box_cat_cloud.html',$cache_id);
}*/

закомментированное - выкинуть.

2.У меня их достаточно много, у некоторых товарищей - намного больше. Зачем нам растягивать столбец, шапку или подвал тьмой категорий?

Кому не надо, тот и не будет трогать настройки. Мне - надо.
Надо еще обрезание названия категории сделать настраиваемое, есть особенно длинные по названию категории, . 


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

зы - не забываем, что всех тонкостей я не знаю, мне простительно)

Обрезание делать через os_truncate?


Ок.


Обрезание делать через os_truncate?

Наверное да, я не разбирался как это делается. Надо смотреть чем делается обрезание новостей, статей и т.п. И не забывать, что обрезание должно быть мультибайтным, чтобы не вылезали ромбики с вопросами.


А если делать обрезание через mb_substr?
С кодировкой проблем не должно же быть? Она-то везде в utf8.


Да не должно быть. Но! Дополнение PHP mb_string может быть выключено, значит обработку должна взять на себя функция-прослойка: если mb_string не выключен и если mb_substr не выключен, то используем mb_substr, иначе обрабатываем внутри функции на костылях.

Тут я взглянул как в Шопосе делается, например, в Новостях:

{$module_data.NEWS_CONTENT|os_truncate:$smarty.const.MAX_DISPLAY_LATEST_NEWS_CONTENT:" ..."}

Получается, через Смарти.
Стало быть, надо хранить параметр типа MAX_DISPLAY_CAT_CLOUD_CAT_NAME, а в шаблоне прописать

{$box_content.NAME|os_truncate:$smarty.const.MAX_DISPLAY_CAT_CLOUD_CAT_NAME:" ..."}


Я просто прошелся поиском по файлам шопоса и нашел mb_substr в нескольких файлах. И подумал его использовать)

Тогда сделаю с os_truncate лучше.


Не могу придумать, как из плагина передавать MAX_DISPLAY_CAT_CLOUD_CAT_NAME в файл шаблона, чтобы заработала конструкция {$box_content.NAME|os_truncate:$smarty.const.MAX_DISPLAY_CAT_CLOUD_CAT_NAME:" ..."}

Сейчас уже вывел настройки, но обрезку сделать не могу(не соображу).
Пока повесил на mb_substr, но не охота обновлять пока из-за этого.


А разве такая конструкция не работает?


get_conf_value() {
    if (!isset ($this->max_display_name)) {
        $conf_value_query= os_db_query("SELECT configuration_value from ".TABLE_CONFIGURATION."
                              WHERE configuration_key = 'MAX_DISPLAY_CAT_CLOUD_CAT_NAME'");
        $this->max_display_name = os_db_num_rows($conf_value_query);
    }
    return $this->max_display_name;
}

$box->assign('MAX_DISPLAY_CAT_CLOUD_CAT_NAME', $this->max_display_name);


хм. делать еще один запрос ради обрезания названия?


Все оказалось намного проще)

Только вот os_truncate обрезает и добавляет левые символы.


Странно, см. http://www.tvsat.kz


А у меня криво.
Причем даже если я количество вручную прописываю, а не тяну с конфига плагина.
Пробовал на двух разных сайтах.

Значит делать настройку: либо os_truncate, либо mb_substr. Либо оставлять mb_substr и не париться.


Сейчас у меня прописано


{$box_content.NAME|os_truncate:25:" ...":true}

Игрался с этим параметром - всё нормально. Вот когда os_truncate вынес в index.html - пропали ссылки.


Обновил плагин. Добавились настройки.


Вот когда os_truncate вынес в index.html - пропали ссылки.


Что значит в index.html?



Вот когда os_truncate вынес в index.html - пропали ссылки.


Что значит в index.html?

Так {$box_CAT_CLOUD|os_truncate:200:" ...":true}


так а толку от это? Ничего не даст


os_truncate надо вешать именно на метку выводящую текст который надо резать.


Вот это (строки за комментированием )


//->if (!CacheCheck()) {
$box->caching = 0;
$_box_value = $box->fetch('box_cat_cloud.html');
//->}

зачем?
Ведь получатся, что если кэш включен, то запрещаем вывод!


сори. забыл убрать вчера. запарился с настройками)
ща поправлю


В шаблоне я сделал так

{if $cat_title}<table class="adn"><tr><td class="hd bf">{$cat_title}</td></tr></table>
<table class="adn"><tr><td class="hdb">{/if}
{foreach name=aussen item=box_content from=$box_content}
<a {if $box_content.SIZE}style="{$box_content.SIZE}"{/if} href="{$box_content.LINK}" title="{$box_content.TITLE}">{$box_content.NAME}</a>{$box_content.SEP}
{/foreach}
{if $cat_title}</td></tr></table>{/if}
Это позволяет убирать лишнее, если заголовок не определен.


Ага.

Осталось еще одна вещь которую надо реализовать - подсчет количества товаров категориях и определять размер шрифта по ним. Точнее опционально сделать)

И тут нужна помощь.
Запрос для подсчета сделать не сложно. Как потом узнавать какое количество товаров у каждой категории? Т.е. как соединить это воедино? Кто поможет?


Примерно так:  в PHP


$query = "SELECT c.categories_id, cd.categories_name, cd.categories_heading_title, count(*) AS c FROM ".TABLE_CATEGORIES." AS c, ".TABLE_CATEGORIES_DESCRIPTION." AS cd, ".TABLE_PRODUCTS_TO_CATEGORIES." AS p2c WHERE c.categories_id = cd.categories_id ".(empty($show_sub_cat) ? 'AND c.parent_id = ("0")':'')." AND ".$group_check." c.categories_status = '1' AND p2c.categories_id=c.categories_id AND cd.language_id = '" .(int) $_SESSION['languages_id']. "' GROUP BY c.categories_id ORDER BY ".$sort_cat." LIMIT " . get_option('max_display_cats');
$query = osDBquery($query);

while ($cat = os_db_fetch_array($query, true)) {

$cat_link = os_category_link($cat['categories_id'],$cat['categories_name']);
$cat_name = mb_substr($cat['categories_name'],0, get_option('max_display_chr'));
//define('MAX_DISPLAY_CHR', get_option('max_display_chr'));

if (get_option('cat_font_size')=='true') {
$font_size = 'font-size:'.rand(get_option('min_font_size'),get_option('max_font_size')).'px';
}

$box_content[] = array (
'SIZE' => $font_size,
'LINK' => os_href_link(FILENAME_DEFAULT, $cat_link),
'TITLE' => $cat['categories_heading_title'],
'NAME' => $cat_name,
'PRODUCTS' => $cat['c'],
'SEP' => $sep
);
$box->assign('box_content', $box_content);
$box->assign('cat_title', $cat_title);
}



В шаблоне потом  использовать {$box_content.PRODUCTS}


Поправил вывод вот так 

,
'NAME' => $cat_name,
'SEP' => $sep
);
}

$box->assign('box_content', $box_content);
$box->assign('cat_title', $cat_title);
$box->template_dir = plugdir();

Поясняю:
1. Ни к чему каждый раз в цикле исполнять функцию get_option(), да к тому же делать запрос, если ответ всегда одинаковый, пока админ не изменил значение;
2. mt_rand() работает быстрее, меньше повторяемости;
3. При обрезании добавляется отточие.


Что-то перестали названия в случайном порядке появляться.


Спасибо за помощь grig и tulgha. как всегда выручили!

tulgha, что дает этот код

$max_display_chr = get_option('max_display_chr');
  $cat_font_size = false;
  if ( strtolower(get_option('cat_font_size')) =='true') {
      ........
      $cat_font_size = true;
  }

И этот
$cat_name_tmp = $cat['categories_name'];
      if ( strlen($cat_name_tmp) > $max_display_chr ) {


Точнее, что, где происходит?


Я даже не знаю как объяснить очевидное, тем более, что в пояснении описал цели.
Попробую примерно так: вынимаем все обращения за параметрами из цикла, потому что они неизменные в пределах сессии (и даже в течении времени ->∞ пока админ не изменит параметр) и потому что они генерируют излишние запросы; обрезаем название, выходящее за прокрустово ложе, если название меньше ложа, то и не пытаемся расчехлять меч; если название оказалось не равно первоначальной длине, добавляем отточие.


Хм. Теперь понятно. Спасибо!

А на счет очевидного.... Для меня это далеко не очевидные пока вещи. Описание я прочитал и понял. Просто хотелось уточнений.

Теперь осталось мелочь. Убрать настройки размеров шрифтов, прописать их в коде. Сделать мин. и макс. размер не более 10 и повесить на CSS.
А то при переключении со случайных размеров, к зависимости от количества товара, цифры прыгают ужасно. Если в категории 90 товаров, то и размер шрифта 90px  ;D ;D


Гадский кэш! Всё равно пишется в кэш и читается из кэша.


А где функция cat_cloud_remove() ??


А че там удалять после выключения?
там само удаляется все что надо из БД



Сделать мин. и макс. размер не более 10 и повесить на CSS.

Соотношение минимального к максимальному размеру должно быть не более 1:3, или лучше 1:2. Если брать минимальный читаемый размер на распространенных размерах экрана, это кегли 8-24 или 8-16. 8-16 градаций уже хватает, если принять десятичный принцип - каждые 10% соотношения количества товаров в категориях - 0.1 пики, то это кегли 8-18 или 9-19, если добавить разборчивости самого мелкого шрифта.


Видимо придётся вывод делать не через шаблон со смарти и кэшем, а напрямую в HTML из php файла.
Альтернатива этому - делать 10-20 предварительных наборов псевослучайных выборок, заставить скэшировать раздельно эти 10-выборок и подкладывать посетителю.
Первый путь реализуется проще, второй дает преимущества кэша для увеличения производительности, но что до меня кэш - темный лес.


$query = osDBquery($query);

заменить на
$query = os_db_query($query);

и будет случайнабор категории без включения кэша.


Опа. Спасибо. Обновил
А почему так?


Если сравнить функции, первая всегда обращается к кэшу.


Да. Надо будет запомнить, чтобы еще таких косяков не наделать!


Хотелось бы иметь опцию Случайно отдельно от опции Сортировка. И то, и другое включать раздельно.
Разнообразить вид разделителей, например, выпадающий список разделителей: пулька, колечко, бубна, стрелка и т.п.


NeBox а архив обновлен в первом посту?


Только исправление с кэшем, которое подсказал tulgha.
Более нового ничего нету пока.


Источник



Copyright ShopOS