Просмотр исходного кода

Ticket #3901 - Menus: Improvements in menu item title usage.

AntonLV 1 год назад
Родитель
Сommit
135619a7b3

+ 4 - 1
install/sql/system.sql

@@ -4827,12 +4827,15 @@ CREATE TABLE IF NOT EXISTS `sys_menu_items` (
   `name` varchar(255) NOT NULL,
   `title_system` varchar(255) NOT NULL,
   `title` varchar(255) NOT NULL,
+  `title_attr` varchar(255) NOT NULL DEFAULT '',
   `link` varchar(512) NOT NULL,
   `onclick` varchar(255) NOT NULL,
   `target` varchar(255) NOT NULL,
+  `area_label` varchar(255) NOT NULL DEFAULT '',
   `icon` text NOT NULL,
+  `icon_only` tinyint(4) NOT NULL DEFAULT '0',
   `addon` text NOT NULL,
-  `addon_cache` tinyint(4) NOT NULL DEFAULT 0,
+  `addon_cache` tinyint(4) NOT NULL DEFAULT '0',
   `markers` text NOT NULL,
   `submenu_object` varchar(64) NOT NULL,
   `submenu_popup` tinyint(4) NOT NULL DEFAULT '0',

+ 6 - 1
modules/boonex/english/data/langs/system/en.xml

@@ -1194,6 +1194,7 @@
 	<string name="_adm_nav_btn_sets_create"><![CDATA[Add New Set]]></string>
 	<string name="_adm_nav_btn_sets_delete"><![CDATA[Delete set]]></string>
 	<string name="_adm_nav_btn_sets_edit"><![CDATA[Edit set]]></string>
+        <string name="_adm_nav_dsc_items_area_label"><![CDATA[Accessible name for the link. It is useful when the visible text content of the link is not descriptive enough or absent.]]></string>
 	<string name="_adm_nav_dsc_items_icon"><![CDATA[You may use font icon, SVG or Emoji code here]]></string>
 	<string name="_adm_nav_dsc_items_icon_image"><![CDATA[or upload a small image to be displayed near the link.]]></string>
 	<string name="_adm_nav_dsc_items_icon_image_current"><![CDATA[No icon uploaded. Text is used in menu item.]]></string>
@@ -1203,6 +1204,7 @@
 	<string name="_adm_nav_dsc_items_submenu"><![CDATA[Select if you want the link to use another menu as submenu.]]></string>
 	<string name="_adm_nav_dsc_items_target"><![CDATA[Select if you want the link to open as a new page or within current page.]]></string>
 	<string name="_adm_nav_dsc_items_title"><![CDATA[Link name displayed in site menus. Use at least 3 characters.]]></string>
+        <string name="_adm_nav_dsc_items_title_attr"><![CDATA[A text which will be used in 'title' attribute of the link.]]></string>
 	<string name="_adm_nav_dsc_items_title_system"><![CDATA[Item name, displayed in Studio only.]]></string>
 	<string name="_adm_nav_dsc_items_visible_for_levels"><![CDATA[Select user levels that can see this menu item]]></string>
 	<string name="_adm_nav_dsc_menus_persistent"><![CDATA[Number of persistent menu items. Applicable for menus with 'Auto More' mechanism only.]]></string>
@@ -1236,6 +1238,7 @@
 	<string name="_adm_nav_err_sets_edit"><![CDATA[Cannot update set]]></string>
 	<string name="_adm_nav_err_sets_title"><![CDATA[A title with at least 3 characters is required.]]></string>
 	<string name="_adm_nav_txt_all_modules"><![CDATA[All Modules]]></string>
+        <string name="_adm_nav_txt_items_area_label"><![CDATA[Text for 'area-label' attribute]]></string>
         <string name="_adm_nav_txt_items_collapsed"><![CDATA[Collapsed]]></string>
 	<string name="_adm_nav_txt_items_create_popup"><![CDATA[Add New Item]]></string>
 	<string name="_adm_nav_txt_items_edit_popup"><![CDATA[Edit {0} Item]]></string>
@@ -1251,6 +1254,7 @@
 	<string name="_adm_nav_txt_items_icon_image"><![CDATA[]]></string>
 	<string name="_adm_nav_txt_items_icon_image_new"><![CDATA[]]></string>
 	<string name="_adm_nav_txt_items_icon_image_old"><![CDATA[Current Icon]]></string>
+        <string name="_adm_nav_txt_items_icon_only"><![CDATA[Icon only]]></string>
 	<string name="_adm_nav_txt_items_import_popup"><![CDATA[Import Items]]></string>
 	<string name="_adm_nav_txt_items_link"><![CDATA[URL]]></string>
 	<string name="_adm_nav_txt_items_onclick"><![CDATA[OnClick]]></string>
@@ -1265,7 +1269,8 @@
 	<string name="_adm_nav_txt_items_target"><![CDATA[Target]]></string>
 	<string name="_adm_nav_txt_items_target_blank"><![CDATA[New Page]]></string>
 	<string name="_adm_nav_txt_items_target_self"><![CDATA[Same Page]]></string>
-	<string name="_adm_nav_txt_items_title"><![CDATA[Title]]></string>
+	<string name="_adm_nav_txt_items_title"><![CDATA[Name]]></string>
+        <string name="_adm_nav_txt_items_title_attr"><![CDATA[Title]]></string>
 	<string name="_adm_nav_txt_items_title_system"><![CDATA[System Name]]></string>
 	<string name="_adm_nav_txt_items_visible_for"><![CDATA[Visible For]]></string>
 	<string name="_adm_nav_txt_items_visible_for_all"><![CDATA[Anyone]]></string>

+ 4 - 0
modules/boonex/lucid/data/template/system/css/menu.less

@@ -74,6 +74,10 @@
 
         margin: 0 0.5rem 0 0;
     }
+    #bx-sliding-menu-sys_site.bx-sliding-smenu-main .bx-menu-object-sys_site li .bx-menu-floating-blocks-icon:last-child img,
+    #bx-sliding-menu-sys_site.bx-sliding-smenu-main .bx-menu-object-sys_site li .bx-menu-floating-blocks-icon:last-child .sys-icon {
+        margin-right: 0;
+    }
     #bx-sliding-menu-sys_site.bx-sliding-smenu-main .bx-menu-object-sys_site li .bx-menu-floating-blocks-icon .sys-icon {
         line-height: 2rem;
         font-size: 1.2rem;

+ 3 - 1
modules/boonex/lucid/data/template/system/menu_floating_blocks.html

@@ -4,7 +4,9 @@
             <div class="bx-menu-floating-blocks-icon">
 				<bx_include_auto:menu_icon.html />
             </div>
-            <div class="bx-menu-floating-blocks-title">__title__</div>
+            <bx_if:title>
+                <div class="bx-menu-floating-blocks-title">__title__</div>
+            </bx_if:title>
         </a>__popup__                
     </li></bx_repeat:menu_items>
 </ul>

+ 6 - 1
modules/boonex/russian/data/langs/system/ru.xml

@@ -1177,6 +1177,7 @@
 	<string name="_adm_nav_btn_sets_create"><![CDATA[Добавить новый набор]]></string>
 	<string name="_adm_nav_btn_sets_delete"><![CDATA[Удалить набор]]></string>
 	<string name="_adm_nav_btn_sets_edit"><![CDATA[Редактировать набор]]></string>
+        <string name="_adm_nav_dsc_items_area_label"><![CDATA[Доступное имя для ссылки. Полезно, когда видимое текстовое содержимое ссылки недостаточно описательно или отсутствует.]]></string>
 	<string name="_adm_nav_dsc_items_icon"><![CDATA[Вы можете использовать здесь иконку для шрифта, SVG код или эмодзи]]></string>
 	<string name="_adm_nav_dsc_items_icon_image"><![CDATA[или загрузить маленькую картинку для отображения рядом со ссылкой.]]></string>
 	<string name="_adm_nav_dsc_items_icon_image_current"><![CDATA[Картинка не загружена. В элементе меню будет использован текст.]]></string>
@@ -1186,6 +1187,7 @@
 	<string name="_adm_nav_dsc_items_submenu"><![CDATA[Выберите, если пункт меню должен использовать другое меню в качестве подменю.]]></string>
 	<string name="_adm_nav_dsc_items_target"><![CDATA[Выберите, если ссылка должна открываться на новой или текущей странице.]]></string>
 	<string name="_adm_nav_dsc_items_title"><![CDATA[Название ссылки для отображения в меню сайта. Используйте как минимум 3 символа.]]></string>
+        <string name="_adm_nav_dsc_items_title_attr"><![CDATA[Текст, который будет использоваться в атрибуте «title» ссылки.]]></string>
 	<string name="_adm_nav_dsc_items_title_system"><![CDATA[Имя элемента, отображаемое только в Студии.]]></string>
 	<string name="_adm_nav_dsc_items_visible_for_levels"><![CDATA[Выбрать членства, разрешённые для просмотра элемента данного меню]]></string>
         <string name="_adm_nav_dsc_menus_persistent"><![CDATA[Количество постоянных пунктов меню. Применимо только для авто-перестраиваемых меню.]]></string>
@@ -1219,6 +1221,7 @@
 	<string name="_adm_nav_err_sets_edit"><![CDATA[Невозможно обновить набор]]></string>
 	<string name="_adm_nav_err_sets_title"><![CDATA[Необходимо указать заголовок из как минимум 3 символов.]]></string>
 	<string name="_adm_nav_txt_all_modules"><![CDATA[Все модули]]></string>
+        <string name="_adm_nav_txt_items_area_label"><![CDATA[Текст для атрибута 'area-label']]></string>
         <string name="_adm_nav_txt_items_collapsed"><![CDATA[Свёрнуто]]></string>
 	<string name="_adm_nav_txt_items_create_popup"><![CDATA[Добавить новый элемент]]></string>
 	<string name="_adm_nav_txt_items_edit_popup"><![CDATA[Редактировать {0} элемент]]></string>
@@ -1234,6 +1237,7 @@
 	<string name="_adm_nav_txt_items_icon_image"><![CDATA[]]></string>
 	<string name="_adm_nav_txt_items_icon_image_new"><![CDATA[]]></string>
 	<string name="_adm_nav_txt_items_icon_image_old"><![CDATA[Текущая иконка]]></string>
+        <string name="_adm_nav_txt_items_icon_only"><![CDATA[Только иконка]]></string>
 	<string name="_adm_nav_txt_items_import_popup"><![CDATA[Импортировать элементы]]></string>
 	<string name="_adm_nav_txt_items_link"><![CDATA[URL]]></string>
 	<string name="_adm_nav_txt_items_onclick"><![CDATA[OnClick]]></string>
@@ -1248,7 +1252,8 @@
 	<string name="_adm_nav_txt_items_target"><![CDATA[Цель]]></string>
 	<string name="_adm_nav_txt_items_target_blank"><![CDATA[Новая страница]]></string>
 	<string name="_adm_nav_txt_items_target_self"><![CDATA[Эта же страница]]></string>
-	<string name="_adm_nav_txt_items_title"><![CDATA[Заголовок]]></string>
+	<string name="_adm_nav_txt_items_title"><![CDATA[Имя]]></string>
+        <string name="_adm_nav_txt_items_title_attr"><![CDATA[Заголовок]]></string>
 	<string name="_adm_nav_txt_items_title_system"><![CDATA[Системное имя]]></string>
 	<string name="_adm_nav_txt_items_visible_for"><![CDATA[Видимо для]]></string>
 	<string name="_adm_nav_txt_items_visible_for_all"><![CDATA[Всех]]></string>

+ 2 - 30
studio/classes/BxDolStudioNavigationQuery.php

@@ -265,36 +265,8 @@ class BxDolStudioNavigationQuery extends BxDolDb
 
     function getItems($aParams, &$aItems, $bReturnCount = true)
     {
-        $aMethod = array('name' => 'getAll', 'params' => array(0 => 'query'));
-        $sSelectClause = "
-            `tmi`.`id` AS `id`,
-            `tmi`.`parent_id` AS `parent_id`,
-            `tmi`.`set_name` AS `set_name`,
-            `tmi`.`module` AS `module`,
-            `tmi`.`name` AS `name`,
-            `tmi`.`title_system` AS `title_system`,
-            `tmi`.`title` AS `title`,
-            `tmi`.`link` AS `link`,
-            `tmi`.`onclick` AS `onclick`,
-            `tmi`.`target` AS `target`,
-            `tmi`.`icon` AS `icon`,
-            `tmi`.`addon` AS `addon`,
-            `tmi`.`submenu_object` AS `submenu_object`,
-            `tmi`.`submenu_popup` AS `submenu_popup`,
-            `tmi`.`visible_for_levels` AS `visible_for_levels`,
-            `tmi`.`visibility_custom` AS `visibility_custom`,
-            `tmi`.`hidden_on` AS `hidden_on`,
-            `tmi`.`hidden_on_cxt` AS `hidden_on_cxt`,
-            `tmi`.`hidden_on_pt` AS `hidden_on_pt`,
-            `tmi`.`hidden_on_col` AS `hidden_on_col`,
-            `tmi`.`config_api` AS `config_api`,
-            `tmi`.`primary` AS `primary`,
-            `tmi`.`collapsed` AS `collapsed`,
-            `tmi`.`active` AS `active`,
-            `tmi`.`active_api` AS `active_api`,
-            `tmi`.`copyable` AS `copyable`,
-            `tmi`.`editable` AS `editable`,
-            `tmi`.`order` AS `order`";
+        $aMethod = ['name' => 'getAll', 'params' => [0 => 'query']];
+        $sSelectClause = "*";
         $sJoinClause = $sWhereClause = $sGroupClause = $sOrderClause = $sLimitClause = "";
 
         if(!isset($aParams['order']) || empty($aParams['order']))

+ 35 - 2
studio/template/scripts/BxBaseStudioNavigationItems.php

@@ -623,6 +623,17 @@ class BxBaseStudioNavigationItems extends BxDolStudioNavigationItems
                         'pass' => 'Xss',
                     ),
                 ),
+                'title_attr' => array(
+                    'type' => 'text_translatable',
+                    'name' => 'title_attr',
+                    'caption' => _t('_adm_nav_txt_items_title_attr'),
+                    'info' => _t('_adm_nav_dsc_items_title_attr'),
+                    'value' => isset($aItem['title_attr']) ? $aItem['title_attr'] : '_adm_nav_txt_item',
+                    'required' => '0',
+                    'db' => array (
+                        'pass' => 'Xss',
+                    ),
+                ),
                 'parent_id' => array(
                     'type' => 'select',
                     'name' => 'parent_id',
@@ -714,6 +725,17 @@ class BxBaseStudioNavigationItems extends BxDolStudioNavigationItems
                         'error' => _t('_adm_nav_err_items_onclick'),
                     ),
                 ),
+                'area_label' => array(
+                    'type' => 'text_translatable',
+                    'name' => 'area_label',
+                    'caption' => _t('_adm_nav_txt_items_area_label'),
+                    'info' => _t('_adm_nav_dsc_items_area_label'),
+                    'value' => isset($aItem['area_label']) ? $aItem['area_label'] : '_adm_nav_txt_item',
+                    'required' => '0',
+                    'db' => array (
+                        'pass' => 'Xss',
+                    ),
+                ),
                 'hidden_on' => array(
                     'type' => 'select_multiple',
                     'name' => 'hidden_on',
@@ -758,7 +780,7 @@ class BxBaseStudioNavigationItems extends BxDolStudioNavigationItems
                     'caption' => _t('_adm_nav_txt_items_icon'),
                     'info' => _t('_adm_nav_dsc_items_icon'),
                     'value' => '',
-					'code' => 1,
+                    'code' => 1,
                     'required' => '0',
                     'db' => array (
                         'pass' => 'Xss',
@@ -768,7 +790,7 @@ class BxBaseStudioNavigationItems extends BxDolStudioNavigationItems
                         'params' => array(),
                         'error' => _t('_adm_nav_err_items_icon'),
                     ),
-					'attrs' => array('class' => 'bx-form-input-textarea-small'),
+                    'attrs' => array('class' => 'bx-form-input-textarea-small'),
                 ),
                 'icon_image' => array(
                     'type' => 'file',
@@ -788,6 +810,17 @@ class BxBaseStudioNavigationItems extends BxDolStudioNavigationItems
                     'caption' => _t('_adm_nav_txt_items_icon_image_old'),
                     'content' => ''
                 ),
+                'icon_only' => array(
+                    'type' => 'switcher',
+                    'name' => 'icon_only',
+                    'caption' => _t('_adm_nav_txt_items_icon_only'),
+                    'info' => '',
+                    'value' => '1',
+                    'checked' => isset($aItem['icon_only']) && (int)$aItem['icon_only'] == 1,
+                    'db' => array (
+                        'pass' => 'Int',
+                    )
+                ),
                 'primary' => array(
                     'type' => 'switcher',
                     'name' => 'primary',

+ 3 - 1
template/menu_floating_blocks.html

@@ -5,7 +5,9 @@
             <div class="bx-menu-floating-blocks-icon">
                 <bx_include_auto:menu_icon.html />
             </div>
-            <div class="bx-menu-floating-blocks-title">__title__</div>
+            <bx_if:title>
+                <div class="bx-menu-floating-blocks-title">__title__</div>
+            </bx_if:title>
         </a>                
     </li></bx_repeat:menu_items>
 </ul>

+ 1 - 1
template/menu_icon.html

@@ -1,3 +1,3 @@
 <bx_if:icon><i class="sys-icon __icon__"></i></bx_if:icon>
-<bx_if:image><img class="sys-icon-image" src="__icon_url__" /></bx_if:image>
+<bx_if:image><img class="sys-icon-image" src="__icon_url__" __attrs__ /></bx_if:image>
 <bx_if:icon-html>__icon__</bx_if:icon-html>

+ 40 - 19
template/scripts/BxBaseMenu.php

@@ -226,12 +226,7 @@ class BxBaseMenu extends BxDolMenu
         $a['object'] = $this->_sObject;
 
         $a['title'] = _t($a['title']);
-        $a['bx_if:title'] = array(
-            'condition' => !empty($a['title']),
-            'content' => array(
-                'title' => $a['title']
-            )
-        );
+        $a['title_attr'] = $this->_getMenuTitle($a);
 
         $this->removeMarker('addon');
 
@@ -258,7 +253,6 @@ class BxBaseMenu extends BxDolMenu
         $a['class_link'] = '';
 
         $a['link'] = isset($a['link']) ? $this->_oPermalinks->permalink($a['link']) : 'javascript:void(0);';
-        $a['title_attr'] = bx_html_attribute(strip_tags($a['title']));
 
         $a['attrs'] = $this->_getMenuAttrs($a);
         $a['attrs_wrp'] = '';
@@ -276,10 +270,13 @@ class BxBaseMenu extends BxDolMenu
                 ]);
         }
 
-        $a['bx_if:image'] = array (
+        $a['bx_if:image'] = [
             'condition' => (bool)$sIconUrl,
-            'content' => array('icon_url' => $sIconUrl),
-        );
+            'content' => [
+                'icon_url' => $sIconUrl,
+                'attrs' => $this->_getMenuIconAttrs('image', $a)
+            ],
+        ];
         $a['bx_if:image_inline'] = array (
             'condition' => false,
             'content' => array('image' => ''),
@@ -296,13 +293,13 @@ class BxBaseMenu extends BxDolMenu
             'condition' => (bool)$sIconA,
             'content' => array('icon-a' => $sIconA),
         );
-        $a['bx_if:title'] = array (
-            'condition' => (bool)$a['title'],
-            'content' => array(
+        $a['bx_if:title'] = [
+            'condition' => (bool)$a['title'] && (!isset($a['icon_only']) || (int)$a['icon_only'] == 0),
+            'content' => [
                 'title' => $a['title'],
                 'title_attr' => $a['title_attr']
-            ),
-        );
+            ],
+        ];
 
         $bOnClick = !empty($a['onclick']);
         $aOnClick = $bOnClick ? [
@@ -371,15 +368,33 @@ class BxBaseMenu extends BxDolMenu
     {
         return BxTemplFunctions::getInstanceWithTemplate($this->_oTemplate)->getIcon(!empty($a['icon']) ? $a['icon'] : '');
     }
-    
+
+    protected function _getMenuIconAttrs ($sType, $a)
+    {
+        $sAttrs = '';
+
+        if($sType == 'image' && ($sTitleAttr = $this->_getMenuTitle($a)))
+            $sAttrs .= ' alt="' . $sTitleAttr . '"';
+
+        return $sAttrs;
+    }
+
+    protected function _getMenuTitle($a)
+    {
+        return bx_html_attribute(strip_tags(!empty($a['title_attr']) && ($sTitleAttr = _t($a['title_attr'])) ? $sTitleAttr : $a['title']));
+    }
+
     public function getMenuIconHtml($sIcon)
     {
         list ($sIcon, $sIconUrl, $sIconA, $sIconHtml) = BxTemplFunctions::getInstanceWithTemplate($this->_oTemplate)->getIcon($sIcon);
 
-        $a['bx_if:image'] = array (
+        $a['bx_if:image'] = [
             'condition' => (bool)$sIconUrl,
-            'content' => array('icon_url' => $sIconUrl),
-        );
+            'content' => [
+                'icon_url' => $sIconUrl,
+                'attrs' => ''
+            ],
+        ];
         $a['bx_if:icon'] = array (
             'condition' => (bool)$sIcon,
             'content' => array('icon' => $sIcon),
@@ -431,12 +446,18 @@ class BxBaseMenu extends BxDolMenu
     protected function _getMenuAttrs ($aMenuItem)
     {
         $sAttrs = '';
+        if(($sTitleAttr = $this->_getMenuTitle($aMenuItem)))
+            $sAttrs .= ' title="' . $sTitleAttr . '"';
+
         if(!empty($aMenuItem['target']))
             $sAttrs .= ' target="' . $aMenuItem['target'] . '"';
 
         if($this->_bAddNoFollow && !empty($aMenuItem['link']) && preg_match('@^https?://@', $aMenuItem['link']) && strncmp($aMenuItem['link'], BX_DOL_URL_ROOT, strlen(BX_DOL_URL_ROOT)) !== 0)
             $sAttrs .= ' rel="noreferrer"';
 
+        if(!empty($aMenuItem['area_label']))
+            $sAttrs .= ' area-label="' . bx_html_attribute(_t($aMenuItem['area_label'])) . '"';
+
         return $sAttrs;
     }