Есть два плагина - комментарии и яндекс кнопки. По умолчанию, они выводятся после контента - сначала комментарии, потом кнопки. А надо наоборот, чтобы сначала были кнопки, а потом комментарии. На задавание порядка вывода через админ-панель Joomla плагины не реагируют. После долгого гугления, пришёл к выводу, что решение кроется в php файлах плагинов. Каких-то конкретных решений в интернете я не нашёл, методом тыка и ассоциаций - тоже ничего не получилось) Вот код кнопок: Код (PHP): <?php // no direct access defined('_JEXEC') or die; class plgContentYandexsocial extends JPlugin { public function onContentAfterDisplay($context, &$row, &$params, $page=0) { $socialtype = $this->params->get('socialtype'); $yaru = $this->params->get('yaru'); $vkontakte = $this->params->get('vkontakte'); $facebook = $this->params->get('facebook'); $twitter = $this->params->get('twitter'); $odnoklassniki = $this->params->get('odnoklassniki'); $moimir = $this->params->get('moimir'); $lj = $this->params->get('lj'); $friendfeed = $this->params->get('friendfeed'); $moikrug = $this->params->get('moikrug'); $gplus = $this->params->get('gplus'); $view = JFactory::getApplication(); $viewscope = $view->scope; $viewtype = JRequest::getVar('view', null); if($viewtype == "article" && $viewscope == "com_content"){ return '<script type="text/javascript" src="//yastatic.net/share/share.js" charset="utf-8"></script> <div class="yashare-auto-init" data-yashareL10n="ru" data-yashareType="button" data-yashareQuickServices="vkontakte,facebook,twitter,odnoklassniki,moimir,lj,gplus"></div> '; } } } ?> А вот код комментариев: Код (PHP): <?php // no direct access defined('_JEXEC') or die('Restricted access'); if(!defined('DS')) define('DS', DIRECTORY_SEPARATOR); jimport( 'joomla.plugin.plugin' ); jimport('joomla.html.parameter'); class plgContentKament_Comments extends JPlugin { private $timeout = 1800; private $kament_server = 'svkament.ru'; var $plg_name = "kament_comments"; var $plg_copyrights_start = "\n\n<!-- \"KAMENT Comments for Joomla!\" (v1.0) starts here -->\n"; var $plg_copyrights_end = "\n\n<!-- \"KAMENT Comments for Joomla!\" (v1.0) ends here -->\n"; function plgContentKament_Comments( &$subject, $params ){ parent::__construct( $subject, $params ); } // Joomla! 1.6+ function onContentAfterDisplay($context, &$row, &$params, $limitstart = 0 ){ // Requests $option = JRequest::getCmd('option'); $view = JRequest::getCmd('view'); if($view == 'category' || $view == 'featured'){ $this->onContentPrepare('com_content.article', $row, $params, $limitstart ); } if(isset($row->text)){ $row->introtext = $row->text; } return; } // Joomla! 1.6+ function onContentPrepare($context, $row, $params, $page = 0){ if($context == 'com_content.article') $this->renderKament($row, $params, $page = 0); } function renderKament($row, $params, $page){ $mainframe = JFactory::getApplication(); $document = JFactory::getDocument(); $user = JFactory::getUser(); $sitePath = JPATH_SITE; $siteUrl = JURI::root(true); // Requests $option = JRequest::getCmd('option'); $view = JRequest::getCmd('view'); $layout = JRequest::getCmd('layout'); $page = JRequest::getCmd('page'); $secid = JRequest::getInt('secid'); $catid = JRequest::getInt('catid'); $itemid = JRequest::getInt('Itemid'); if(!$itemid) $itemid = 999999; // Check if plugin is enabled if(JPluginHelper::isEnabled('content',$this->plg_name)==false) return; // Load the plugin language file the proper way JPlugin::loadLanguage('plg_content_'.$this->plg_name, JPATH_ADMINISTRATOR); // Simple checks before parsing the plugin $properties = get_object_vars($row); if(!array_key_exists('catid',$properties)) return; if(version_compare(JVERSION,'1.6.0','lt')) { if(!array_key_exists('sectionid',$properties)) return; } // ----------------------------------- Get plugin parameters ----------------------------------- $plugin = JPluginHelper::getPlugin('content', $this->plg_name); $pluginParams=json_decode($plugin->params); $kamentSubDomain = (isset($pluginParams->kamentSubDomain)) ? $pluginParams->kamentSubDomain : ''; $selectedCategories = ($pluginParams->selectedCategories) ? $pluginParams->selectedCategories : ''; $selectedMenus = ($pluginParams->selectedMenus) ? $pluginParams->selectedMenus : ''; $kamentCounter = $pluginParams->kamentCounters; // External parameter for controlling plugin layout within modules if(!$params) $params = new JParameter(null); $parsedInModule = $params->get('parsedInModule'); if(!$kamentSubDomain){ // Quick check before we proceed JError::raiseNotice('', JText::_('KAMENT_PLEASE_ENTER_YOUR_KAMENT_SUBDOMAIN')); return; } else { // Perform some parameter cleanups $kamentSubDomain = str_replace(array('http://', ".$this->kament_server/", ".$this->kament_server"), array('','',''), $kamentSubDomain); } // ----------------------------------- Before plugin render ----------------------------------- // Get the current category $currectCategory = $row->catid; // Define plugin category restrictions $selectedCategories = (array)$selectedCategories; if(sizeof($selectedCategories)==1 && $selectedCategories[0]=='') { $categories[] = $currectCategory; } else { $categories = $selectedCategories; } // Define plugin menu restrictions $selectedMenus = (array)$selectedMenus; if(sizeof($selectedMenus)==1 && $selectedMenus[0]=='') { $menus[] = $itemid; } else { $menus = $selectedMenus; } // ----------------------------------- Prepare elements ----------------------------------- // Includes require_once(dirname(__FILE__).DS.$this->plg_name.DS.'includes'.DS.'helper.php'); require_once(JPATH_SITE.DS.'components'.DS.'com_content'.DS.'helpers'.DS.'route.php'); // Output object $output = new JObject; // Article URLs $websiteURL = (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != "off") ? "https://".$_SERVER['HTTP_HOST'] : "http://".$_SERVER['HTTP_HOST']; $levels = $user->getAuthorisedViewLevels(); if (in_array($row->access, $levels)) { if($view == 'article'){ $itemURL = $row->readmore_link; } else { $itemURL = JRoute::_(ContentHelperRoute::getArticleRoute($row->slug, $row->catid)); } } $itemURLbrowser = explode("#",$websiteURL.$_SERVER['REQUEST_URI']); $itemURLbrowser = $itemURLbrowser[0]; // Article URL assignments $output->itemURL = $websiteURL.$itemURL; $output->itemURLrelative = $itemURL; $output->itemURLbrowser = $itemURLbrowser; $output->kamentPageName = 'article_id'.$row->id; $output->kamentPageTitle = $row->title; // Fetch elements specific to the "article" view only if(in_array($currectCategory,$categories) && in_array($itemid,$menus) && $option=='com_content' && $view=='article'){ $plain_comments = $this->getPlainComments($kamentSubDomain, $output->kamentPageName); $output->comments = " <div id=\"kament_comments\">$plain_comments</div> <script type=\"text/javascript\"> //<![CDATA[ var kament_subdomain = '".$kamentSubDomain."'; var kament_page_name = '".$output->kamentPageName."'; var kament_page_url = '".$output->itemURL."'; var kament_page_title = '".$output->kamentPageTitle."'; (function() { var node = document.createElement('script'); node.type = 'text/javascript'; node.async = true; node.src = 'http://' + kament_subdomain + '.$this->kament_server/js/embed.js'; (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(node); })(); //]]> </script> <noscript> <a href=\"http://".$kamentSubDomain.".$this->kament_server\">".JText::_("KAMENT_VIEW_THE_DISCUSSION_THREAD")."</a> </noscript> "; } // ----------------------------------- Render the output ----------------------------------- // Append head includes only when the document is in HTML mode if(JRequest::getCmd('format')=='html' || JRequest::getCmd('format')==''){ // CSS $plgCSS = KamentHelper::getTemplatePath($this->plg_name,'css/template.css'); $plgCSS = $plgCSS->http; $document->addStyleSheet($plgCSS); } if(in_array($currectCategory,$categories) && in_array($itemid,$menus)){ if(!defined('KAMENT')) define('KAMENT',true); if(($option=='com_content' && $view=='article') && $parsedInModule!=1) { // Fetch the template ob_start(); $kamentArticlePath = KamentHelper::getTemplatePath($this->plg_name,'article.php'); $kamentArticlePath = $kamentArticlePath->file; include($kamentArticlePath); $getArticleTemplate = $this->plg_copyrights_start.ob_get_contents().$this->plg_copyrights_end; ob_end_clean(); // Output $row->text = $getArticleTemplate; } else if($kamentCounter && (($option=='com_content' && ($view=='frontpage' || $view=="featured" || $view=='section' || $view=='category')) || $parsedInModule==1)) { $row->text = $row->introtext; // Fetch the template ob_start(); $kamentListingPath = KamentHelper::getTemplatePath($this->plg_name,'listing.php'); $kamentListingPath = $kamentListingPath->file; include($kamentListingPath); $getListingTemplate = $this->plg_copyrights_start.ob_get_contents().$this->plg_copyrights_end; ob_end_clean(); // Output $row->text = $getListingTemplate; } } // END IF } // END FUNCTION function onAfterRender() { // API $mainframe = JFactory::getApplication(); $document = JFactory::getDocument(); // Assign paths $sitePath = JPATH_SITE; $siteUrl = JURI::root(true); // Requests $option = JRequest::getCmd('option'); $view = JRequest::getCmd('view'); $layout = JRequest::getCmd('layout'); $page = JRequest::getCmd('page'); $secid = JRequest::getInt('secid'); $catid = JRequest::getInt('catid'); $itemid = JRequest::getInt('Itemid'); if(!$itemid) $itemid = 999999; // Quick check to decide whether to render the plugin or not if(strpos(JResponse::getBody(),'#kament_comments')===false) return; // Admin check if($mainframe->isAdmin()) return; // ----------------------------------- Get plugin parameters ----------------------------------- $plugin = JPluginHelper::getPlugin('content', $this->plg_name); $pluginParams=json_decode($plugin->params); $kamentSubDomain = (isset($pluginParams->kamentSubDomain)) ? $pluginParams->kamentSubDomain : ''; $showCounters = $pluginParams->kamentCounters; if(!$kamentSubDomain || !$showCounters){ return; } else { // Perform some parameter cleanups $kamentSubDomain = str_replace(array('http://', ".$this->kament_server/", ".$this->kament_server"), array('','',''), $kamentSubDomain); } // Append head includes only when the document is in HTML mode if(JRequest::getCmd('format')=='html' || JRequest::getCmd('format')==''){ $elementToGrab = '</body>'; $htmlToInsert = " <!-- \"SV KAMENT Comments for Joomla! counter\" --> <script type=\"text/javascript\"> //<![CDATA[ var kament_subdomain = '{$kamentSubDomain}'; (function () { var s = document.createElement('script'); s.async = true; s.type = 'text/javascript'; s.src = 'http://' + kament_subdomain + '.$this->kament_server/js/counter.js'; (document.getElementsByTagName('HEAD')[0] || document.getElementsByTagName('BODY')[0]).appendChild(s); }()); //]]> </script> "; // Output $buffer = JResponse::getBody(); $buffer = str_replace($elementToGrab, $htmlToInsert."\n\n".$elementToGrab, $buffer); JResponse::setBody($buffer); } } // END FUNCTION private function getPlainComments($subdomain, $page_name) { $plain = ''; //check db first $db = JFactory::getDBO(); $sql_name = $db->quote($page_name); $db->setQuery("SELECT data, UNIX_TIMESTAMP(timestamp) as timestamp from #__kament_plain WHERE page_name=\"$sql_name\""); $results = $db->loadObjectList(); if(isset($results[0])) $plain = $results[0]->data; // if no db record or its outdated if(!isset($results[0]) || $results[0]->timestamp < (time() - $this->timeout)) { $new_data = $this->getUrlContent("http://$subdomain." . $this->kament_server . "/commentswidget/plain/?page_name=$page_name"); if($new_data != NULL) { // update db record $sql_data = $db->quote($new_data); $sql = "INSERT INTO #__kament_plain (page_name, timestamp, data) VALUES(\"$sql_name\", NOW(), \"$sql_data\") ON DUPLICATE KEY UPDATE timestamp=NOW(),data=\"$sql_data\""; $db->setQuery($sql); $db->query(); $plain = $new_data; } } return $plain; } private function getUrlContent($url) { try { if(!function_exists('curl_version')) return NULL; $ch = @curl_init ( $url ); if(!$ch) return NULL; @curl_setopt( $ch, CURLOPT_AUTOREFERER, true ); @curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true ); @curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); @curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE); @curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, FALSE); $output = curl_exec ( $ch ); $httpcode = curl_getinfo($ch,CURLINFO_HTTP_CODE); if (curl_errno ( $ch ) || $httpcode != 200) { return NULL; } else { curl_close ( $ch ); } if( strpos($output, 'kament-plaintext-comments')===false ) return NULL; return $output; }catch (Exception $e) { return NULL; } } } // END CLASS На одном форуме я прочитал, что решение кроется в добавлении onPrepareContent в код плагина. К сожалению, ничего больше там написано не было. Пробовал менять onContent - ничего не выходит. Заранее спасибо за внимание.
Как это? Не вникал, но у обоих есть onContentAfterDisplay, но комментарии возможно выводятся не им. Ну попробуй замени в первом коде onContentAfterDisplay на onContentPrepare (но не на onPrepareContent)
Ну в админ панели есть же пункт для кажого плагина в настройках - "Порядок". Именно им же порядок вывода регулируется. А с этими плагинами - это до одного места, как бы не ставил, очерёдность не меняется. onContentAfterDisplay есть, но что толку? Они правильно выводятся после контента, но не в той очерёдности, что нужно. ContentPrepare я пробовал пихать уже куда угодно - ничего это не даёт, в некоторых местах вообще от этого работать перестаёт. Вот такие пироги. Блин, проблема дурацкая такая.