Joomla und Erweiterungen (Templates, Komponenten, Plugins, Module)

Wissenswertes, Anleitungen, Workarounds, Bugfixes zu Joomla und Joomla-Erweiterungen

Bewertung: 1 / 5

Stern aktivStern inaktivStern inaktivStern inaktivStern inaktiv

Problembeschreibung

Bei der Konstellation von Joomla 1.5.23 und der Komponente RokDownloads 1.0.2 trat bei meinen Projekten das Problem auf, dass wenn Benutzer nicht angemeldet waren und ein Dokument herunterladen wollen, welches nur für registrierte Nutzer downloadbar ist auf die Projekt-Startseite weitergleitet werden statt direkt zur Seite "Registrieren". Eine Möglichkeit, dass per Parameter einzustellen, konnte ich nicht finden und das, obwohl in den Scripten doch auf einen dafür vorhandenen Parameter files_download_redirect_for_no_access zugegriffen wird. Der Parameter ist schlicht leer.

Ob dieses Problem nur typische für meine Projekte ist, oder auch andere sich mit diesem wundersamen Verhalten herumschlagen, konnte ich nicht feststellen. In früheren Versionen von Joomla und RokDownloads ging es schon mal. Nun ja, ich musste das Problem beheben und will hier beschreiben wie ich vorgegangen bin.

Stern inaktivStern inaktivStern inaktivStern inaktivStern inaktiv

Problembeschreibung

Die Komponente SEF Service Map verwendet noch in Ihren Scripten die PHP-Vergleichsfunktion eregi(). Ab PHP Version 5.3 ist diese veraltet (deprecated). Werden durch die Hostingprovider die PHP-Versionen hochgesetzt kommt es dann zu Fehlerausgaben auf der Website. Diese sind zwar zunächst unkritisch, weil es nur Warnausgaben sind, aber sehrwohl stören diese das Seitenlayout, weshalb ein Behebung unumgänglich ist.

Leider wird die Komponente durch den Entwickler diesbezüglich wohl schleppend gepflegt. Deshalb kommt man um ein händischen Fixen nicht herum.

Bewertung: 5 / 5

Stern aktivStern aktivStern aktivStern aktivStern aktiv
Angehängte Session-ID an URLs unterdrücken

- sichtbar auch in Suchmaschinen
- verschwinden beim zweiten Aufruf


Aus JoomlaPortal


Bastelt mal eine Testdatei mit folgendem Inhalt oder kopiert das in die index.php des Templates zum debuggen:

php-Code: Test auf Session-ID
 echo "(". ini_get("session.use_trans_sid") .")";

die "Klammern" sollten leer sein oder die Zahl 0 enthalten, was eigentlich auch die Voreinstellung ist und der Sicherheit dient. Ist dies nicht der Fall, hat jemand daran geschraubt oder ihr habt 'ne verkorkste lokale "XAMPP"-Installation.
Ist der Wert "On", "true" oder "1" klebt PHP die Session-ID beim ersten Seitenaufruf kaputtautomatisch an die URL, an alles was nach einem Link riecht (href=xxx) und packt ein verstecktes Feld in *alle* Formulare. Genau: PHP verändert den HTML-Code bei dieser Einstellung eigenmächtig, nicht Joomla -- daher das zerschossene fieldset. Ab dem 2. Aufruf greifen i.d.R. die Cookies und die Session-ID "verschwindet" wieder auf magische Weise.

Bewertung: 5 / 5

Stern aktivStern aktivStern aktivStern aktivStern aktiv

Bei diesen Ausführungen geht es vorwiegend um die wunschgemäße Anpassung der Templates zur Anzeige der Kontakt-Detailseiten und dem notwendigen Wissen um das Zusammenspiel der einzelnen dafür notw. Scripte.

Die Template-Scripte

Es gibt sowohl Script zur Anzeige der Kontakt-Kategorien, z.B. in Listenform und Templatescripte zur Anzeige der einzelnen Kontaktdetails. Joomla stellt diese aus den Verzeichnissen components/com_contact/views/categories/ und components/com_contact/views/categories/ bereit. Wie üblich als default.php.

Werden andere Joomla-Templates verwendet, kann es sein, dass diese eigenen Templates für diese Seiten mitbringen die dann ggfl. im Template-Verzeichnis von Joomla zu suchen sind. Bei der Template-Komponente HM-YAML z.B. liegen diese dann in Unterverzeichnissen von /templates/hm_yaml/html/com_contact/... in ab da gleicher Struktur wie im J!Contact-Verzeichnis.

Bewertung: 4 / 5

Stern aktivStern aktivStern aktivStern aktivStern inaktiv
Wer etwas tiefer in die Templategestaltung einsteigen möchte und dabei für sein Template das Style-Verhalten von Modulen ändern will, oder für einzelne oder eine Gruppe von Modulen neue Styles hinzufügen möchte, kann das in Joomla über die modChrome-Funktion realisieren. Im Beipiel beziehe ich mich auf die Template-Engine JYAML von Hieblmedia.
 
 

Wie wird modChrome genutzt und aufgerufen?

 
Der Aufruf erfolgt im Haupttemplatescript index.php, so wie bekannt über z.b. in nachfolgender Weise:
 
templates/hm_yaml/html/index/THEME/index.php
1
2
3
4
5
6
7
8
9
10
11
<?php
 if($this->countModules( 'teaser' )) :
 $jyaml->getPosition('modules', 'teaser', 'rounded', ''); 
 endif;
?>

<?php
 if($this->countModules( 'HeadFuncModules' )) :
 $jyaml->getPosition('modules', 'HeadFuncModules', 'headfunctionmodule', ''); 
 endif;
?>

Die "Pflichtparameter" sind type, name und style. Ein weiterer Parameter kann genutzt werden um diverse Variablen (Attribute) zu übergeben, die durch modChrome interpretiert werden. Dazu gleich mehr. Zu den ersten beiden Parametern type und name muss wohl nichts gesagt werden, das ist in vielen anderen Artikeln zum Joomla Template und PatTemplate hinreichend dokumentiert (z.B. hier). Mit dem Style-Paramter übergeben wir in unserem Beispiel den Bezeichner teaser. Damit wird in der Funktion modChrome festgelegt, welcher Style verwendet werden soll. Im Anderen Fallbeispiel wird hier rounded verwendet. rounded ist eine der vorgefertigten hm_yaml-Styles, so wie es z.B. auch xhtml, table, none und horz gibt. Im zweiten Fallbeispiel wollen wir einen eigenen Style headfunctionmodule in der Modulposition HeadFuncModules verwenden.

 

Was passiert bei modChrome?

Im Detail passiert folgendes: Verantwortlich für individuell modChrome-Definitionen ist das Script modules.php. Bei JYAML liegt das im Verzeichnis joomlarootpfad/templates/hm_yaml/html/. Enhalten ist dort schon ein Beispiel mit dem Bezeichner jyaml Der Bezeichner jyaml wird montiert zum Methodennamen modChrome_jyaml. Genau diese Methode muss in modules.php existieren und ist die für den Style verantwortliche. Es können dann also in modules.php mehrere modChrome-Methoden definiert werden und somit wie oben als Wunschstyle definiert und wahlweise in der Templates-index.php aufgerufen werden.

Hier also mal ein Beispiel wie so eine Methode aussehen kann. Erzeugt wird ein flexibler Modulestyle, welcher einen Border um das Modul zieht, einen Module-Titel auf einem separaten farbigem Hintergrund ausgibt und den Module-Inhaltsbereich mit einem Schatten Links und oben versieht. Außerdem kann das Module ein Modulbild enthalten, welches wiederum mit einer Link versehen werden kann.

templates/hm_yaml/html/modules.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?php
function modChrome_jyaml($module, &$params, &$attribs)
{
 $headerLevel = isset($attribs['headerLevel']) ? $attribs['headerLevel'] : '3';
 $cssId = isset($attribs['cssId']) ? ' id="'.$attribs['cssId'].'"' : '';
 $bkColor = isset($attribs['bgColor']) ? ' style="background:'.$attribs['bgColor'].';"' : '';
 $linkStart = isset($attribs['link']) ? ' <a href="' . $attribs['link'] . '" style="color:#333; text-decoration:none;">' : '';
 $linkEnde = isset($attribs['link']) ? '</a>' : '';
 $modulId = ' id#' . $module->id;
 $TeaserMenuBoxHeight = isset($attribs['items'])? ' style="height:' . ($attribs['items']*24 + 125) .'px"' : ''; 
// echo "modChrome_jyaml" . $TeaserMenuBoxHeight;
 if (!empty ($module->content)) : ?>
 <div class="modBox">
 <?php if ($module->showtitle) : ?>
 <?php echo $linkStart ?><div<?php echo $bkColor ?> class="modBoxTitle"><?php echo $module->title; ?><?php echo $linkEnde ?></div>
 <?php endif; ?>
 <div class="modBoxContent"<?php echo $TeaserMenuBoxHeight?>>
 <?php if (isset($attribs['img'])) : ?>
 <div class="modBoxMotivBkGd">
 <?php echo $linkStart ?><img src="/<?php echo $attribs['img'] ?>"><?php echo $linkEnde ?>
 <div class="modBoxMotivShdwLft pngTrans"></div>
 </div>
 <?php endif; ?> 
 <div class="floatbox TeaserMenu module<?php echo $params->get('moduleclass_sfx'); ?>"><?php echo $module->content; ?></div>
 <div class="modBoxShdwTop pngTrans"></div>
 </div>
 </div>
 <?php endif;
}


function modChrome_pvh($module, &$params, &$attribs)
{
 $headerLevel = isset($attribs['headerLevel']) ? $attribs['headerLevel'] : '3';
 $cssId = isset($attribs['cssId']) ? ' id="'.$attribs['cssId'].'"' : '';
 $bkColor = isset($attribs['bgColor']) ? ' style="background:'.$attribs['bgColor'].';"' : '';
 $imgPath = isset($attribs['imgPath']) ? $attribs['imgPath'] : '/templates/hm_yaml/images/pvh/';
 $modulId = ' id#' . $module->id;
 $TeaserMenuBoxHeight = isset($attribs['items'])? ' style="height:' . ($attribs['items']*24 + 125) .'px"' : ''; 
// echo "modChrome_jyaml";
echo $TeaserMenuBoxHeight;
 if (!empty ($module->content)) : ?>
 <?php if ($module->showtitle) : ?>
 <div<?php echo $cssId . $bkColor ?> class="TeaserMenuBoxTitle"><?php echo $module->title; ?></div>
 <?php endif; ?>
 <div class="TeaserMenuBox"<?php echo $TeaserMenuBoxHeight?>>
 <div class="TeaserMenuMotivBkGd"><img src="/<?php echo $imgPath; ?>/TM_Stifte.jpg"></div>
 <div class="floatbox TeaserMenu module<?php echo $params->get('moduleclass_sfx'); ?>"><?php echo $module->content; ?></div>
 <div class="TeaserMenuShaddowTop pngTrans"></div>
 <div class="TeaserMenuShaddowLeft pngTrans"></div>
 </div>
 <?php endif;
}


function modChrome_slider($module, &$params, &$attribs)
{
 jimport('joomla.html.pane');
 // Initialize variables
 $sliders = & JPane::getInstance('sliders');
 $sliders->startPanel( JText::_( $module->title ), 'module' . $module->id );
 echo $module->content;
 $sliders->endPanel();
}

?>

 

Natürlich sind die Styles zu diesem Module-Style in CSS-Dateien hinterlegt und hier werden nur die Classen-Selectoren erzeugt.

 

Wenn Ihnen dieser Beitrag geholfen und viel Zeit gespart hat, zeigen Sie sich erkenntlich: Über einen Klick auf Google+1 oder Rückmeldungen freue ich mich. Zeigen Sie mir, dass sich die Mühe für die Beitragerstellung gelohnt hat. Schenken Sie auch den Produktwerbungen Ihre Beachtung, denn damit wird mein Aufwand für diese Beiträge refinanziert.