In 5 Minuten zur eigenen Magento Extension



Oft möchte man nur ein externes oder selbst erstelltes PHP-Script in Magento einbinden und entweder über ein Template oder direkt über das CMS ausgeben. Dazu erstellen wir ein Rahmenprogramm welches innherhalb von 5 Minuten erstellt ist. Dazu können Sie unsere Vorlagen am Ende dieses Tutorials downloaden und verwenden.

Ändern können Sie Ausgabereoutinen sowie die Namespaces:
Package: Fiveminutes_Demo
Kategorie: Fiveminutes
Modul: Demo

Folgende Dateien müssen erstellt werden:
- app/etc/modules/fiveminutes_all.xml
- app/code/local/fiveminutes/demo/etc/config.xml
- app/code/local/fiveminutes/demo/Block/View.php
- app/design/frontend/default/default/template/demo/view.phtml

Beispiel in unserem Demoshop: shop.mxperts.de


fiveminutes_all.xml

<?xml version="1.0"?>
<config>
  <modules>
    <Fiveminutes_Demo>
      <active>true</active>
      <codePool>local</codePool>
    </Fiveminutes_Demo>
  </modules>
</config>


config.xml

<?xml version="1.0"?>
<config>

  <modules>
    <Fiveminutes_Demo>
      <version>0.1.0</version>
    </Fiveminutes_Demo>
  </modules>

  <global>
    <blocks>
      <fiveminutes_demo>
        <class>Fiveminutes_Demo_Block</class>
      </fiveminutes_demo>
    </blocks>
  </global>

</config>


View.php

<?php
/**
* Fiveminutes View block
*
* @codepool   Local
* @category   FiveMinutes
* @package    FiveMinutes_Demo
* @module      Demo
*/

class Fiveminutes_Demo_Block_View extends Mage_Core_Block_Template
{
  private $message;
  private $param1,$param2;

  protected function createMessage($msg) {
    $this->message = $msg;
  }

  public function receiveMessage() {  // {{block type="fiveminutes_demo/view" " my_parameter1="..." my_parameter2="..." template="demo/view.phtml" }}
    if($this->message != '') {
      return $this->message;
    } else {
      $this->createMessage('<strong>5 Minutes Extension</strong>');
      return $this->message;
    }
  }

  protected function _toHtml() {
    $html = parent::_toHtml();

    $this->param1 = $this->getMyParameter1();
    if ($this->param1 != "") {
      $html .= $this->param1;
    }

    $this->param2 =  $this->getMyParameter2();
    if ($this->param2 != "") {
      $html .= ' '.$this->param2;
    }

    return $html;
  }

}


view.phtml

<?php
/**
* Fiveminutes view template
*
* @see Fiveminutes_Demo_Block_View
*
*/
?>

<div>
  <span style="color:#FF9900;">
  <?php
    echo $this->receiveMessage();
  ?>
  </span>
</div>

Die Ausgabe erfolgt nun über das CMS indem Sie folgende Zeile in den Inhalt einfügen.

{{block type="fiveminutes_demo/view" color="red " my_parameter1="Herzlichen Glückwunsch" my_parameter2="Sie haben das Tutorial erfolgreich abgeschlossen" template="demo/view.phtml" }}

Alternativ können Sie auch unter “eigene Gestaltung” eine Layoutänderung eintragen.
Allerdings werden die Parameter nicht ausgegeben.

<reference name="right">
<block type="fiveminutes_demo/view" color="red" my_parameter1="Herzlichen Glückwunsch" my_parameter2="Sie haben das Tutorial erfolgreich abgeschlossen" template="demo/view.phtml" />
</reference>

Download aller Dateien: module_fiveminutes.zip




  • Twitter
  • Webnews
  • Mister-Wong
  • Facebook
  • Digg
  • BlogMarks
  • Share/Save/Bookmark

15 Kommentare to “In 5 Minuten zur eigenen Magento Extension”

  1. toox toox sagt:

    Hi,

    wie setzte ich das auf eine im Core befindliche Datei um?

    Folgendes:
    In Magento werden ja die upgeloadeten Produktbilder immer in das jeweilige vergrößert oder verkleinert. Egal - nun kann man demnach ja schon die Bilder vorher optimieren was das Bildverhältnis angeht. Magento benutzt immer Quadrate zur Darstellung. Das heisst alle Seiten gleich lang. Jetzt benutzte ich das aber gemischt. Mal höher als breit und umgekehrt. Im Magento die Gd2.php angeschmissen und er baut sich das Bild um. Dadurch enstehen Cutbalken an den Seiten oder eben oben, je nach Format. Magento setzt diese immer in weiß um. Sieht doof aus wenn man nen dunkles Template benutzt. Jetzt schreibe ich im Core die Image.php um auf meinen RGB-Farbcode. Bei jedem Update wird diese aber überschrieben. Nun wende ich es ähnlich wie ihr hier an bloß - mein Problem ist nur, dass das ganze nicht im Ordner BLOCK ist, sondern im MODE/Catalog/Product/Image.php. Wie wende ich das an? In der XML einfach aus in geht nicht.
    Würde mich freuen. DANKE.

  2. Christoph Christoph sagt:

    Hallo,

    Wird der block type=”fiveminutes_demo/view” oder zb “catalog/product_list_toolbar” automatisch anhand des classen/modul namens in der config.xml und der ordner/file struktur von Mage generiert? wenn ja wo?

    vg

    • Hallo Christoph,
      die Namenkonventionen hängen natürlich sehr eng in Verbindung von Klassennamen, Ordnerstruktur, Dateinamen und XML-Definition, weshalb ich das in diesem Tutorial zum Teil auch farblich gekennzeichnet habe. Um tiefer in die Extension-Programierung einzusteigen gibt es das Extensions Tutorial.
      Wo das ganze dann im Core programmiert ist habe ich auch nocht nicht gesucht - wäre aber interessant.

      Viele Grüße
      Johannes Teitge

  3. Christoph Christoph sagt:

    Also wird dieser block type automatisch von Mage definiert? wie bist du drauf gekommen dass es ”fiveminutes_demo/view” sein muss? einfach von den anderen modulen abgeschaut oder hast du eine codestelle im core gefunden die auf die darauf rückschlüsse liefert?

    vg

    • Bei Magento ist man leider auf die Beispiele im Netz oder das Forum angewiesen. Auf Grund der fehlenden Dokumentation kann ich Dir leider keine bessere Quelle anbieten. Ich suche mich oft mit “Filesearch nach Inhalten” durch die Core-Files was sehr nervig und zeitraubend ist. Aber nur so konnte ich bisher meine Probleme lösen. Damit es etwas schneller geht benutzte ich unsere eigene Lösung Fileexpress.

      Viele Grüße
      Johannes Teitge

  4. Christoph Christoph sagt:

    von der volltext suche im source kann ich leider auch schon ein lied singen. bitte beantworte meine frage ob du irgendwelche konkreten anhaltspunkte zu dem blocktype aus deinem beispiel hattest oder ob du einfach nach dem schema der anderen module ausprobiert hast obs funktioniert.

    weiters würde ich noch gern wissen wo die funktionen getMyParameter1() und getMyParameter2() aus deinem beispiel definiert werden.

    danke
    chris

  5. Christoph Christoph sagt:

    nja das ganze magento wissen ist leider selbst im magento forum und im wiki extrem unstrukturiert. da mit einer google volltext suche drüber zu gehen ist gerade bei solchen speziellen fragen, die auch noch schlechte keywords hat, sehr zeitaufwendig. ich habe mehr als einen tag damit verbracht nur artikel zu lesen die alle das thema behandeln und nicht meine frage beantwortet.

    gerade so implizite dinge wie die automatische getter funktionen der block atribute und die scheinbar automatische block type erstellung anhand der lage des php files im magento file system sind einfach dinge, die zentral dokumentiert gehören. ich habs probiert im magento source code zu finden, habe aber jetzt nach 2 tagen sucherei und mit verfolgen des intialisierungscodes aufgegben. ich bitte auch dich bei deinen kommenden tutorials diese dinge immer zu erwähnen.

    vg
    chris

  6. Christoph Christoph sagt:

    ich glaube ich bin anhand des sourcecodes hinter den mechanismus der blocktypes gekommen. sie sind mit dem php class autoloading verbunden. die blocktypes zusammen mit dem groupnamen werden dazu verwendet den klassen namen des block php files zusammen zu stückeln. underscores werde von dem von varien definiertem autoload durch directory separators ersetzt. dadurch findet der php interpreter die source files im verwinkelten ordnersystem von magento

  7. igi4you igi4you sagt:

    Hallo Christoph,

    Nach meinem Wissen zeigt der „block-type“ , die für den jeweiligen Block zuständige Modul Klasse welche den einzelnen Block definiert.

    Z.b. fiveminutes_demo/view zeigt, dass sich im Modul FiveMinuetes ein Unterordner Demo befindet welcher wiederum einen Block Ordner(Slash) beinhaltet welcher die Datei View.php beinhaltet. Der „/“ im definiert meines wissen den Start eines Block Ordners.

    Ein weiteres Beispiel wäre folgender Block aus dem Source von Magento:
    block type=”page/html_head” name=”head” as=”head”

    Der obige Block-Type bezieht sich auf das Modul/Ordner „Page“ welcher sich im Block Ordner beinhaltet welcher wiederum den Ordner Html und darin die datei/Klasse Head.php beinhaltet.

    Wie gesagt dies ist meine Sicht auf die funktionalität von “type” in blocks.

  8.  ds_1984 sagt:

    @Christoph:

    Vielen Dank, vor allem für deine klaren Worte was den Informationsfluss in den Tutorials hier & auch Magento allgemein angeht.

    Generell habe ich zum Beispiel gehört das selbst langjährige PHP-Programmierer schon an Magento verzeifelt sind - daher wirken viele Dinge innerhalb der Magento-Architektur auch auf den ersten Blick wie ohne Sinn und Verstand über das gesamte System verteilt - da gebe ich dir auf jeden Fall Recht.

    Die andere Meinung kommt aus dem Programmierumfeld für Anwendungen aus den Hochsprachen - etwa Java (fähige Leute sprechen von etwa 6 Jahren Lernaufwand). Diese fühlen sich so viel ich gehört habe sehr wohl innerhalb der Struktur der Applikation.

    Aus welcher Seite man es auch betrachtet - ich meine wenn man sich etwas damit beschäftigt - kommt der Rest von allein. Wer suchet der findet, unter dem Motto kann ich dir zu 100% sagen das uns da auch keinerlei andere Informationen vorliegen als die offenen Quellen wie Wiki, Forum, Knowledge Base, Chat, Magento-Connect, Blogs wie dieses & Andere. Was diese offenen Quellen angeht, da muss ich in die Richtung derer die sich ständig beschweren immer & immer wieder sagen: Varien ist eine Webentwicklung- und Web Consulting Firma die natürlich ein Geschäftsmodell an der Applikation Magento auf zieht. Diese größtenteils freien Informationen müssten ebenso wenig wie die DiffFiles nach Updates bereit gestellt werden und das weißt du genau so gut wie ich.

    Ich halte es trotzdem für einen sehr klugen Schachzug die Applikation & Community-Welt nach wie vor in Form der CE offen zu halten - man könnte wohl kaum sonst dieses Tempo halten - wenn ich mir mal anschaue wo andere beim Thema “Innovation & Speed” da so herum dümpeln und auf den Sankt Nimmerlandstag warten und die Lampe ausgeht, so wird hier schon ein ganz schönes Tempo gefahren - klar das Tempo & auch die häufigen Veränderungen sind vielen und auch mir immer wieder ein Dorn im Auge - zwecks Produktiveinsatz usw. Daher verstehe ich die Bedenken innerhalb dieses Themas sehr.

    Was ich dir noch auf jeden Fall sehr empfehlen kann ist diese Übersicht hier: http://www.magentocommerce.com/wiki/doc/magento-architecture

    Die 2 Schema dort habe ich mir vor einiger Zeit ausgedruckt und sie hängen direkt an der Wand etwas über dem Monitoren - es hilft ungemein, dass kannst du mir glauben!

    Ich danke dir aber auf jeden Fall für deine Kritik, da wir hier bei mxperts.de stets am Feedback unserer Besucher interessiert sind & auch ein Stück weit Alternativen zu den anderen meist englischen Quellen bieten wollen.

    Generell ist eine Community aber immer nur so gut wie Ihre Nutzer daher an alle Nörgler:

    Engagiert euch im Forum, Wiki, Blogposts, Kommentaren und leistet euren Anteil (egal wie groß dieser ist) um bessere Informationen zu erhalten & somit einen wesentlichen Anteil an einer positiven Entwicklung des Informationsflusses rund um das Thema Magento zu haben.

    Man sollte nicht erwarten das eine amerikanisches Unternehmen Lösungen & Informationen anbietet die auf 92 Nationen zu 100% abgestimmt sind. Das ist meine Meinung.

    In diesem Sinne - wie man in den Wald hinein ruft…

    Wir sitzen alle im selben Boot!

    LG - Daniel

  9. Christoph Christoph sagt:

    zur erklärung warum mich die blocktypes so interessieren: ich dachte immer, dass dies festgesetzte typen sind, die rigendwo einmal definiert werden. nachdem man aber bei einer volltext suche im quellcode diese definition nirgends findet, war meine nächste überlegung, dass die defnition beim parsen der xml files in kombination mit einer analyse der order sturktur dynamisch gemacht wird. das ist alles nicht der fall. das einzige was defniert wird ist der modul(groupname) im blocks teil der config xml. diese info wird verwendet um den klassen namen über stringcats zusammen zustückeln. falls jetzt die block klasse instanziert wird wird das php file automatisch geladen. das funktioniert weil in magento der autoloader so definiert ist, das automatisch alle underscores im klassenname durch directory seperators ersetzt werden. und praktischer weise ist das der path zum php file.

    die types sind also keine fix definierten typen sonder hängen mit dem klassen namen zusammen, welcher für das autoloading gebraucht wird.

    ich mag es einfach nicht wenn solche automatischen dinge stattfinden ohne definition oder erläuterung. da muss ich einfach den mechanismus rausfinden ;)

  10. Tim W Eydamos sagt:

    Ich versuche gerade selber eine Extension zu schreiben und habe mir auch schon das große Tutorial durchgelesen. Leider konnte ich weder da noch hier rausfinden, wo ich den Pfad setze zum Template. Also zu
    /app/design/frontend/default/default/meine_extension/view.phtml

    Wie bringe ich eine Extension dazu diese Datei zu laden?

    Hintergrund ist, das ich das Template wo ein einzelnes Produkt angezeigt wird verändern will. Ich weiß, dass ich das theoretisch auch direkt in die vorhandene phtml reinschreiben kann, aber 1. habe ich den auftrag das ganze als Extension zu machen und 2. fände ich das für spätere Extensions gut zu wissen

    Gruß Eydamos

  11. [...] Weiteres Tutorial von den Experts, wie man Extensions aufsetzt: 5 Minuten zur eigenen Magento Extension | Magento Experts. [...]

Kommentar erstellen

You must be logged in to post a comment.

Bitte beachten: Mxperts.de ist kein Supportforum sondern eine Informationsplattform, deshalb benutzt für Diskussionen das deutsche Forum von Magento. (Fragen/Kommentare zu den Tutorials ausgeschlossen). Außerdem gebe ich keinen kostenlosen Support zu Magento. Leider haben das einige Leser in letzter Zeit falsch Verstanden und ich bitte um Euer Verständnis. Ich denke diese Plattform ist von unserer Seite aus schon genügend Gratis-Leistung.