Archiv der Kategorie: Erweiterungen (Joomla)

PHP Bridge für Joomla – wenn der Sourcerer an Grenzen stößt

Ich hab ja jetzt schon viel PHP mit dem Sourcerer eingesetzt, aber für komplexere Skripte ist das nur eine Krücke. Jetzt bin ich auf meinen Recherchen auf die PHP Bridge von Henry Schorradt gestossen, und die ebnet den Weg erheblich. Schaut mal hier auf Henrys Homepage:

http://www.henryschorradt.de/information/joomla/

Da ist bestens erklärt, wie das Ding einzusetzen ist, und hier auf youtube gibts auch noch ein informatives Video dazu – steile Sache!

Der Knackpunkt ist: man kann eigene PHP-Skripte im Template-Pfad ablegen und mit der Bridge als Menuitems zugänglich machen. Diese werden dann innerhalb der Component ausgeführt, d.h. sie füllen nur den Inhaltsteil. Das macht das Leben mit eigenen PHP-Scripten in Joomla doch deutlich leichter!

Das Ding wird meine Basis für den WP-Import, glaube ich. Ich geh mal weiter recherchieren…

Zusätzliche Felder in BreezingForms – nee, da mach ich lieber was eigenes

BreezingForms machts einem nicht leicht

Also, ich sag das ja ungern, aber nach einigen Tagen fruchtloser Recherche bin ich fast soweit zu sagen: ich gebs auf. Was ich wollte: mein BreezingForms-Formular um ein dynamisches Feld erweitern, in dem entweder die ID oder der Titel des Rezeptes erscheint, von dem aus das Formular abgeschickt wurde. Im Prinzip sollte das mit einem versteckten Feld funktionieren, aber das liess sich bei mir nicht speichern – eine Einschränkung der Free Edition? Bei Crosstec war nichts zum Thema zu finden, direkten Support gibts dort nur gegen Cash. In den Joomla-Foren hab ich auch nichts zielführendes gefunden, vielleicht war mir auch nur Tante Google nicht gewogen, aber ich mach da jetzt erstmal einen Break und denke über eine andere Lösung nach.

Doch was selbergestricktes?

Könnte ja eigentlich so schwer nicht sein. Ich muss ja noch nicht mal unbedingt eine E-Mail schicken, mir würde es reichen wenn die Rezeptbewertungen in einer eigenen Tabelle gesammelt werden. Aber eben mit dem Titel bzw. der ID des Rezeptes, sonst ist die ganze Mechanik nichts wert. Ich zieh mich mal zurück und gehe brainstormen. Schaun mer amal, was dabei herauskommt.

Wir fangen mal mit dem Sourcerer an

Ein kleines HTML-Formular ist schnell gestrickt, das sieht jetzt mal im ersten Ansatz so aus:

<form action=“#“ method=“post“>
Ihre Meinung ist mir wichtig – bitte bewerten Sie dieses Rezept!<br>
<!– Radio buttons für Wahl der Bewertung –>
<input type=“radio“ name=“Bewertung“ value=“War nix“>War nix<br>
<input type=“radio“ name=“Bewertung“ value=“War prima“>War prima<br>
<input type=“submit“ name=“absenden“ value=“Bewertung absenden“>
</form>

Einfach zwei Radiobuttons und ein „absenden“-Button, mehr ist nicht dran. Der erste Ansatz zum Auswerten wäre dann dieser:

<?php

if (isset($_POST[‚absenden‘])){
if (isset($_POST[‚Bewertung‘])){
$note = $_POST[‚Bewertung‘];
echo „Vielen Dank für Ihre Bewertung: „.$note;

 //hier kommt die Mechanik fürs Wegschreiben hin

}
else{
echo „Bitte eine Bewertung auswählen!“;
}
}
?>

Was brauchen wir noch?

Die ID/den Titel des Rezepts. Na dann mal ran, das hatten wir alles so oder ähnlich schonmal, wir holen uns aus der JFactory die aktuelle Artikel-ID, und aus der Query das Feld title:

$article_id = JFactory::getApplication()->input->get(‚id‘);
$db=JFactory::getDbo();
$db->setQuery(’select title from #__content where id= ‚.$article_id.“);
$title=$db->loadResult();

Bitte, da haben wir doch alles was wir brauchen!

Jetzt könnte man zum Beispiel schon eine Mail zusammenbasteln:

// Die Nachricht
$nachricht = $article_id.“ „.$title.“ „.$note.“ „.$datum;
$nachricht = wordwrap($nachricht, 70);

// Send
mail(‚benutzer@example.com‘, ‚Rezeptbewertung‘, $nachricht);

Und das wars auch schon! In meinem Mailtodisk-Output kommt dabei Folgendes an:

To: benutzer@example.com
Subject: Rezeptbewertung
X-PHP-Originating-Script: 0:sourcerer_php_640dafb7b21f4d69df5677f28a8472eb

31 Schweinsbarten mit Sourcerer War prima 22-02-2018

Das ist genau das, was ich wollte, mir reicht dieser spartanische Output völlig, steht alles drin was ich wissen muss.

Wollen wirs noch in die Datenbank schreiben?

Klar wollen wir! Wir legen erstmal eine kleine Tabelle namens rezeptbewertungen an:

CREATE TABLE `jsite`.`rezeptbewertungen` ( `Datum` TEXT NULL , `artikelid` TEXT NULL , `artikeltitel` TEXT NULL , `note` TEXT NULL ) ENGINE = InnoDB;

Viele Wege führen nach Rom, ich hab mich für insertObject() entschieden. Dafür holen wir uns ein neues Objekt der stdClass und belegen es mit unseren Feldnamen aus der Tabelle (Groß- und Kleinschreibung beachten!). Die Values für den Insert haben wir ja schon parat, die liegen alle auf Variablen, die schreiben wir einfach rein:

$data = new stdClass();
//Objekt füllen
$data->Datum = $datum;
$data->artikelid = $article_id;
$data->artikeltitel = $title;
$data->note = $note;

$tablename = „rezeptbewertungen“;

//Insert ausführen
$db = JFactory::getDBO();
$db->insertObject($tablename, $data);
$result = $db->query();

//Erfolgsmeldung ausgeben
if ($result == true) {
echo ‚Datensatz erfolgreich gespeichert!‘;
}else{
echo ‚Fehler beim Insert!‘;
}

Das wars schon!

Bilanz

Wir haben jetzt eine Mechanik, die eine E-Mail aus den relevanten Daten des Bewertungsformulars baut und diese auch in unsere eigene Tabelle wegschreibt. Was noch fehlt: jetzt müsste man das ganze Spiel noch in den Override für die Artikel einbauen, und zwar mit der Abfrage, ob wir denn ein Rezept sind, weil nur dann das Bewertungsformular auch angezeigt werden soll. Dafür denke ich sollte man ein Modul basteln, in das das Formular mit der ganzen Mail- und Insert-Logik eingebaut wird, und dieses dann im default-Override an geeigneter Stelle einfügen. Wie das geht, habe ich im vorigen Artikel anhand des BreezingForm-Moduls schon beschrieben, das sollte ganz genau so funktionieren. Viel Spaß beim Ausprobieren!

Anmerkung zur E-Mail-Verschleierung

Falls in ihrem Mailoutput so etwas ankommt, hat die eingebaute E-Mail-Verschleierung von Joomla gegriffen:

To: Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!     document.getElementById(‚cloakc1626f4c69a0a7ef61ea78b168523217‘).innerHTML = “;     var prefix = ‚ma‘ + ‚il‘ + ‚to‘;     var path = ‚hr‘ + ‚ef‘ + ‚=‘;     var addyc1626f4c69a0a7ef61ea78b168523217 = ‚benutzer‘ + ‚@‘;     addyc1626f4c69a0a7ef61ea78b168523217 = addyc1626f4c69a0a7ef61ea78b168523217 + ‚example‘ + ‚.‘ + ‚com‘;     var addy_textc1626f4c69a0a7ef61ea78b168523217 = ‚benutzer‘ + ‚@‘ + ‚example‘ + ‚.‘ + ‚com‘;document.getElementById(‚cloakc1626f4c69a0a7ef61ea78b168523217‘).innerHTML += ‚<a ‚ + path + ‚\“ + prefix + ‚:‘ + addyc1626f4c69a0a7ef61ea78b168523217 + ‚\‘>’+addy_textc1626f4c69a0a7ef61ea78b168523217+'<\/a>‘;
Subject: Rezeptbewertung
X-PHP-Originating-Script: 0:sourcerer_php_ec1d4b855a01f009702bc4b9389cf683

33 Kartofflebrei mit Title War nix 23.02.2018

Kann man auch ausschalten, dafür das Plugin Inhalt – E-Mail – Verschleierung deaktivieren, dann kommts wieder im Klartext, wenn man das will:

To: benutzer@example.com
Subject: Rezeptbewertung
X-PHP-Originating-Script: 0:sourcerer_php_71e38a5d68ac0a27865028e9085819ea

33 Kartofflebrei mit Title War prima 23.02.2018

Inhalt – E-Mail-Verschleierung

 

Hätt ich doch beinah übersehen: das Bewertungsformular

Das wär mir doch beinah durch die Lappen gegangen, wir brauchen natürlich noch das Feedback-Formular bei den Rezepten. Im Original-Inselfischkochbuch sieht das so aus:

bewertungsformular_screenshot

bewertungsformular_screenshot

Ich habs in WordPress natürlich mit dem Contact Form 7 angelegt, und dann das Plugin WP Post Signature genutzt, um das Formular automatisch am Ende jedes Beitrags einzufügen. Wollen mal sehen, was sich in Joomla daraus machen läßt. Ich hab mal einen ersten Versuch mit BreezingForms gestartet, schauen wir mal wie weit wir kommen.

Die Anforderungen im Klartext:

  1. das Formular soll am Ende jedes Rezeptes automatisch angehängt werden
  2. damit ich weiß, welches Rezept bewertet wurde, muss der Titel (oder wenigstens die ID) aus der E-Mail hervorgehen

Zu 1.: das hört sich einfacher an als es ist, denn eigentlich sind es zwei Anforderungen, wenn nicht sogar drei.

Das BreezingForms-Plugin

Um ein BreezingForms-Formular überhaupt in einem Artikel anzeigen zu können, muss man das BreezingForms-Plugin installieren. Das findet man, wenn man das BreezingForms-ZIP entpackt hat, unter plg_breezingforms.zip . Nach der Installation muss es noch aktiviert werden, das geht unter Erweiterunge->Module-> Suche nach „breezing“, Pluginname BreezingForms aktivieren. Erst jetzt hat man die Möglichkeit, ein BreezingForms Formular auch in einen Artikel einbinden zu können, und zwar  mit der Syntax:

{ BreezingForms : formularname }

Das fett markierte ist der Name des Formulars. Aber damit haben wir noch nicht viel gewonnen, schließlich müßte man diesen Code am Ende jedes Rezeptes manuell einfügen, und das war nicht die Anforderung.

Wie wärs stattdessen mit einem Modul?

Dafür braucht man laut crosstec noch das extra-Modul, mod_breezingforms.zip. Nach der Installation freigeben nicht vergessen! Dann kann man ein neues Modul vom Typ „BreezingForms“ anlegen und das gewünschte Formular angeben. Falls es nicht angezeigt wird kann es sein dass in den Moduloptionen in der Menüzuweisung „auf keinen Seiten“ steht, das muss man natürlich auf „auf allen Seiten“ ändern.

So, und was hat uns das gebracht?

Auch das Modul muss man erstmal per Hand am Ende jedes Rezeptes einfügen, das ist noch kein grosser Fortschritt aber gemach, gemach, das wird schon noch.

Warum nicht einen Override anlegen?

Weil bei einer Änderung der default.php das Bewertungsformular unter allen Artikeln angezeigt werden würde, nicht nur unter den Rezepten. Wir machen stattdessen mal ein alternatives Layout, das ist mir sympathischer.  Dafür kopiert man sich in den Ordner /templates/dein-templates/dein-template/html/com_content/article die Datei default.php unter einem eigenen Namen, ich nenns mal meins.php. In dieser Datei sucht man dann nach dem Eintrag

<?php echo $this->item->text; ?>

Darunter kopiert man die folgende Zeile:

<?php echo JHtml::_(‚content.prepare‘, ‚{loadposition bewertungsformular}‘); ?>

Jetzt geht man nochmal in das Modul für das Bewertungsformular zurück und ändert die Modulposition in bewertungsformular – Schreibweise genau einhalten!

Daraufhin muss man noch in einem beliebigen Rezept unter dem Reiter Optionen das Layout auf „meins“ stellen, dann wird das Formular nach dem Rezepttext auch angezeigt.

Das war jetzt aber auch noch nicht der Bringer?

Schließlich muss man auch das alternative Layout per Hand anwählen, ich geb zu, da ist noch nicht viel gewonnen, genauso schnell hat man ein Modul eingefügt. Das hängt jetzt alles daran, dass ich keinen Weg gefunden habe, ein Modul nur für eine Kategorie anzeigen zu lassen, und ich hab ein paar Stunden lang danach gesucht, bislang ohne Erfolg.

Ich hätte da noch so’ne Idee

Man könnte ja einen Override auf die default.php anlegen und abfragen, welche Kategorie der aktuelle Artikel hat, und abhängig vom Ergebnis das Modul anzeigen lassen oder nicht. Mal sehen, wie weit wir damit kommen.

In unserem Override der default.php für den Artikel suchen wir nach der Stelle:

<div itemprop=“articleBody“>
<?php echo $this->item->text; ?>
</div>

Danach schubsen wir eine Datenbankabfrage rein:

<?php
    $db=JFactory::getDbo();
    $article_id = JFactory::getApplication()->input->get(‚id‚);
    echo „aktuelle Artikelid= „.$article_id;
    
    $db->setQuery(’select catid from #__content where id= ‚.$article_id.“);
    $catid=$db->loadResult();
    echo „aktuelle catid= „.$catid;
    
    if ($catid == 8){
        echo JHtml::_(‚content.prepare‘, ‚{loadposition bewertungsformular}‘);
    }
    else {
        echo „Dies ist kein Rezept, Kategorie: „.$catid;
        }
    ?>

Was hab ich gemacht? Mir die ID des aktuellen Artikels geholt, diese in den Select auf die #__content reingeschubst und mir so die ID der Kategorie geholt. Rezepte sind bei mir Kategorie 8, das frage ich mit dem If ab und zeige das Formular nur an, wenn dies zutrifft. Das wars schon! Die Debug-Ausgaben kann man noch rausschmeissen, aber so funktionierts. Endlich wieder mal ein bisschen Spaß auf der Datenbank!

Was jetzt noch fehlt: die Übermittlung der Rezept-ID oder des Titels

Weil mir die ganze Menage nichts hilft, wenn ich nicht weiss zu welchem Rezept die Bewertung abgeschickt wurde. Da hilft nur Nachforschen beim BreezingForms-Support, aber dazu gibts einen neuen Beitrag.

Noch ein paar lose Endchen

Haupteinträge

Das fällt einem im Beitragseditor relativ gross ins Auge, aber was bedeutet eigentlich Haupteintrag ja/nein? Ist eigentlich ganz einfach. Man kann beliebige Artikel als Haupteinträge kennzeichnen, das ist so etwas wie eine übergeordnete Kategorie. Eine Anwendung: wenn man alle Haupteinträge unter einem Menüpunkt sehen will, erstellt man einen neuen Menüeintrag mit dem Menüeintragstyp Beiträge->Haupteinträge. Hier kann man auch einstellen, ob Artikel aus allen Kategorien oder nur aus einer bzw. mehreren ausgewählten Kategorien angezeigt werden sollen. Somit hat man eine Möglichkeit, besonders wichtige oder interessante Artikel auch kategorieübergreifend in einer Blogansicht zusammenzufassen.

Navigationspfad einfügen

Unter Erweiterungen->Module-> Neu -> Navigation – Navigationspfad versteckt sich ein Modul, das einen „Wo bin ich“-Navigationspfad an der gewünschten Layoutposition ausgibt. Nützlich bei verschachtelten Untermenüs!

Blanko-Modul für eigene Inhalte

Man hat unter Module->Neu->Eigenes Modul die Möglichkeit, ein Modul mit selbstdefinierten Inhalten zu erstellen. Ich finde, hier ist eigener PHP-Code, mit Hilfe des Sourcerer eingefügt, gut aufgehoben. Man kann es aber auch für öfter genutzte Texte, z.B. Copyrightvermerke oder dergleichen gut gebrauchen.

Wie man Joomla eigenen PHP-Code unterjubelt: der Sourcerer

Wenn man in den Support-Foren die Frage recherchiert, wie man denn eigenen PHP-Code in Joomla unterbringt, wird man meistens mit dem Hinweis erschlagen, dass man dafür ein eigenes Modul oder Plugin schreiben sollte. Beides ist in Joomla (im Vergleich zur WordPress-Pluginprogrammierung) recht aufwändig und für meinen Geschmack zu umständlich, wenn es nur um ein paar kleine Code Snippets geht. Wer sich selber an einem Modul versuchen möchte findet hier bei OSTraining oder hier bei joomla.org recht ausführliche Tutorials zum Thema Modulerstellung.

„Kleine“ Lösung mit dem Sourcerer

Wenn ich bloß ein paar PHP-Zeilen z.B. zum Zugriff auf eine eigene Tabelle unterkriegen will, ist mir das mit den Modulen aber wie gesagt wesentlich zu umständlich. Ich suchte nach sowas wie php Code for Posts oder einer Shortcode-Funktionalität, und bin schließlich bei der Erweiterung Sourcerer fündig geworden.  Nach der Installation findet man im Beitragseditor eine neue Funktionalität „Quelltext“, die sich sehr unauffällig gibt:

quelltext

quelltext

Nach Klick auf „Quelltext“ landet man erstmal in einem Editor, der mit den Default-Einstellungen eine kleine Hilfestellung gibt, wo man den Code platzieren kann:

sourcerer_edit

sourcerer_edit

Das wars auch schon! Nach Klick auf „Füge ein“ wird der Text inklusive der {source}-Tags in den Beitrag eingefügt und kann dort auch weiter bearbeitet werden. Leider habe ich keine Option für Code Highlighting gefunden, auch wenn in der Doku steht: „Also it comes with syntax coloring (php, js, css, html)“. Macht jetzt aber erstmal nichts, ich kopiere mir meine paar Zeilen Code aus dem Notepad++ rein. Das sieht im einfachsten Fall so aus, beispielsweise mit einem simplen echo:

php_programmerl

php_programmerl

Der Output sollte ungefähr so aussehen:

screenshot_phpcode

screenshot_phpcode

Und was machen wir jetzt damit?

Wir haben ein bisschen Spaß auf der Datenbank! Es wird höchste Zeit, sich ein wenig mit JDatabase anzufreunden, aber dafür gibt es einen neuen Beitrag.

Breezing Forms: ein kurzer theoretischer Durchlauf

Theoretisch deswegen, weil Breezing Forms nicht mit meinem Xampp-Mailtodisk zusammenarbeitet und ich den Output nicht kontrollieren kann. Trotzdem, packma’s und schauen uns den populärsten Formulareditor für Joomla mal näher an.

Installation

Erweiterungen->Webkatalog->Breezing Forms free suchen und installieren, dann unter Komponenten->Breezing Forms die Installation vervollständigen.

Neues Formular anlegen

Unter Formulare verwalten->Neu kommt man in einen Formulareditor, und hier wirds schwer gewöhnungsbedürftig. Zuerst mal einen Titel (freie Zeichenwahl) und einen Namen (nur alphanumerisch) für das neue Formular vergeben. Dann muss man erstmal eine Seite hinzufügen, das geht mit Klick auf den „Page“-Button. Mit einem Klick auf „Element“ kann man der eben erstellten Seite 1 Formularfelder hinzufügen, die Optionen sind recht selbsterklärend. Ich belasse es mal bei einem Feld für den Namen des Absenders und einer Textarea für die Nachricht. Anschauen kann man sich das Ganze dann unter „Vorschau“. Das ist alles ziemlich unhandlich und wenig intuitiv, aber mit ein bisschen Übung wird das schon.

Neuen Menüpunkt für das Formular erstellen

Menüs->Main Menu (oder wie es bei ihnen heißt)->Neuer Menüeintrag Titel z.B. „Kontakt“, Menüeintragstyp „Breezing Forms“  Add Form. Dann unter dem Tab „Add Form“ den Namen des Formulars eintragen. Das sollte es gewesen sein, mit etwas Glück sieht das jetzt ungefähr so aus:

evi_kontaktformular

evi_kontaktformular

Anmerkung: wenn man das Formular in einen Beitrag anbinden will, braucht man zusätzlich das Breezing Forms Plugin, Info dazu gibts hier bei Crosstec.

Glitch oder Feature?

Ich hatte bei der Vergabe eines eigenen Formularnamens das Problem, dass die Anzeige nicht funktionierte „evisformular could not be found“. Wenn ich dann in der Formularverwaltung nachgeschaut habe, stand der Formularname wieder auf dem von Breezing Forms automatisch vergebenen Namen „QuickForm231612383“ drin, mit dem funktionierte es dann auch. Möglicherweise ein Glitch wegen der nicht ganz perfekten Installation auf dem neuen Xampp, vielleicht auch ein Feature  – sehr unbefriedigend, ich gebs zu, aber immerhin gibt es einen Workaround.

Fazit:

Wenn man sich mal an den etwas unhandlichen Formulareditor gewöhnt hat, läßt Breezing Forms keine Wünsche offen, es läßt auch die Erstellung komplexer mehrseitiger Formulare zu und bietet unzählige Konfigurationsoptionen. Eingehende Nachrichten werde auch automatisch mitprotokolliert, die kann man sich unter Komponenten->Breezing Forms-> Einträge verwalten anzeigen lassen, das gefällt mir dann doch sehr gut. Zugegeben, in Contact Form 7 ist das alles ein bisschen intuitiver, aber die Funktionsvielfalt von Breezing Forms ist schon beeindruckend.

Jedenfalls haben wir jetzt auch unser simples Kontaktformular mit recht wenig Aufwand realisiert, und dabei lassen wir es für heute.

Erweiterungen installieren: kleines Beispiel

Da fehlte doch noch was im Joomla-Inselfischkochbuch: das Zufallsrezept geht noch ab! Kurzes Googlen ergab, dass „Random Article“ von Artur Alves genau das können sollte, was ich brauchte. Also los:

Erweiterung installieren

Erweiterungen->Verwalten-> Installieren, hier sollte man sich bequemerweise den Tab „Aus Webkatalog installieren“ aktivieren, dann gehts genauso wie in WordPress mit dem Plugin-Verzeichnis. Erweiterung mit dem Namen suchen, wenn man die richtige gefunden hat wird man vom Assistenten durch die Installation geführt.

Modul anlegen

Mit Erweiterungen->Module->Neu->Random Article kann man sich jetzt ein eigenes Modul für den zufällig ausgewählten Artikel anlegen. Unter „Article Source Options“ wählt man sich die Kategorie aus, aus der der Zufallsartikel kommen soll, man könnte hier auch Subkategorien einbeziehen, aber die habe ich (noch) nicht. Namen für das Modul vergeben, darf ruhig „Zufallsrezept“ heissen, speichern.

Neuen Menüeintrag und Beitrag anlegen

Viele Wege führen in diesem Fall nach Rom, ich packe das neue Modul wieder in einen eigenen Beitrag und ordne diesem einem Menüeintrag zu.

Menüs->Main Menu->Neuer Menüeintrag-> Name „Zufallsrezept“, Menüeintragstyp einzelner Beitrag, den kann man hier gleich neu anlegen. Im Beitragseditor die Option Module anklicken und hier unser eben neu erstelltes Modul auswählen, beliebigen Text dazuschreiben, speichern und fertig. Wenn alles richtig geklappt hat, steht im Editor jetzt ungefähr sowas:

{loadmodule mod_random-article,Zufallsrezept}

Das kann man sich schon mal merken, diese Syntax wird uns noch öfter begegnen. Das wars jetzt aber auch schon, wir haben unser Zufallsrezept jetzt auch eingebaut.

Meckerpunkt am Rande: die Erweiterungs-Verwaltung

Wenn man unter Erweiterungen->Verwalten sowas wie den Pluginmanager erwartet, guckt man zuerst mal ganz schön, da springen einem neun Seiten mit mehr oder weniger kryptischen Einträgen entgegen. Weil hier nämlich auch die systeminternen Erweiterungen, Module und Komponenten mit angezeigt werden, und da fasst man tunlichst erstmal gar nichts an. Benutzerfreundlich ist das nicht, hier hätte ich mir eine übersichtlichere Lösung gewünscht!