Bewertung: 5 / 5

Stern aktivStern aktivStern aktivStern aktivStern aktiv
 

Die in Joomla vorhandene Kontaktkomponente stellt ein leeres Konktaktformular zur Verfügung. Schöner wäre es aber, wenn dieses Kontaktformular bereits Daten enthält. Ich zeige einen Weg, mit der sich die Kontaktanfrage direkt z.B. auf einen aktuellen Beitrag, Produktbeschreibung oder Preisanfrage beziehen kann. Dazu werden wir die Komponente com_contact um einen Subcontroller erweitern.

Erweiterung der com_contact Komponente

Der einfachere Weg wäre die Ergänzung des Artikel-Templates um ein kopiertes und angepasstes Kontaktformular mit den vorzudefinierenden Feldern als hidden-field und einem Submit-Button. Dann braucht man keine Erweiterung über einen Subcontroller. Die Daten werden per Post gesendet und die Kontaktkomponente liest die Daten aus dem Post-Request aus. Falls jedoch ein Link ausreichen soll, der die vordefinierten Feldinhalte per Get-Methode übermittelt, muss ein Subcontroller eingerichtet werden.

Schritt 1:

Es wird ein Subcontroller angelegt. Für den Subcontroller denken wir uns einen passenden Namen aus. Diese Datei, z.B. preset.php, wird im Ordner /html/ components/ com_contact/ controllers/ angelegt. Der Inhalt wird folgenden Code enthalten:

defined('_JEXEC') or die;

require_once JPATH_COMPONENT.'/controller.php';

class ContactControllerPreset extends JController
{
	function display($tpl = null)
	{
		// Initialise variables.
		$app	= JFactory::getApplication();

		$subject = JRequest::getVar('subject', '');
		$message = JRequest::getVar('message', '');
		$data = array();
		$data["contact_subject"] = $subject;
		$data["contact_message"] = $message;

		// Save the data in the session.
		$app->setUserState('com_contact.contact.data', $data);

		parent::display($tpl);
	}

	public function redirect()
	{
		// Initialise variables.
		$app	= JFactory::getApplication();

		// Save the data in the session.
		$app->setUserState('com_contact.contact.data', null);

		return true;
	}
}

Wichtig ist die Methode redirect() als "Task", denn der Subcontroller wird mit task=preset.redirect aufgerufen. Aber die Hauptaufgabe des Auslesens der übergebenen Variablen für z.B. subject oder message erfolgt in der Methode display(...). Während der Ausführung des Subcontrollers wird innerhalb der Kontaktkomponente immer zuerst die Display-Methode ausgeführt und danach die eigentliche Task-Methode. Deshalb werden in unserem Fall in der Task-Methode nur noch Aufräumarbeiten durchgeführt. Diese Aufräumarbeiten führen bei einem direkten Kontaktaufruf wieder zu einem leeren Formular.

Schritt 2:

Anpassen des Artikel-Templates. In Abhängigkeit vom verwendeten Template erfolgt eine Änderung in den Standard-Templates in /html/components/ com_content/views/ article/tmpl/default.php bzw. im aktuell verwendetem Template z.B. in /html/templates/beez_20/html/ com_content/ article/default.php. Sollte der Pfad com_content/ article/ bei Ihnen noch nicht vorhanden sein, kopieren Sie die Ordnerstruktur mit Inhalt aus dem Standard-Template Ordner in ihr Template hinein.

Nun suchen Sie die Stelle, an der Sie Ihr Kontaktformular vordefiniert aufrufen wollen und fügen z.B. folgende Zeile ein:

<a href="/<?php echo "kontakt.html?task=preset.redirect&amp;subject="
.urlencode($this->escape($this->item->title)); ?>">
<img src="/media/system/images/question.png"
alt="Noch Fragen?" title="Noch Fragen?" />
</a>

Noch Fragen? Für "kontakt.html" setzen Sie Ihren Link zu Ihrem Kontakt ein. Für den Hinweis "Noch Fragen?" können Sie auch z.B. <?php  echo JText::_('COM_CONTENT_ANY_QUESTIONS'); ?> schreiben und im language-Ordner von joomla unter COM_CONTENT_ANY_QUESTIONS einen sprachabhängigen Eintrag vornehmen. Das Bild question.png ist noch nicht vorhanden und muss in den entsprechenden Ordner hochgeladen werden, falls sie ein eigenes Bild verwenden möchten.

Alternative:

Wie eingangs schon angesprochen, würde auch ein im Joomla-Artikel- oder Joomshopping-Produkt-Template eingebautes Formular mit hidden-Fields ausreichen, um der com_contact Komponente vordefinierte Werte zu übermitteln.