PDA

Zobacz pełną wersję : Problem z loadposition więcej niż jeden raz w artykule



kaver
08-12-2013, 22:52
Witam,


Postępuję wg artykułu http://wiki.joomla.pl/Modu%C5%82_w_artykule


Moim celem jest umieszczenie w artykułach dwóch _różnych_ modułów. W modułach mają być reklamy, ale nie tylko.


Tworzę więc dwa moduły, przypisuję im utworzone przez siebie pozycje, np. reklama1 dla pierwszego modułu i reklama2 dla drugiego modułu.


Następnie w artykule wstawiam:


{loadposition reklama1}


{loadposition reklama2}


Moduł z pozycji reklama1 jest prawidłowo wstawiony, ale moduł reklama2 już nie - w jego miejsce pojawia się po raz drugi moduł reklama1.


Nie ma to związku z nazwą pozycji, próbowałem już różnych. Nie ma to też związku z reklamą, bo testowałem loadposition dla różnych modułów i zawsze, gdy loadposition użyłem po raz drugi w artykule, na stronie widoczny był w tym miejscu moduł, który został przywołany przez loadpoistion jako pierwszy (sczytując artykuł od góry).


Co powinienem zrobić, by loadpoistion mogło być użyte więcej niż jeden raz w artykule?


Bardzo proszę o pomoc osoby, które znają rozwiązanie tego problemu, a gdyby były potrzebne jakiekolwiek dodatkowe informacje, zaraz je uzupełnię.

zwiastun
08-12-2013, 23:23
Użyj:
{loadmodule systemowa_nazwa_modułu} - wczytuje wskazany w instrukcji moduł.

kaver
08-12-2013, 23:56
Dziękuję za odpowiedź. Przepraszam, ale nie do końca rozumiem. Jestem daleko od tematów programistycznych, dlatego czy mógłbyś przystępniej to wytłumaczyć? Moduły do artykułu muszę wczytać własne, tzn. utworzone na potrzeby reklam, a ich pozycja również jest wymyślona (nadana) przeze mnie, zgodnie z poradą w artykule http://wiki.joomla.pl/Modu%C5%82_w_artykule

Dlatego też nie wiem, jaką systemową nazwę modułu podać.

- - - Updated - - -

Niestety, gdy wpiszę

{loadmodule reklama1}

przy założeniu, że moduł nazywa się reklama1 nie przynosi to żadnego efektu.

Czy nie można więcej razy użyć odwołań do loadposition? To by rozwiązało sprawę.

zwiastun
08-12-2013, 23:59
http://wiki.joomla.pl/Pomoc25:Dodatek_Artyku%C5%82y_-_Wpinacz_modu%C5%82%C3%B3w

kaver
09-12-2013, 00:17
Przeczytałem opis, ale jest tutaj pewna nieścisłość, mianowicie - czy loadpoistion można w artykule używać parę razy?

Swoje moduły tworzę na bazie dodatku Phoca (chodzi o reklamy Google AdSense). Tworzę niezależne dwa moduły na bazie tego dodatku. Jako tytuł pierwszego podaję AdSense1, jako tytuł drugiego AdSense1. Tylko że w katalogu http://przyklad.pl/modules/ nie widnieją stworzone przeze mnie moduły AdSense1 i AdSense2. Wnioskuję, że nie mam więc możliwości podania systemowej nazwy modułu w poleceniu {loadmodule AdSense1} a podanie ogólnej nazwy modułu, jaka powstaje automatycznie po instalacji dodatku Phoca, czyli mod_phocagoogleadsense nic nie daje.

Możesz doradzić, co zrobić w tej sytuacji?

zwiastun
09-12-2013, 02:03
Użyj skladni:
{loadmodule systemowa_nazwa_modułu,Tytuł modułu}
systemowa_nazwa_modułu, np. articles_archive
Tytuł modułu, np. Archived Articles
PS Jeśli to jest własny moduł HTML, to nazwą systemową jest custom a nie Adsense1

kaver
09-12-2013, 20:09
Teraz działa - dzięki, tylko że znowu w przypadku użycia w artykule po raz drugi odwołania do loadmodule, Joomla ładuje pierwszy moduł.

Wygląda to tak:

Treść artykułu Treść artykułu Treść artykułu Treść artykułu

{loadmodule mod_phocagoogleadsense,Reklama1}

Treść artykułu Treść artykułu Treść artykułu Treść artykułu

{loadmodule mod_phocagoogleadsense,Reklama2}

Efekt:

Treść artykułu Treść artykułu Treść artykułu Treść artykułu

Reklama1

Treść artykułu Treść artykułu Treść artykułu Treść artykułu

Reklama1 (zamiast reklama2) !!!

Jak widzisz, mimo że mają być wstawione dwa różne moduły, na stronie jest widoczny dwa razy pierwszy. Wiesz może, jak to naprawić?

Jola
09-12-2013, 22:41
Witam,
czy oba moduły masz przypisane do wszystkich podstron?
Która wersja Joomla!

kaver
09-12-2013, 22:44
@Jola (http://forum.joomla.pl/member.php?10113-Jola) - tak, oczywiście obydwa moduły są przypisane do wszystkich podstron. Joomla! w wersji 1.7.0. Bardzo mi zależy na rozwiązaniu tego problemu.

Jola
09-12-2013, 23:24
Masz babo placek!
Szykuj się na zmiany.
Kopia witryny i przeniesienie na co najmniej wersję 2.5
Bez dyskusji :)

kaver
09-12-2013, 23:27
Wiem :) to nie będzie jednak łatwe ze względu na niektóre dodatki, które muszę przeinstalować lub zamienić na inne (brak zgodności z wyższymi wersjami Joomli). Ale przechodząc do sedna, czy w wersji 1.7.0 nie można zrobić niczego, by mieć prawidłowe wyświetlanie dwóch różnych modułów w jednym artykule?

Jola
09-12-2013, 23:47
Nie mam tego jak sprawdzić - testowałam na 3.2 - bo w takim dziale napisałeś - i działa.

kaver
10-12-2013, 00:27
Dzięki za odpowiedź, dobrze wiedzieć, że w nowej wersji działa. Nie pozostaje mi nic innego jak poważnie pomyśleć nad trójką. Mam tylko nadzieję, że aktualizacja z 1.7 do 3.2 rozwiąże ten problem, a nie przeniesie się ten bug ze starej wersji, bo to byłoby najgorsze - włożyć tyle pracy, a zero efektów :obojetny:

Jola
10-12-2013, 00:31
Przenieś najpierw na 2.5 - nie wiem jakie widzisz problemy z rozszerzeniami.
3.2 i wyżej raczej obserwuj. Jak na razie sprawia sporo niespodzianek.

Jola
10-12-2013, 01:07
W wersji 2.5 jest pewnie ten sam błąd co w 1.7.
plik plugins/content/loadmodule/loadmodule.php

protected function _loadmod($module, $title, $style = 'none')
{
// if (!isset(self::$mods[$module])) {
self::$mods[$module] = '';
$document = JFactory::getDocument();
$renderer = $document->loadRenderer('module');
$mod = JModuleHelper::getModule($module, $title);
// If the module without the mod_ isn't found, try it with mod_.
// This allows people to enter it either way in the content
if (!isset($mod)){
$name = 'mod_'.$module;
$mod = JModuleHelper::getModule($name, $title);
}
$params = array('style' => $style);
ob_start();

echo $renderer->render($mod, $params);

self::$mods[$module] = ob_get_clean();
// }
return self::$mods[$module];
}
Zakonentowanie linii if (!isset(self::$mods[$module])) {
i zamykającej warunek (przedostatnia) - załatwia problem :)

kaver
10-12-2013, 19:15
Witaj,

Już myślałem, że będę mógł dziękować ze wszystkich sił i cieszyć, że problem rozwiązany, ale niestety nie :( Zerknij, jeśli możesz na mój cały plik plugins/content/loadmodule/loadmodule.php

Widząc, że problem jest nadal, zakomentowałem nie tylko wskazaną przez Ciebie funkcję, ale również protected function _load($position, $style = 'none')

Szczegóły poniżej:




<?php
/**
* @version $Id: loadmodule.php 21766 2011-07-08 12:20:23Z eddieajau $
* @package Joomla.Plugin
* @subpackage Content.loadmodule
* @copyright Copyright (C) 2005 - 2011 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/


// no direct access
defined('_JEXEC') or die;


jimport('joomla.plugin.plugin');


class plgContentLoadmodule extends JPlugin
{
protected static $modules = array();
protected static $mods = array();
/**
* Plugin that loads module positions within content
*
* @param string The context of the content being passed to the plugin.
* @param object The article object. Note $article->text is also available
* @param object The article params
* @param int The 'page' number
*/
public function onContentPrepare($context, &$article, &$params, $page = 0)
{
// simple performance check to determine whether bot should process further
if (strpos($article->text, 'loadposition') === false && strpos($article->text, 'loadmodule') === false) {
return true;
}


// expression to search for (positions)
$regex = '/{loadposition\s+(.*?)}/i';
$style = $this->params->def('style', 'none');
// expression to search for(modules)
$regexmod = '/{loadmodule\s+(.*?)}/i';
$title = null;
$stylemod = $this->params->def('style', 'none');


// Find all instances of plugin and put in $matches for loadposition
// $matches[0] is full pattern match, $matches[1] is the position
preg_match_all($regex, $article->text, $matches, PREG_SET_ORDER);
// No matches, skip this
if ($matches){
$matcheslist = explode(',',$matches[0][1]);


if (!array_key_exists(1, $matcheslist)){
$matcheslist[1] = null;
}
foreach ($matches as $match) {
$position = trim($matcheslist[0]);
$style = trim($matcheslist[1]);


$output = $this->_load($position,$style);
// We should replace only first occurrence in order to allow positions with the same name to regenerate their content:
$article->text = preg_replace("|$match[0]|", addcslashes($output, '\\'), $article->text, 1);
}
}
// Find all instances of plugin and put in $matchesmod for loadmodule


preg_match_all($regexmod, $article->text, $matchesmod, PREG_SET_ORDER);
// If no matches, skip this
if ($matchesmod){
$matchesmodlist = explode(',',$matchesmod[0][1]);
//We may not have a specific module so set to null
if (!array_key_exists(1, $matchesmodlist)){
$matchesmodlist[1] = null;
}
// We may not have a module style so set to null.
if (!array_key_exists(2, $matchesmodlist)){
$matchesmodlist[2] = null;
}
foreach ($matchesmod as $matchmod) {
$module = trim($matchesmodlist[0]);
$name = trim($matchesmodlist[1]);
$style = trim($matchesmodlist[2]);
// $match[0] is full pattern match, $match[1] is the module,$match[2] is the title
$output = $this->_loadmod($module, $name, $style);
// We should replace only first occurrence in order to allow positions with the same name to regenerate their content:
$article->text = preg_replace("|$matchmod[0]|", addcslashes($output, '\\'), $article->text, 1);
}
}


}


protected function _load($position, $style = 'none')
{
// if (!isset(self::$modules[$position])) {
self::$modules[$position] = '';
$document = JFactory::getDocument();
$renderer = $document->loadRenderer('module');
$modules = JModuleHelper::getModules($position);
$params = array('style' => $style);
ob_start();


foreach ($modules as $module) {
echo $renderer->render($module, $params);
}


self::$modules[$position] = ob_get_clean();
// }
return self::$modules[$position];
}
// This is always going to get the first instance of the module type unless
// there is a title.
protected function _loadmod($module, $title, $style = 'none')
{
// if (!isset(self::$mods[$module])) {
self::$mods[$module] = '';
$document = JFactory::getDocument();
$renderer = $document->loadRenderer('module');
$mod = JModuleHelper::getModule($module, $title);
// If the module without the mod_ isn't found, try it with mod_.
// This allows people to enter it either way in the content
if (!isset($mod)){
$name = 'mod_'.$module;
$mod = JModuleHelper::getModule($name, $title);
}
$params = array('style' => $style);
ob_start();


echo $renderer->render($mod, $params);


self::$mods[$module] = ob_get_clean();
// }
return self::$mods[$module];
}
}






Bardzo Ci dziękuję za zaangażowanie w pomoc i może jeszcze uda się coś zrobić - może w tym pliku w wersji 1.7.0 jest jeszcze jakiś bug. Za pomoc będę bardzo wdzięczny.

Jola
10-12-2013, 20:16
Po prostu wyślij mi na priv dane do strony i ftp - będzie szybciej.