AntonLV 6 роки тому
батько
коміт
1b1076c2ea

+ 21 - 0
inc/classes/BxDolLabel.php

@@ -77,6 +77,27 @@ class BxDolLabel extends BxDolFactory implements iBxDolSingleton
         return $this->_oDb->getLabels($aParams);
     }
 
+    public function getLabelUrl($sKeyword, $mixedSection = false) 
+    {   
+        $sSectionPart = '';
+        if(!empty($mixedSection)) {
+            if (is_array($mixedSection))
+                $sSectionPart = '&section[]=' . implode('&section[]=', $mixedSection);
+            elseif (is_string($mixedSection))
+                $sSectionPart = '&section[]=' . $mixedSection;
+        }
+
+        $sUrl = BX_DOL_URL_ROOT . 'searchKeyword.php?type=keyword&keyword=' . rawurlencode($sKeyword) . $sSectionPart;
+
+        bx_alert('meta_keyword', 'url', 0, false, array(
+           'url' => &$sUrl,
+           'keyword' => $sKeyword,
+           'section' => $mixedSection,
+        ));
+
+        return $sUrl;
+    }
+
     public function onAdd($iId)
     {
         $aLabel = $this->_oDb->getLabels(array('type' => 'id', 'id' => $iId));

+ 0 - 1
inc/js/classes/BxDolLabel.js

@@ -20,7 +20,6 @@ function BxDolLabel(oOptions) {
     this._sClassSublist = 'sys-labels-li-sublist';
 }
 
-// TODO: Continue from here: preload selected.
 BxDolLabel.prototype.selectLabels = function(oElement, aParams)
 {
     var $this = this;

+ 1 - 0
modules/boonex/forum/install/langs/en.xml

@@ -185,6 +185,7 @@
 	<string name="_bx_forum_page_block_title_manage"><![CDATA[Manage]]></string>    
   <string name="_bx_forum_page_block_title_popular_keywords"><![CDATA[Popular Hashtags]]></string>
 	<string name="_bx_forum_page_block_title_cats"><![CDATA[Discussions Categories]]></string>
+        <string name="_bx_forum_page_block_title_browse_labels"><![CDATA[Browse Labels]]></string>
   <string name="_bx_forum_page_block_title_sys_multicats"><![CDATA[Discussions Categories(Multi)]]></string>
   <string name="_bx_forum_page_block_title_multicats"><![CDATA[Discussions Categories]]></string>
 	<string name="_bx_forum_page_block_title_my_entries"><![CDATA[My Discussions]]></string>

+ 2 - 1
modules/boonex/forum/install/sql/enable.sql

@@ -144,7 +144,8 @@ INSERT INTO `sys_pages_blocks`(`object`, `cell_id`, `module`, `title_system`, `t
 ('bx_forum_home', 1, @sName, '', '_bx_forum_page_block_title_latest_entries', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:8:"bx_forum";s:6:"method";s:13:"browse_latest";s:6:"params";a:1:{i:0;s:5:"table";}}', 0, 1, 1, 1),
 ('bx_forum_home', 2, @sName, '', '_bx_forum_page_block_title_cats', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:15:"categories_list";s:6:"params";a:2:{i:0;s:13:"bx_forum_cats";i:1;a:1:{s:10:"show_empty";b:1;}}s:5:"class";s:20:"TemplServiceCategory";}', 0, 1, 1, 0),
 ('bx_forum_home', 2, @sName, '', '_bx_forum_page_block_title_popular_keywords', 11, 2147483647, 'service', 'a:4:{s:6:"module";s:6:"system";s:6:"method";s:14:"keywords_cloud";s:6:"params";a:2:{i:0;s:8:"bx_forum";i:1;s:8:"bx_forum";}s:5:"class";s:20:"TemplServiceMetatags";}', 0, 1, 1, 1),
-('bx_forum_home', 2, @sName, '_bx_forum_page_block_title_sys_multicats', '_bx_forum_page_block_title_multicats', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:8:"bx_forum";s:6:"method";s:21:"categories_multi_list";}', 0, 1, 0, 2);
+('bx_forum_home', 2, @sName, '', '_bx_forum_page_block_title_browse_labels', 11, 2147483647, 'service', 'a:3:{s:6:"module";s:6:"system";s:6:"method";s:13:"browse_labels";s:5:"class";s:20:"TemplServiceMetatags";}', 0, 1, 0, 0),
+('bx_forum_home', 2, @sName, '_bx_forum_page_block_title_sys_multicats', '_bx_forum_page_block_title_multicats', 11, 2147483647, 'service', 'a:2:{s:6:"module";s:8:"bx_forum";s:6:"method";s:21:"categories_multi_list";}', 0, 1, 0, 0);
 
 -- PAGE: module search
 INSERT INTO `sys_objects_page`(`object`, `uri`, `title_system`, `title`, `module`, `layout_id`, `visible_for_levels`, `visible_for_levels_editable`, `url`, `meta_description`, `meta_keywords`, `meta_robots`, `cache_lifetime`, `cache_editable`, `deletable`, `override_class_name`, `override_class_file`) VALUES 

+ 13 - 4
template/css/label.css

@@ -30,14 +30,23 @@
     flex-wrap: wrap;
 }
 .sys-labels-level.sys-ll-0 > .sys-labels-list-item {
-    -webkit-flex: 0 0 50%;
-    -ms-flex: 0 0 50%;
-    flex: 0 0 50%;
+    -webkit-flex: 0 0 auto;
+    -ms-flex: 0 0 auto;
+    flex: 0 0 auto;
 
-    width: 50%;
     padding-left: 0.25rem;
     padding-right: 0.25rem;
 }
+.sys-labels-list .sys-labels-level.sys-ll-0 > .sys-labels-list-item {
+    -webkit-flex-basis: 50%;
+    flex-basis: 50%;
+
+    width: 50%;
+}
+.bx-media-phone .sys-labels-browse .sys-labels-level.sys-ll-0 > .sys-labels-list-item,
+.bx-layout-column-thin .sys-labels-browse .sys-labels-level.sys-ll-0 > .sys-labels-list-item {
+    min-width: 50%;
+}
 .sys-labels-li-sublist {
     display: none;
 }

+ 4 - 0
template/label_browse.html

@@ -0,0 +1,4 @@
+<div class="sys-labels-browse">
+    <div class="sys-labels-browse-cnt bx-def-margin-thd-neg">__content__</div>
+</div>
+__js_code__

+ 19 - 0
template/label_browse_level.html

@@ -0,0 +1,19 @@
+<div class="sys-labels-level sys-ll-__level__">
+    <bx_repeat:labels>
+        <div class="sys-labels-list-item bx-def-padding-thd-topbottom bx-def-box-sizing">
+            <div class="sys-labels-list-item-box bx-def-padding-sec bx-def-border bx-def-round-corners bx-def-shadow">
+                <div class="sys-labels-li-title bx-def-margin-sec-leftright"><a href="__href__">__title__</a></div>
+                <bx_if:show_sublist_link>
+                    <div class="sys-labels-li-chevron bx-def-margin-sec-leftright">
+                        <a href="javascript:void(0)" onclick="javascript:__js_object__.showSublist(this)">
+                            <i class="sys-icon chevron-up"></i>
+                        </a>
+                    </div>
+                </bx_if:show_sublist_link>
+            </div>
+            <bx_if:show_sublist>
+                <div class="sys-labels-li-sublist sys-labels-lis-opened bx-def-padding-left">__content__</div>
+            </bx_if:show_sublist>
+        </div>
+    </bx_repeat:labels>
+</div>

+ 2 - 2
template/label_select_list_level.html

@@ -3,9 +3,9 @@
         <div class="sys-labels-list-item bx-def-padding-thd-topbottom bx-def-box-sizing">
             <div class="sys-labels-list-item-box bx-def-padding-sec bx-def-border bx-def-round-corners bx-def-shadow">
                 <div class="sys-labels-li-checbox">__checkbox__</div>
-                <div class="sys-labels-li-title bx-def-margin-sec-left"><label for="__html_id_label__">__title__</label></div>
+                <div class="sys-labels-li-title bx-def-margin-sec-leftright"><label for="__html_id_label__">__title__</label></div>
                 <bx_if:show_sublist_link>
-                    <div class="sys-labels-li-chevron">
+                    <div class="sys-labels-li-chevron bx-def-margin-sec-leftright">
                         <a href="javascript:void(0)" onclick="javascript:__js_object__.showSublist(this)">
                             <i class="sys-icon <bx_if:show_class_opened>chevron-up</bx_if:show_class_opened><bx_if:show_class_closed>chevron-down</bx_if:show_class_closed>"></i>
                         </a>

+ 111 - 24
template/scripts/BxBaseLabel.php

@@ -42,33 +42,49 @@ class BxBaseLabel extends BxDolLabel
         return $this->_sJsObjName;
     }
 
-    public function getJsCode($bDynamicMode = false)
+    public function getJsCodeForm($bDynamicMode = false)
     {
-        $sCode = $this->_sJsObjName . " = new " . $this->_sJsObjClass . "(" . json_encode(array(
+        return $this->getJsCode('form', $bDynamicMode);
+    }
+
+    public function getJsCodeView($bDynamicMode = false)
+    {
+        return $this->getJsCode('view', $bDynamicMode);
+    }
+
+    public function getJsCode($sType, $bDynamicMode = false)
+    {
+        if(!$bDynamicMode && bx_is_dynamic_request())
+            $bDynamicMode = true;
+
+        $sCodeObject = $this->_sJsObjName . " = new " . $this->_sJsObjClass . "(" . json_encode(array(
             'sObjName' => $this->_sJsObjName,
             'sRootUrl' => BX_DOL_URL_ROOT,
             'aHtmlIds' => $this->_aHtmlIds
         )) . ");";
 
         if($bDynamicMode) {
-            $sCode = "var " . $this->_sJsObjName . " = null;
-            if(typeof(jQuery.ui.core) == 'undefined')
-                $.getScript('" . bx_js_string($this->_oTemplate->getJsUrl('jquery-ui/jquery.ui.core.min.js'), BX_ESCAPE_STR_APOS) . "');
-            if(typeof(jQuery.ui.widget) == 'undefined')
-                $.getScript('" . bx_js_string($this->_oTemplate->getJsUrl('jquery-ui/jquery.ui.widget.min.js'), BX_ESCAPE_STR_APOS) . "');
-            if(typeof(jQuery.ui.menu) == 'undefined')
-                $.getScript('" . bx_js_string($this->_oTemplate->getJsUrl('jquery-ui/jquery.ui.menu.min.js'), BX_ESCAPE_STR_APOS) . "');
-            if(typeof(jQuery.ui.autocomplete) == 'undefined')
-                $.getScript('" . bx_js_string($this->_oTemplate->getJsUrl('jquery-ui/jquery.ui.autocomplete.min.js'), BX_ESCAPE_STR_APOS) . "');
-            if(window['" . $this->_sJsObjName . "'] === null)
+            $sCode = "var " . $this->_sJsObjName . " = null;";
+
+            if($sType == 'form')
+                $sCode .= "if(typeof(jQuery.ui.core) == 'undefined')
+                    $.getScript('" . bx_js_string($this->_oTemplate->getJsUrl('jquery-ui/jquery.ui.core.min.js'), BX_ESCAPE_STR_APOS) . "');
+                if(typeof(jQuery.ui.widget) == 'undefined')
+                    $.getScript('" . bx_js_string($this->_oTemplate->getJsUrl('jquery-ui/jquery.ui.widget.min.js'), BX_ESCAPE_STR_APOS) . "');
+                if(typeof(jQuery.ui.menu) == 'undefined')
+                    $.getScript('" . bx_js_string($this->_oTemplate->getJsUrl('jquery-ui/jquery.ui.menu.min.js'), BX_ESCAPE_STR_APOS) . "');
+                if(typeof(jQuery.ui.autocomplete) == 'undefined')
+                    $.getScript('" . bx_js_string($this->_oTemplate->getJsUrl('jquery-ui/jquery.ui.autocomplete.min.js'), BX_ESCAPE_STR_APOS) . "');";
+
+            $sCode .= "if(window['" . $this->_sJsObjName . "'] === null)
                 $.getScript('" . bx_js_string($this->_oTemplate->getJsUrl('BxDolLabel.js'), BX_ESCAPE_STR_APOS) . "', function(data, textStatus, jqxhr) {
-                    " . $sCode . "
+                    " . $sCodeObject . "
                 });";
         }
         else
-            $sCode = "if(window['" . $this->_sJsObjName . "'] == undefined) var " . $sCode;
+            $sCode = "if(window['" . $this->_sJsObjName . "'] == undefined) var " . $sCodeObject;
 
-        return $this->addCssJs($bDynamicMode) . $this->_oTemplate->_wrapInTagJsCode($sCode);
+        return $this->addCssJs($sType, $bDynamicMode) . $this->_oTemplate->_wrapInTagJsCode($sCode);
     }
 
     protected function selectLabels($aValues = array())
@@ -110,13 +126,68 @@ class BxBaseLabel extends BxDolLabel
         ));
     }
 
+    /**
+     * Get 'Browse Labels' block.
+     */
+    public function getLabelsBrowse($aParams = array())
+    {
+        $bShowEmpty = isset($aParams['show_empty']) ? (bool)$aParams['show_empty'] : false;
+
+        $iParentId = $iLevel = 0;
+        $sContent = $this->_getLabelsBrowse($iParentId, $iLevel);
+
+        if(empty($sContent))
+            return $bShowEmpty ? MsgBox(_t('_Empty')) : '';
+
+        return $this->_oTemplate->parseHtmlByName('label_browse.html', array(
+            'js_code' => $this->getJsCodeView(),
+            'content' => $sContent
+        ));
+    }
+
+    protected function _getLabelsBrowse($iParentId, $iLevel)
+    {
+        $aLabels = $this->getLabels(array('type' => 'parent', 'parent' => $iParentId));
+        if(empty($aLabels) || !is_array($aLabels))
+            return '';
+
+        $sJsObject = $this->getJsObjectName();
+
+        $aTmplVarsLabels = array();
+        foreach($aLabels as $aLabel) {
+            $sSublist = $this->_getLabelsBrowse($aLabel['id'], $iLevel + 1);
+            $bSublist = !empty($sSublist);
+
+            $aTmplVarsLabels[] = array(
+                'href' => $this->getLabelUrl($aLabel['value']),
+                'title' => $aLabel['value'],
+                'bx_if:show_sublist_link' => array(
+                    'condition' => $bSublist,
+                    'content' => array(
+                        'js_object' => $sJsObject,
+                    )
+                ),
+                'bx_if:show_sublist' => array(
+                    'condition' => $bSublist,
+                    'content' => array(
+                        'js_object' => $sJsObject,
+                        'content' => $sSublist
+                    ),
+                )
+            );
+        }
+
+        return $this->_oTemplate->parseHtmlByName('label_browse_level.html', array(
+            'level' => $iLevel,
+            'bx_repeat:labels' => $aTmplVarsLabels
+        ));
+    }
+
     /**
      * Get 'List' custom form element.
      */
     public function getLabelsList(&$aInput, &$oForm)
     {
-        $sContent = '';
-
         $bOpened = false;
         $iParentId = $iLevel = 0;
         $sContent = $this->_getLabelsList($iParentId, $iLevel, $bOpened, $aInput, $oForm);
@@ -158,6 +229,9 @@ class BxBaseLabel extends BxDolLabel
             $sSublist = $this->_getLabelsList($aLabel['id'], $iLevel + 1, $bSublistOpened, $aInput, $oForm);
             $bSublist = !empty($sSublist);
 
+            if($bSublistOpened)
+                $bOpened = true;
+
             $aTmplVarsLabels[] = array(
                 'checkbox' => $oForm->genInput($aCheckbox),
                 'html_id_label' => $sHtmlId,
@@ -196,21 +270,34 @@ class BxBaseLabel extends BxDolLabel
         ));
     }
 
-    public function addCssJs($bDynamicMode = false)
+    public function addCssJs($sType, $bDynamicMode = false)
     {
+        if(!$bDynamicMode && bx_is_dynamic_request())
+            $bDynamicMode = true;
+
         $sInclude = '';
+        $bTypeForm = $sType == 'form';
+
+        if(!$bDynamicMode) {
+            if($bTypeForm)
+                $this->_oTemplate->addJs(array(
+                    'jquery-ui/jquery.ui.core.min.js',
+                    'jquery-ui/jquery.ui.widget.min.js',
+                    'jquery-ui/jquery.ui.menu.min.js',
+                    'jquery-ui/jquery.ui.autocomplete.min.js'
+                ));
 
-        if(!$bDynamicMode)
             $this->_oTemplate->addJs(array(
-                'jquery-ui/jquery.ui.core.min.js',
-                'jquery-ui/jquery.ui.widget.min.js',
-                'jquery-ui/jquery.ui.menu.min.js',
-                'jquery-ui/jquery.ui.autocomplete.min.js', 
                 'BxDolLabel.js'
             ));
+        }
+
+        if($bTypeForm)
+            $sInclude .= $this->_oTemplate->addCss(array(
+                'forms.css', 
+            ), $bDynamicMode);
 
         $sInclude .= $this->_oTemplate->addCss(array(
-            'forms.css', 
             'label.css'
         ), $bDynamicMode);
 

+ 1 - 1
template/scripts/BxBaseLabelForm.php

@@ -54,7 +54,7 @@ class BxBaseLabelForm extends BxTemplFormView
 
         return $this->oTemplate->parseHtmlByName('label_select_field.html', array(
             'js_object' => $this->_oObject->getJsObjectName(),
-            'js_code' => $this->_oObject->getJsCode(),
+            'js_code' => $this->_oObject->getJsCodeForm(),
             'html_id' => $sHtmlId,
             'input_labels' => $this->genCustomInputUsernamesSuggestions($aInputLabels)
         ));

+ 5 - 0
template/scripts/BxBaseServiceMetatags.php

@@ -58,6 +58,11 @@ class BxBaseServiceMetatags extends BxDol
 		return $sResult;
     }
 
+    public function serviceBrowseLabels($aParams = array())
+    {
+        return BxDolLabel::getInstance()->getLabelsBrowse($aParams);
+    }
+
     /**
      * Get location map.
      * @param $sObject metatgs object to get keywords cloud for