Проблема Как изменить порядок срабатывания плагинов (порядок отображения)?

Тема в разделе "Модернизация расширений", создана пользователем Putnik, 10.11.2014.

  1. Offline

    Putnik Недавно здесь

    Регистрация:
    06.02.2011
    Сообщения:
    14
    Симпатии:
    0
    Пол:
    Мужской
    Есть два плагина - комментарии и яндекс кнопки. По умолчанию, они выводятся после контента - сначала комментарии, потом кнопки. А надо наоборот, чтобы сначала были кнопки, а потом комментарии. На задавание порядка вывода через админ-панель Joomla плагины не реагируют. После долгого гугления, пришёл к выводу, что решение кроется в php файлах плагинов. Каких-то конкретных решений в интернете я не нашёл, методом тыка и ассоциаций - тоже ничего не получилось)
    Вот код кнопок:
    Код (PHP):
    1. <?php
    2.  
    3. // no direct access
    4. defined('_JEXEC') or die;
    5. class plgContentYandexsocial extends JPlugin
    6. {
    7.    
    8.     public function onContentAfterDisplay($context, &$row, &$params, $page=0)
    9.         {
    10.         $socialtype = $this->params->get('socialtype');
    11.         $yaru = $this->params->get('yaru');
    12.         $vkontakte = $this->params->get('vkontakte');
    13.         $facebook = $this->params->get('facebook');
    14.         $twitter = $this->params->get('twitter');
    15.         $odnoklassniki = $this->params->get('odnoklassniki');
    16.         $moimir = $this->params->get('moimir');
    17.         $lj = $this->params->get('lj');
    18.         $friendfeed = $this->params->get('friendfeed');
    19.         $moikrug = $this->params->get('moikrug');
    20.         $gplus = $this->params->get('gplus');
    21.         $view = JFactory::getApplication();
    22.         $viewscope = $view->scope;
    23.         $viewtype = JRequest::getVar('view', null);
    24.         if($viewtype == "article" && $viewscope == "com_content"){
    25.         return '<script type="text/javascript" src="//yastatic.net/share/share.js" charset="utf-8"></script>
    26.                <div class="yashare-auto-init" data-yashareL10n="ru"
    27.                    data-yashareType="button" data-yashareQuickServices="vkontakte,facebook,twitter,odnoklassniki,moimir,lj,gplus"></div> ';
    28.             }
    29.         }
    30. }
    31. ?>


    А вот код комментариев:
    Код (PHP):
    1. <?php
    2.  
    3. // no direct access
    4. defined('_JEXEC') or die('Restricted access');
    5.  
    6. if(!defined('DS')) define('DS', DIRECTORY_SEPARATOR);
    7.  
    8. jimport( 'joomla.plugin.plugin' );
    9. jimport('joomla.html.parameter');
    10.  
    11.  
    12. class plgContentKament_Comments extends JPlugin {
    13.     private $timeout = 1800;
    14.     private $kament_server = 'svkament.ru';
    15.  
    16.  
    17.     var $plg_name                = "kament_comments";
    18.     var $plg_copyrights_start    = "\n\n<!-- \"KAMENT Comments for Joomla!\" (v1.0) starts here -->\n";
    19.     var $plg_copyrights_end        = "\n\n<!-- \"KAMENT Comments for Joomla!\" (v1.0) ends here -->\n";
    20.  
    21.     function plgContentKament_Comments( &$subject, $params ){
    22.         parent::__construct( $subject, $params );
    23.     }
    24.  
    25.     // Joomla! 1.6+
    26.     function onContentAfterDisplay($context, &$row, &$params, $limitstart = 0 ){
    27.         // Requests
    28.         $option = JRequest::getCmd('option');
    29.         $view     = JRequest::getCmd('view');      
    30.         if($view == 'category' || $view == 'featured'){
    31.             $this->onContentPrepare('com_content.article', $row, $params, $limitstart );
    32.         }
    33.         if(isset($row->text)){
    34.             $row->introtext = $row->text;
    35.         }
    36.         return;
    37.     }
    38.    
    39.     // Joomla! 1.6+
    40.     function onContentPrepare($context, $row, $params, $page = 0){
    41.         if($context == 'com_content.article')
    42.             $this->renderKament($row, $params, $page = 0);
    43.     }
    44.  
    45.     function renderKament($row, $params, $page){
    46.  
    47.         $mainframe    = JFactory::getApplication();
    48.         $document     = JFactory::getDocument();
    49.         $user        = JFactory::getUser();
    50.  
    51.         $sitePath     = JPATH_SITE;
    52.         $siteUrl      = JURI::root(true);
    53.  
    54.         // Requests
    55.         $option         = JRequest::getCmd('option');
    56.         $view             = JRequest::getCmd('view');
    57.         $layout         = JRequest::getCmd('layout');
    58.         $page             = JRequest::getCmd('page');
    59.         $secid             = JRequest::getInt('secid');
    60.         $catid             = JRequest::getInt('catid');
    61.         $itemid         = JRequest::getInt('Itemid');
    62.         if(!$itemid) $itemid = 999999;
    63.  
    64.         // Check if plugin is enabled
    65.         if(JPluginHelper::isEnabled('content',$this->plg_name)==false) return;
    66.  
    67.         // Load the plugin language file the proper way
    68.         JPlugin::loadLanguage('plg_content_'.$this->plg_name, JPATH_ADMINISTRATOR);
    69.        
    70.         // Simple checks before parsing the plugin
    71.         $properties = get_object_vars($row);
    72.         if(!array_key_exists('catid',$properties)) return;
    73.         if(version_compare(JVERSION,'1.6.0','lt')) {
    74.             if(!array_key_exists('sectionid',$properties)) return;
    75.         }
    76.  
    77.         // ----------------------------------- Get plugin parameters -----------------------------------
    78.         $plugin = JPluginHelper::getPlugin('content', $this->plg_name);
    79.  
    80.         $pluginParams=json_decode($plugin->params);
    81.  
    82.         $kamentSubDomain    = (isset($pluginParams->kamentSubDomain)) ? $pluginParams->kamentSubDomain : '';
    83.         $selectedCategories = ($pluginParams->selectedCategories) ? $pluginParams->selectedCategories : '';
    84.         $selectedMenus      = ($pluginParams->selectedMenus) ? $pluginParams->selectedMenus : '';
    85.         $kamentCounter      = $pluginParams->kamentCounters;
    86.  
    87.         // External parameter for controlling plugin layout within modules
    88.         if(!$params) $params = new JParameter(null);
    89.         $parsedInModule = $params->get('parsedInModule');
    90.        
    91.         if(!$kamentSubDomain){
    92.             // Quick check before we proceed
    93.             JError::raiseNotice('', JText::_('KAMENT_PLEASE_ENTER_YOUR_KAMENT_SUBDOMAIN'));
    94.             return;
    95.         } else {
    96.             // Perform some parameter cleanups
    97.             $kamentSubDomain = str_replace(array('http://', ".$this->kament_server/", ".$this->kament_server"), array('','',''), $kamentSubDomain);
    98.         }
    99.  
    100.  
    101.  
    102.         // ----------------------------------- Before plugin render -----------------------------------
    103.        
    104.         // Get the current category
    105.         $currectCategory = $row->catid;
    106.        
    107.         // Define plugin category restrictions
    108.         $selectedCategories = (array)$selectedCategories;
    109.         if(sizeof($selectedCategories)==1 && $selectedCategories[0]=='') {
    110.             $categories[] = $currectCategory;
    111.         } else {
    112.             $categories = $selectedCategories;
    113.         }
    114.  
    115.         // Define plugin menu restrictions
    116.         $selectedMenus = (array)$selectedMenus;
    117.         if(sizeof($selectedMenus)==1 && $selectedMenus[0]=='') {
    118.             $menus[] = $itemid;
    119.         } else {
    120.             $menus = $selectedMenus;
    121.         }
    122.  
    123.  
    124.  
    125.         // ----------------------------------- Prepare elements -----------------------------------
    126.  
    127.         // Includes
    128.         require_once(dirname(__FILE__).DS.$this->plg_name.DS.'includes'.DS.'helper.php');
    129.         require_once(JPATH_SITE.DS.'components'.DS.'com_content'.DS.'helpers'.DS.'route.php');
    130.  
    131.         // Output object
    132.         $output = new JObject;
    133.  
    134.         // Article URLs
    135.         $websiteURL = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != "off") ? "https://".$_SERVER['HTTP_HOST'] : "http://".$_SERVER['HTTP_HOST'];
    136.  
    137.  
    138.         $levels = $user->getAuthorisedViewLevels();
    139.  
    140.         if (in_array($row->access, $levels)) {
    141.             if($view == 'article'){
    142.                 $itemURL = $row->readmore_link;
    143.             } else {
    144.                 $itemURL = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid));
    145.             }
    146.         }
    147.  
    148.         $itemURLbrowser = explode("#",$websiteURL.$_SERVER['REQUEST_URI']);
    149.         $itemURLbrowser = $itemURLbrowser[0];
    150.  
    151.         // Article URL assignments
    152.         $output->itemURL             = $websiteURL.$itemURL;
    153.         $output->itemURLrelative     = $itemURL;
    154.         $output->itemURLbrowser        = $itemURLbrowser;
    155.         $output->kamentPageName        = 'article_id'.$row->id;
    156.         $output->kamentPageTitle    = $row->title;
    157.  
    158.         // Fetch elements specific to the "article" view only
    159.         if(in_array($currectCategory,$categories) && in_array($itemid,$menus) && $option=='com_content' && $view=='article'){
    160.  
    161.             $plain_comments = $this->getPlainComments($kamentSubDomain, $output->kamentPageName);
    162.  
    163.             $output->comments = "
    164.            <div id=\"kament_comments\">$plain_comments</div>
    165.            <script type=\"text/javascript\">
    166.                //<![CDATA[
    167.                var kament_subdomain = '".$kamentSubDomain."';
    168.                var kament_page_name = '".$output->kamentPageName."';
    169.                var kament_page_url = '".$output->itemURL."';
    170.                var kament_page_title = '".$output->kamentPageTitle."';
    171.                (function() {
    172.                    var node = document.createElement('script'); node.type = 'text/javascript'; node.async = true;
    173.                    node.src = 'http://' + kament_subdomain + '.$this->kament_server/js/embed.js';
    174.                    (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(node);
    175.                })();
    176.                //]]>
    177.            </script>
    178.            <noscript>
    179.                <a href=\"http://".$kamentSubDomain.".$this->kament_server\">".JText::_("KAMENT_VIEW_THE_DISCUSSION_THREAD")."</a>
    180.            </noscript>
    181.            ";
    182.         }
    183.  
    184.  
    185.         // ----------------------------------- Render the output -----------------------------------
    186.         // Append head includes only when the document is in HTML mode
    187.         if(JRequest::getCmd('format')=='html' || JRequest::getCmd('format')==''){
    188.  
    189.             // CSS
    190.             $plgCSS = KamentHelper::getTemplatePath($this->plg_name,'css/template.css');
    191.             $plgCSS = $plgCSS->http;
    192.  
    193.             $document->addStyleSheet($plgCSS);
    194.         }
    195.  
    196.         if(in_array($currectCategory,$categories) && in_array($itemid,$menus)){
    197.            
    198.             if(!defined('KAMENT')) define('KAMENT',true);
    199.            
    200.             if(($option=='com_content' && $view=='article') && $parsedInModule!=1) {
    201.  
    202.                 // Fetch the template
    203.                 ob_start();
    204.                 $kamentArticlePath = KamentHelper::getTemplatePath($this->plg_name,'article.php');
    205.                 $kamentArticlePath = $kamentArticlePath->file;
    206.                 include($kamentArticlePath);
    207.                 $getArticleTemplate = $this->plg_copyrights_start.ob_get_contents().$this->plg_copyrights_end;
    208.                 ob_end_clean();
    209.  
    210.                 // Output
    211.                 $row->text = $getArticleTemplate;
    212.  
    213.             } else if($kamentCounter && (($option=='com_content' && ($view=='frontpage' || $view=="featured" || $view=='section' || $view=='category')) || $parsedInModule==1)) {
    214.  
    215.                 $row->text = $row->introtext;
    216.  
    217.                 // Fetch the template
    218.                 ob_start();
    219.                 $kamentListingPath = KamentHelper::getTemplatePath($this->plg_name,'listing.php');
    220.                 $kamentListingPath = $kamentListingPath->file;
    221.                 include($kamentListingPath);
    222.                 $getListingTemplate = $this->plg_copyrights_start.ob_get_contents().$this->plg_copyrights_end;
    223.                 ob_end_clean();
    224.  
    225.                 // Output
    226.                 $row->text = $getListingTemplate;
    227.  
    228.             }
    229.  
    230.         } // END IF
    231.  
    232.     } // END FUNCTION
    233.  
    234.  
    235.     function onAfterRender() {
    236.  
    237.         // API
    238.         $mainframe    = JFactory::getApplication();
    239.         $document     = JFactory::getDocument();
    240.  
    241.         // Assign paths
    242.         $sitePath = JPATH_SITE;
    243.         $siteUrl  = JURI::root(true);
    244.  
    245.         // Requests
    246.         $option         = JRequest::getCmd('option');
    247.         $view             = JRequest::getCmd('view');
    248.         $layout         = JRequest::getCmd('layout');
    249.         $page             = JRequest::getCmd('page');
    250.         $secid             = JRequest::getInt('secid');
    251.         $catid             = JRequest::getInt('catid');
    252.         $itemid         = JRequest::getInt('Itemid');
    253.         if(!$itemid) $itemid = 999999;
    254.  
    255.         // Quick check to decide whether to render the plugin or not
    256.         if(strpos(JResponse::getBody(),'#kament_comments')===false) return;
    257.  
    258.         // Admin check
    259.         if($mainframe->isAdmin()) return;
    260.  
    261.         // ----------------------------------- Get plugin parameters -----------------------------------
    262.         $plugin = JPluginHelper::getPlugin('content', $this->plg_name);
    263.         $pluginParams=json_decode($plugin->params);
    264.         $kamentSubDomain    = (isset($pluginParams->kamentSubDomain)) ? $pluginParams->kamentSubDomain : '';
    265.         $showCounters        = $pluginParams->kamentCounters;
    266.  
    267.  
    268.         if(!$kamentSubDomain || !$showCounters){
    269.             return;
    270.         } else {
    271.             // Perform some parameter cleanups
    272.             $kamentSubDomain = str_replace(array('http://', ".$this->kament_server/", ".$this->kament_server"), array('','',''), $kamentSubDomain);
    273.         }
    274.  
    275.         // Append head includes only when the document is in HTML mode
    276.         if(JRequest::getCmd('format')=='html' || JRequest::getCmd('format')==''){
    277.             $elementToGrab = '</body>';
    278.             $htmlToInsert = "
    279.                <!-- \"SV KAMENT Comments for Joomla! counter\" -->
    280.                <script type=\"text/javascript\">
    281.                    //<![CDATA[
    282.                    var kament_subdomain = '{$kamentSubDomain}';
    283.                    (function () {
    284.                            var s = document.createElement('script'); s.async = true;
    285.                            s.type = 'text/javascript';
    286.                            s.src = 'http://' + kament_subdomain + '.$this->kament_server/js/counter.js';
    287.                            (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s);
    288.                        }());
    289.  
    290.                    //]]>
    291.                </script>
    292.            ";
    293.  
    294.             // Output
    295.             $buffer = JResponse::getBody();
    296.             $buffer = str_replace($elementToGrab, $htmlToInsert."\n\n".$elementToGrab, $buffer);
    297.             JResponse::setBody($buffer);
    298.         }
    299.  
    300.     } // END FUNCTION
    301.  
    302.  
    303.  
    304.     private function getPlainComments($subdomain, $page_name) {
    305.         $plain = '';
    306.        
    307.         //check db first
    308.         $db = JFactory::getDBO();
    309.         $sql_name = $db->quote($page_name);
    310.         $db->setQuery("SELECT data, UNIX_TIMESTAMP(timestamp) as timestamp from #__kament_plain WHERE page_name=\"$sql_name\"");
    311.         $results = $db->loadObjectList();
    312.         if(isset($results[0]))
    313.             $plain = $results[0]->data;
    314.  
    315.         // if no db record or its outdated
    316.         if(!isset($results[0]) || $results[0]->timestamp < (time() - $this->timeout)) {
    317.             $new_data = $this->getUrlContent("http://$subdomain." . $this->kament_server . "/commentswidget/plain/?page_name=$page_name");
    318.             if($new_data != NULL) { // update db record
    319.                 $sql_data = $db->quote($new_data);
    320.                 $sql = "INSERT INTO #__kament_plain (page_name, timestamp, data) VALUES(\"$sql_name\", NOW(), \"$sql_data\") ON DUPLICATE KEY UPDATE timestamp=NOW(),data=\"$sql_data\"";
    321.                 $db->setQuery($sql);
    322.                 $db->query();
    323.  
    324.                 $plain = $new_data;
    325.             }
    326.         }
    327.         return $plain;
    328.     }
    329.  
    330.  
    331.     private function getUrlContent($url) {
    332.         try {
    333.             if(!function_exists('curl_version'))
    334.                 return NULL;
    335.  
    336.             $ch = @curl_init ( $url );
    337.             if(!$ch)
    338.                 return NULL;
    339.  
    340.             @curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
    341.             @curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
    342.             @curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 );
    343.             @curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE);  
    344.             @curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, FALSE);
    345.  
    346.             $output = curl_exec ( $ch );
    347.             $httpcode = curl_getinfo($ch,CURLINFO_HTTP_CODE);
    348.             if (curl_errno ( $ch ) || $httpcode != 200) {
    349.                 return NULL;
    350.             } else {
    351.                 curl_close ( $ch );
    352.             }
    353.  
    354.             if( strpos($output, 'kament-plaintext-comments')===false )
    355.                 return NULL;
    356.  
    357.             return $output;
    358.  
    359.         }catch (Exception $e) {
    360.             return NULL;
    361.         }
    362.     }
    363.  
    364. } // END CLASS


    На одном форуме я прочитал, что решение кроется в добавлении onPrepareContent в код плагина. К сожалению, ничего больше там написано не было. Пробовал менять onContent - ничего не выходит.

    Заранее спасибо за внимание.
     
  2.  
  3. OlegM
    Offline

    OlegM Russian Joomla! Team Команда форума

    Регистрация:
    12.04.2007
    Сообщения:
    4 310
    Симпатии:
    375
    Пол:
    Мужской
    Как это?
    Не вникал, но у обоих есть onContentAfterDisplay, но комментарии возможно выводятся не им.

    Ну попробуй замени в первом коде onContentAfterDisplay на onContentPrepare (но не на onPrepareContent)
     
  4. Offline

    Putnik Недавно здесь

    Регистрация:
    06.02.2011
    Сообщения:
    14
    Симпатии:
    0
    Пол:
    Мужской
    Ну в админ панели есть же пункт для кажого плагина в настройках - "Порядок". Именно им же порядок вывода регулируется. А с этими плагинами - это до одного места, как бы не ставил, очерёдность не меняется. onContentAfterDisplay есть, но что толку? Они правильно выводятся после контента, но не в той очерёдности, что нужно. ContentPrepare я пробовал пихать уже куда угодно - ничего это не даёт, в некоторых местах вообще от этого работать перестаёт. Вот такие пироги. Блин, проблема дурацкая такая.
     
  5. OlegM
    Offline

    OlegM Russian Joomla! Team Команда форума

    Регистрация:
    12.04.2007
    Сообщения:
    4 310
    Симпатии:
    375
    Пол:
    Мужской
    одни эмоции...

    Тем более, что код соц.кнопок можно вставить в шаблон без использования плагина.
     

Поделиться этой страницей

Загрузка...