Joomla Layout und View-Layout einer Komponente deaktivieren

Soeben hatte ich das Problem, dass ich die Ausgabe in einer selbst entwickelten Komponente bei Joomla deaktivieren wollte, da ich als Ausgabeformat JSON haben wollte oder gegebenenfalls auch XML oder vielleicht sogar nur Text, plain ASCII. Ich habe schon lange nichts mehr mit Joomla gemacht, musste mich also erstmal wieder an das CMS gewöhnen und hab dabei erfreut festgestellt, dass Joomla ja nach MVC-Architektur aufgebaut ist! Da ich in den letzten größeren Projekten hauptsächlich mit Zend gearbeitet hatte, kam mir das nur entgegen. Aber zum eigentlichen Problem:
Nach Recherche fand ich in der Joomla-Doku über Generating JSON output folgende Zeilen, die helfen sollen:

< ?php
//Daten, die später als JSON zurück- bzw. ausgegeben werden sollen.
$data = array('some data');
 
// Lade das Document-Objekt.
$document =& JFactory::getDocument();
 
// Setze MIME Typ für JSON Ausgabe.
$document->setMimeEncoding('application/json');
 
// Dem Header "sagen", dass es sich um eine Datei handelt, die heruntergeladen werden soll. Dateiendung *.json
JResponse::setHeader('Content-Disposition','attachment;filename="'.$view->getName().'.json"');
 
// Ausgabe der Daten JSON-encoded durch die native PHP-Funktion json_encode.
echo json_encode($data);
?>

Da ich die Daten nicht als Datei benötigt habe, sondern die Ausgabe im Browser sehen wollte, hab ich die Zeile, wo der Header für eine Datei gesetzt wird, auskommentiert. Was ich bei vielen Dokus vermisse, ist der Ort, wo dieser Code eingebaut werden soll. Neulinge wissen meist nicht, wohin der Code gehört. Weiterhin kommt dazu, dass es stets mehrere Lösungen gibt, saubere und unsaubere ;). Für mich klang alles nach View, da es ja um die Ausgabe im Browser ging, daher hab ich den Code in die view.html.php der View der Komponente gepackt. Die Datei liegt unter

com_KOMPONENTENNAME/views/KOMPONENTENNAME/view.html.php

Sie repräsentiert die View der Komponente und lädt das Default-Template unter

com_KOMPONENTENNAME/views/KOMPONENTENNAME/tmpl/default.php

aber das nur am Rande erwähnt. Die Ausgabe jedoch entsprach nicht meinem Wunsch: Es kam der Quelltext vollständig zurück mit html, head, title, meta, body und sonstigen HTML-Tags. Nach weiterer Suche traf ich auf einen Beitrag von 2009 zum Verbergen des Administrator- oder Frontend – Layout – Templates:

JRequest::setVar('tmpl', 'component');

Laut Angabe soll diese Zeile im Controller eingebaut werden. Sie bewirkt, dass das Layout nur den Inhalt der View anzeigt, ohne von einem Template umrahmt bzw. gewrappt zu werden. Ich habe die Zeile direkt hinter die MIME-Anweisung in die View gepackt. Neuladen hat gezeigt, dass jetzt die Menüstruktur der gesamten Seite nicht mehr da war, sondern nur noch der Inhalt der View! … und leider noch die html, head, title, meta- und body-Tags. Zu XML- oder JSON-Output hatte ich nun nichts brauchbares mehr gefunden außer viele Fragen, wie das denn nun geht, also hab ich mein Suchquery geändert und nach Verwendung mit AJAX gesucht, da man dabei meist auch nur einen bestimmten Datensatz abfragen will ohne das Layout oder anderen Quelltext. Ebenso kann die Antwort dort ja auch JSON sein und mit AJAX weiterverarbeitet werden. Und siehe da, ich wurde fündig bei stackoverflow (wo auch sonst) in einer Antwort mit 0 „likes“:

//after $this->display($tpl);
global $mainframe;
$mainframe->close();

Dies war die Lösung. Nun nochmal im Gesamtzusammenhang der Code, der mir JSON als Ausgabe in einer View in der Joomla-Komponente ermöglicht hat:

< ?php
//-- No direct access
defined('_JEXEC') || die('=;)');
jimport('joomla.application.component.view');
class KOMPONENTENNAMEViewKOMPONENTENNAME extends JView
{
    public function display($tpl = null)
    {
		// Get the document object.
		$document =& JFactory::getDocument(); 
		// Set the MIME type for JSON output.
		$document->setMimeEncoding('application/json');
		//Deaktiviert das Template und nutzt nur das Template 
		//der Komponente
		JRequest::setVar('tmpl', 'component');   	
 
		/* Datenverarbeitung aller Daten, beispielsweise ein  
		* Datensatz aus der Datenbank, welcher als Array 
		* zurückgegeben wird. Beispielcode:
		* $model = &$this->getModel();
		* $data = $model->getData();
		* echo json_encode( $data ); 
	    */
 
        parent::display($tpl);
		//Deaktivierung der gesamten Layout-Komponente, 
		//die für html, head, meta und body-Tags zuständig ist
		global $mainframe;
		$mainframe->close();
    }//function
}//class
?>

Der auskommentierte Teil in der Mitte steht für den Part, in welchem die Daten geladen werden, welche später JSON-encoded ausgegeben werden sollen.

Ich hoffe, der Code hilft noch vielen weiteren, die wie ich ewig danach gesucht haben!
Ich bin kein Joomla-Experte und freue mich daher sehr über Verbesserungsvorschläge und Anmerkungen! Die Lösung funktioniert zwar, aber ist sie auch sauber?

ACHTUNG! Warnung vor zustimmen.de – Subdomains mit facebook, schuelervz oder DarkOrbit – Optik

Update 20.02.2012: Die Seiten sind mittlerweile alle von zustimmen.de gesperrt worden :)!

Gerade nach dem Lesen von Mimikama.at’s Beitrag über die Warnung zur 50€ Rewe-Gutschein-Aktion (Facebook Fake) bin ich auf die Domain zustimmen.de gestolpert. Es scheint sich dort laut Impressum um eine Seite zu handeln, welche gratis Webspace anbietet unter verschiedenen Subdomains. Dort sind gerade mindestens 3 neue Seiten entstanden, die optisch 1:1-Klone sind. Betroffen davon sind Facebook, SchuelerVZ und das Browsergame „Dark Orbit“ mit den Subdomains http://www.xdxaxrxkxoxrxbxixt.zustimmen.de, http://www.xfxaxcxexbxoxoxk.zustimmen.de und http://www.xsxcxhxuxexlxexrxvxz.zustimmen.de. Aufgefallen sind mir die Domains, wegen den kryptisch wirkenden Namen, da stets ein x zwischen jedem „normalen“ Buchstaben steht. Die Seiten laden die Optik immer von der zu imitierenden Seite, so dass selbst bei Änderungen auch die Fake-Seiten sich aktualisieren.
FAKE: Screenshot der Facebook - Login-Seite - www_xfxaxcxexbxoxoxk_zustimmen_de
FAKE: Screenshot der SchuelerVZ - Loginseite - www_xsxcxhxuxexlxexrxvxz_zustimmen_de
FAKE: Screenshot der DarkOrbit - Loginseite www_xdxaxrxkxoxrxbxixt_zustimmen_de

Alle Seiten kann man an wesentlichen Punkten sofort als Fälschung erkennen:
Facebook Fälschung erkennen im Vergleich zur Original-Seite

  1. Die URL, also die Webadresse, stimmt nicht überein.
  2. Facebook sollte auch mittels „HTTPS“ erreichbar sein. Dann taucht der Firmenname auch direkt neben dem kleinen Facebook-Icon auf. In der Fälschung ist das nicht der Fall.
  3. Hat man die Browsererweiterung von Web of Trust installiert, sieht man sofort, ob die Seite bereits von anderen bewertet ist oder noch nicht. Ist sie bereits als schlechte Webseite bewertet, wäre der Kreis rot. Wer mehr zu der Browsererweiterung lesen will, kann sich wiederum bei Mimikama.at im Download-Bereich belesen

Ich kann an dieser Stelle nur nochmal darauf hinweisen, dass man, bevor man sich egal wo einloggt, die Browserzeile überprüft! Sonst gibt man seine Login-Daten sofort in fremde Hände.
Wer darauf bereits reingefallen ist, sollte sofort sein Passwort ändern und am besten auch seine Emailadresse, mit der man sich dort registriert hat, sofern möglich. Ebenso sollte man sein Passwort für seinen Emailaccount ändern, wenn das Passwort das gleiche ist wie an eingegebener Stelle. Bisher ist dort zwar noch nichts programmiert, was das Auslesen oder Abfangen des Passworts ermöglicht, aber das kann sich schnell ändern!

Ich habe die Seiten bei zustimmen.de alle gemeldet und bin jetzt gespannt, wie schnell die Betreiber die Seiten wieder löschen. Beim Meldeformular von zustimmen.de ist es wichtig, dass man den Link zur Seite mit angibt, sonst kann man keinen Missbrauch melden. Die dort ebenfalls hinterlegten Whois-Informationen, also die Informationen, die die Person angegeben hat, die die Fake-Seiten dort registriert hat sind ebenfalls offensichtlich gefälscht:
xdxarkorbit.zustimmen.de-fake-whois und wurden alle von der gleichen Person registriert.

FAKE: GRATIS 50 € Amazon Geschenkkarte nur für unsere Facebook Fans!!

Lieber Besucher! Wenn du diese Information hilfreich fandest, freue ich mich über Feedback und natürlich erst recht darüber, wenn du dieses Wissen weiterverbreitest! Vielen Dank!

Mal wieder eines der Gewinnspiele, die exakt nach dem gleichen Muster ablaufen. Gleich zum Start: ES GIBT NIX ZU GEWINNEN! Das ist ein Fake wie auch die anderen Gewinnspiele dieser Sorte. Glaubst du nicht? Dann lade die Seite mal neu, nachdem die Anzahl der verfügbaren Gutscheine runtergetickt ist …
Hier mal ein Video dazu:

Diese Gewinnspiele sehen immer gleich aus.
50euro Amazon Gutschein nur für facebook Fans Fake Gewinnspiel Screenshot

Auffällig ist die URL: http://amazon.de.gratisaktion.geschenkkarte2012.fan.facebook-service.de/, denn sie wirkt auf den ersten Blick tatsächlich wie eine Domain von amazon.de, da sie ja genau damit startet. Ist sie aber nicht, denn entscheidend ist der hintere Teil der Domain: http://amazon.de.gratisaktion.geschenkkarte2012.fan.facebook-service.de/, denn das ist die eigentliche Webadresse. Die Punkte in der URL dienen der Verwirrung der User.

Mich beruhigt ein wenig, dass die Anzahl der Likes nicht mehr so hoch ist, wie sonst und hoffe, dass sich daraus schließen lässt, dass diese Masche langsam bekannt wird und nicht jeder „liked“ und draufklickt. Wenn du regelmäßig über solche Verarschungsgewinnspiele informiert werden willst, dann „like“ doch einfach https://www.facebook.com/fakepostings. Dort findest du meist schon alle bekannten Fake-Gewinnspiele, wie das derzeitige von Amazon oder das Fake-Gewinnspiel von Vodafone, worüber schon vor einem Monat berichtet wurde.

Überrascht hat mich bei diesem Gewinnspiel, dass eine deutsche Domain „facebook-service.de“ verwendet wurde. Die Domain selbst verweigert „Interessenten“ dank 403-Forbidden-HTTP-Code den Zugriff (Stand: 07.02.2012, 17:20 Uhr). Bei der denic.de lassen sich so aber bequem die Inhaberdaten erfragen. Ein gewisser „Maxermann, Mill“ ist dort eingetragen. Der Name klingt schon sehr ausgedacht (ich hoffe, ich beleidige damit niemanden! 😉 ), die angegebene Adresse in Hamburg scheint jedoch gültig zu sein. Der Hoster selbst ist ein kleiner Hoster, den ich per Mail bereits angeschrieben habe. Mal sehen, was kommt.

Es sei einfach nochmal gesagt:

Zuerst denken, dann klicken!

Das Gewinnspiel würde bei 5.000 Gutscheinen á 50€ mal eben satte 250.000€ kosten.

Überraschung Nummer 2: WÄHREND ich hier grad noch drüber schreibe, hat sich der Inhalt der Webseite kurzzeitig geändert! Plötzlich war dort eine Aktion gegen die Facebook-Timeline.

########### UPDATE 07.02.2012, 18:16 Uhr ###########

Es tut sich was:
50€ Amazon Gutschein nur für Facebook Fans Fake Gewinnspiel Betrug gemeldet
Die Webseite wurde erfolgreich als Betrug gemeldet! Solltet ihr also beim Klick auf die oben genannte und mit Absicht nicht verlinkte URL nicht das oben abgebildete Bild sehen, verwendet ihr die falschen Sicherheitseinstellungen oder den falschen oder einen veralteten Browser! 😉

########### UPDATE 07.02.2012, 19:31 Uhr ###########

Wenn man mal direkt nach der Domain googelt, zeigt die Google-Vorschau an, dass über diese Domain auch schon andere „Gewinnspiele“ gelaufen sind:
Gratis HTC Sensation XL mit AudioBeats nur für Facebook Fans Fake Gewinnspiel

Weiterhin kam eine Rückmeldung vom Hoster, dass sie sich darum kümmern werden.

########### UPDATE 08.02.2012, 12:54 Uhr ###########

Nun wurde das Bild ausgetauscht. Die Seite gibt an, ein Gewinnspiel für cards4u zu machen mit genau dem gleichen Inhalt wie beim Amazon-„Gewinnspiel“.
Cards4u Facebook Fake Gewinnspiel Geschenkkarte 50€
Die angegebene Firma scheint nicht zu existieren, das Logo ist nirgends bekannt. Die Bilder werden immer bei img-teufel.de gehostet. Will man dort unter „Abuse“ die Bilder melden, kommt leider stets die Meldung, dass das Bild unbekannt sei.
Mich verwundert ein wenig, dass die Domain immernoch erreichbar ist, insbesondere, da es eine deutsche Domain ist.

########### UPDATE 08.02.2012, 15:21 Uhr ###########

Ich hab mir die Seite nochmal etwas genauer angeschaut. Im Quelltext findet man z.B. die Zeile, die den Facebook-Icon einbindet.

<link href="http://www.hiphopacademy-hamburg.de/images/stories/logos/facebook-icon.jpg" rel="shortcut icon">
</link>

Die Seite hiphopacademy-hamburg.de weiß davon sicherlich nichts, bekommt aber eine Email von mir. Weiter unten im Quelltext wird noch ein Counter versteckt eingebettet, der zählt, wieviele Seitenaufrufe die Seite bereits hat:
Quelltext mit verstecktem Counter von ipcounter.de
Wie häufig diese Seite aufgerufen wurde, lässt sich also unter http://www.ipcounter.de/stats/68196667 ansehen.
Laut Regeln und AGB von ipcounter.de gilt aber: „Der Counter muss sichtbar auf der Seite eingebunden werden!“. Dies ist nicht der Fall. Ich habe die Betreiber darüber informiert.

########### UPDATE 09.02.2012, 12:00 Uhr ###########

Der Hoster hat die Seite jetzt auch endlich entfernt, schien nicht ganz so einfach zu sein, wie ich mir das vorgestellt hatte ;). Aber endlich ist die Fake-Seite gelöscht!