Project

Profile

Help

HostedRedmine.com has moved to the Planio platform. All logins and passwords remained the same. All users will be able to login and use Redmine just as before. Read more...

Пример кастомизация вывода меню (функция ядра mso_menu_build)

Общее

Большинство функций ядра MaxSite CMS возвращают готовый html-код, что не всегда хорошо, если необходимо определенным образом задать html-структура с определенными тегами и их атрибутами.

Один из вариантов решения править функции ядра MaxSite CMS, что не является верным решением, т.к. при последующих обновлениях движка нужно делать повторные правки.
Другим вариантом может выступать создание своей функции на базе существующей с необходимым поведением.

Но часто требуются лишь незначительные правки структуры, н-р, добавить несколько нужных атрибутов определенных тегов.
В этом случае пригодится библиотека PHP Simple HTML DOM Parser
Рассмотрим ее использование на конкретном примере в контексте MaxSite CMS.

Задача

  1. При нахождении на странице записи нужно подсвечивать пункт меню категории.
  2. Для любого выделенного пункта меню должны подсвечиваться все пункты меню-родителей.

На примере демо-данных MS 0.854, шаблон default имеем структуру меню:

| Главная
about | О сайте
comments | Комментарии
contact | Контакты
    [
    ##  | Общая категория
       [
       ##  | Вложенная категория
       category/astro | Астрономия
       category/phisic | Физика
       ]
    about | О сайте
    ]
sitemap | Архив
feed | RSS

Имеется статья "Общая теория относительности", которая связана с категорией "Физика".
При нахождении на странице "Общая теория относительности" пункты меню "Общая категория", "Вложенная категория", "Физика" не подсвечены.

1. При нахождении на странице записи нужно подсвечивать пункт меню категории.

2. Для любого выделенного пункта меню должны подсвечиваться все пункты меню-родителей.

Приступим к реализации задачи.

Пример кастомизации на базе MS 0.854, шаблон default.

  1. Скачаем последнюю версию библиотеки PHP Simple HTML DOM Parser
  2. Немного поправим файл скачанной библиотеки simple_html_dom.php для того, чтобы его нельзя было запускать напрямую, т.е. в обход движка.
    В начало файла simple_html_dom.php вставим код
    <?php if (!defined('BASEPATH')) exit('No direct script access allowed'); 
    /*
    подключать в custom/my_functions.php
    
    if (!function_exists('str_get_html')) 
    {
        if ($fn = mso_fe('stock/simple_html_dom/simple_html_dom.php')) require($fn);
    }
    
    */
    
    ?>
    
  3. Создадим папку \application\maxsite\templates\default\stock\simple_html_dom в которую скопируем simple_html_dom.php
  4. В файле \application\maxsite\templates\default\custom\my_functions.php подключим библиотеку
    if (!function_exists('str_get_html')) 
    {
        if ($fn = mso_fe('stock/simple_html_dom/simple_html_dom.php')) require($fn);
    }
    

    и функцию для обработки меню, использующую функционал библиотеки PHP Simple HTML DOM Parser
    function category_selected_for_page($menu_out)
    {
        global $page;
        if (!$page) return $menu_out;
        $html = str_get_html($menu_out);
        if (is_type('page')) 
        {
            foreach($html->find('a[href*=category]') as $e)     
            {
                foreach($page['page_categories_detail'] as $id => $val)
                {
                   $url = $e->href;
                   $num_pos = stripos($url,'category');
                   $slug_category = substr($url, $num_pos+9);
                   if ( $val['category_slug'] == $slug_category ) 
                    {
                        $e->parent()->class .= ' selected';
                    }
                }
            }
        }
        foreach($html->find('li.selected') as $e)
        {
            while ($e->parent()->tag !== 'root') 
            {
                  $e = $e->parent();
                  if ($e->tag == 'li')
                  {    
                       $e->class .= ' selected';
                  }
            }
        }    
        return $html;
    }
    
  5. В файле компонента вывода меню шаблона 'default' \application\maxsite\templates\default\components\_menu\_menu.php заменим строку вывода меню с учетом вновь созданной функции category_selected_for_page()
    if ($menu) echo mso_menu_build($menu, 'selected', false);
    

    на
    if ($menu) echo category_selected_for_page(mso_menu_build($menu, 'selected', false));
    
  6. В итоге мы получили подсветку пунктов меню, как на финальных скриншотах.

Примечание:
Таким образом можно кастомизировать любой html-код , который возвращают оригинальные функции ядра и плагинов MaxSite CMS.

Исходные файлы примера default_custom_menu.zip

Скачать и заменить соответствующие файлы шаблона default.

locked