Alles rund um Magento!

Archive 2009

Neuer Shop: treppenstufenmatten.com

Dieser Shop für das Nischenprodukt Treppenstufenmatten wurde von Flagbit auf Basis von Magento realisiert. Das Design wurde von unserer Partneragentur 2k entwickelt und ebenfalls von Flagbit umgesetzt.

Als Besonderheit können die Läufer, die auch passend zu den Stufenmatten angeboten werden, als Zuschnitt bestellt werden. Dazu wurden die “Individuellen Optionen” von Magento um den Typ “Number” erweitert sowie eine weitere Preisberechnungsmethode ergänzt:

Für diese numerische CPO kann (muss aber nicht) eine Ober- und eine Untergrenze festgelegt werden. Diese wird in der Produktansicht dargestellt und beim in-den-Warenkorb-legen validiert. Ist nur eine Grenze definiert, wird auch nur diese angezeigt und überprüft.

Wird zusätzlich die Preisoption “Mit Optionswert multiplizieren” gewählt, wird der vom Kunden eingegebene Wert mit dem hinterlegten Preis multipliziert. Dies ist natürlich sowohl in Javascript für die direkte Aktualisierung des Preises, als auch in PHP für die Berechnung im Warenkorb realisiert. Bei dieser Berechnung wird, wenn das Feld ein Pflichtfeld ist und eine Untergrenze gesetzt ist, der Betrag, der sich aus Untergrenze * Preis ergibt ignoriert, da ansonsten die Basispreisangabe inkorrekt wäre.

Die Alternative in Magento wäre das Erstellen eines Dropdown-Feldes mit Werten für jede mögliche Auswahl gewesen. Doch dies ist bei einer Längenauswahl zwischen einem und 20 Metern in Zentimeter-Schritten einfach nicht pflegbar.

phpDoc mit Ant erzeugen

Mit Ant lassen sich viele Aufgaben (teil)automatisieren. Unter anderem auch das Generieren der Dokumentation auf Basis der phpDoc-Kommentare (PEAR). In der build.properties werden die folgenden drei Eigenschaften definiert:

### build.properties ###
# Pfad zur php.exe
php.bin=C:/Program Files/PHP_5.2.11/php.exe
# Verzeichnis für die Dokumentation
phpdoc.dir=doc
# Pfad zum phpDocumentor-Skript (Installation via PEAR)
phpdoc.inc=C:/Program Files/PHP_5.2.11/PEAR/PhpDocumentor/phpDocumentor/phpdoc.inc

In der build.xml wird ein neues Target für das Erstellen der Dokumentation definiert.

<!-- build.xml -->
<project name="MyProject" basedir=".">
 
	<property file="build.properties"/>
 
	<target name="phpdoc">
		<delete dir="${phpdoc.dir}" />
		<exec executable="${php.bin}" dir="${basedir}">
			<arg value="${phpdoc.inc}" />
			<arg value="-f" />
			<arg value="*.php" />
			<arg value="-t" />
			<arg value="${phpdoc.dir}" />
			<arg value="-ti" />
			<arg value="MyProject" />
		</exec>
	</target>
 
</project>

Beim Starten des Targets wird zunächst die alte Dokumentation entfernt und anschließend eine neue erzeugt.

Das Verwalten der Dokumentation via VCS ist nicht empfehlenswert, da es hierbei häufig zu Konflikten kommen kann. Bei kleineren Projekten kann sich jeder die Dokumentation mit Ant selbst erstellen. Bei größeren Projekten, wenn die Erstellung längere Zeit in Anspruch nimmt, lässt sich diese durch einen Cronjob, einen SVN-Hook oder einen CI-Server (z. B. phpUnderControl) auslagern.

Brauchen wir den Disclaimer?

Auf vielen Websites finden sich Disclaimer für externe Links. Oft handelt es sich um die pauschal gehaltene Erklärung, dass „für Inhalte fremder Sites nicht gehaftet wird“. Ein solcher Hinweis kann in vielen Fällen mehr schaden, als er nützt (dazu unten).

Besteht eine rechtliche Pflicht, die Inhalte der verlinkten Sites zu kontrollieren und zu prüfen? Festzuhalten ist zunächst, dass jeder Anbieter für eigene Inhalte und Informationen haftet. Auf der anderen Seite darf der Anbieter natürlich nicht blind auf fremde Inhalte verlinken.

Aber muss er die Inhalte auch prüfen? Muss er überwachen, ob sich der Inhalt hinter der verlinkten Adresse ändert bzw. ob über die Adresse auf einmal rechtswidrige Inhalte erreichbar sind? Eine allgemeine Prüfungs- und Überwachungspflicht besteht nach heutigem Stand nicht. Nur bei der erstmaligen Verlinkung auf ein Internetangebot muss die Zielseite geprüft werden.  Eine Haftung für den weiteren  Inhalt kann sich dann nur noch ergeben, wenn der Verlinkende Kenntnis von dem rechtswidrigen Inhalt erlangt hat. Dann muss er natürlich die Verlinkung unverzüglich entfernen.

Ist es also dennoch ratsam, einen pauschalen Disclaimer aufzunehmen? Aus meiner Sicht ist die Antwort ein „Nein“. Mit der Aufnahme eines solchen pauschalen Disclaimers offenbaren Sie vor allem Ihr positives Wissen um die Möglichkeit Ihrer Haftung für die Inhalte, auf die Sie verlinken. Dies kann im gerichtlichen Verfahren nachteilig sein. Bei Webangeboten, die bspw.  zahlreiche Verlinkungen enthalten, sollte ein spezieller Disclaimer (am besten kurz mit einem spezialisierten Anwalt besprechen) aufgenommen werden, aus dem hervorgeht, dass und ggf. wie der Anbieter die og. Vorgaben erfüllt.

Tipps:

  • Prüfen Sie Ihre Links bei der Erstverlinkung.
  • Trennen Sie interne und externe Inhalte sauber (neues Fenster für externe Links, eindeutig extern verlinken, Wording,…).
  • Entfernen Sie Verlinkungen auf rechtswidrige Inhalte sofort.
  • Verfassen Sie ggf. (bei Verlinkungen im großen Umfang) einen speziellen Disclaimer, in dem Sie Ihren Umgang mit Verlinkungen darstellen. Hierzu sollten Sie Rat bei einem spezialisierten Anwalt suchen.

Erstellen eines Backend-Moduls: Grundlagen und Konfiguration

Grundlegende Erkenntnisse

Magento ist prinzipiell modular aufgebaut. In Version 1.3 besteht Magento aus zirka 50 Core-Module, deren Funktionalität sich durch weitere Community- oder Local-Extensions erweitern und verändern lässt.

Das Backend ist, was dies angeht eher ein schlechtes Beispiel: Es ist nicht modular aufgebaut, wie man dies vom Frontend her gewohnt ist – die meisten Standard-Interfaces befinden sich im Modul „Adminhtml“. Für den Entwickler hat dies einige Nachteile, wie sich im Laufe der Beitragsserie zeigen wird.

Trotzdem bietet auch das Backend einige Möglichkeiten, bestehende Funktionalitäten anzupassen und zu erweitern. Wie das geht, werden wir in den kommenden Wochen mit einigen kleinen Beiträgen anhand einiger bestehender Module beschreiben. Die Möglichkeiten werden in diesen mit Sicherheit nicht ausgeschöpft – falls wir was Wichtiges vergessen haben sollten, weißt uns bitte drauf hin.

Dieser erste Beitrag beschäftigt sich mit den Teilen der Konfiguration, die für die Erstellung von Backend Interfaces interessant sind.

Die Konfiguration

Wie jedes Modul benötigen auch Backend-Module Konfigurations-Einstellungen, die über die Definitionen der config.xml eingestellt werden. Die allgemeinen Einstellungsmöglichkeiten wie die Definition von Models, Blocks oder Helpern sind nicht Bestandteil dieses Beitrags; viel mehr soll fokussiert auf die speziellen Einstellungen für Backend-Module eingegangen werden.

Der <modules>-Block

Im ersten Block werden allgemeine Informationen zum Modul definiert, wie der Name, die Version und ob das Modul aktiv ist oder nicht:

  <modules>
    <Flagbit_Glossary>
      <active>true</active>
      <codePool>local</codePool>
      <version>0.2.0</version>
    </Flagbit_Glossary>
  </modules>

Der <admin>-Block

Nachdem wir im modules-Block zunächst allgemeine Informationen über das Modul gegeben haben, bietet der zweite Block zwei wichtige allgemeine Einstellungen des Magento-Backends: die Registrierung unseres Admin-Controllers sowie die Definition unserer Adressen.

  <admin>
    <routers>
      <glossary>
        <use>admin</use>
        <args>
          <module>Flagbit_Glossary</module>
          <frontName>glossary</frontName>
        </args>
      </glossary>
    </routers>

Damit ein Modul überhaupt eigene Informationen verarbeiten kann, muss es einen oder mehrere Controller bei den Routern definieren können. (Action-)Controller sind für die Steuerung der Abläufe und Prozesse innerhalb der MVC-Architektur von Magento zuständig. Router wiederum sind Controller, die einen bestimmten Aufruf anhand der Adresse an einen Action Controller übergeben.

Innerhalb des routers-Block verstecken sich folgende Angaben (vgl. Mage_Core_Controller_Varien_Router_Standard :: collectRoutes()):

  • Das XML-Tag <glossary> bestimmt den Namen der aktuellen Route. Auf diese Art und Weise wäre es möglich, bestehende Routen über ein eigenes Modul zu überschreiben.
  • Im Backend ist es natürlich wichtig, dass alle Sicherheitsbestimmungen greifen und die Interfaces nicht aus dem Frontend aufgerufen werden können. Dementsprechend wird hier der Wert „admin“ übergeben.
  • Das Module beschreibt natürlich das aktuelle Modul.
  • Der FrontName wiederum bestimmt, unter welcher URL das eigene Modul aufgerufen werden kann. In unserem Fall wäre dies „http://www.example.com/glossary“.
    <rewrite>
      <Flagbit_Glossary>
        <from>
          <![CDATA[#^/{adminhtml}/glossary/#]]>
        </from>
        <to>/glossary/admin/</to>
      </Flagbit_Glossary>
    </rewrite>
  </admin>

Um das Backend-Modul nun optimal in das Magento-Backend zu integrieren, sollten sich auch die URLs des Moduls an den Admin-Adressen orientieren – die bisherige URL sieht eher wie die im Frontent aus. Hierfür steht der <rewrite>-Block, der alle Aufrufe von „/{adminhtml}/glossary“ auf den AdminController unseres Frontnames weiterleitet. ”{adminhtml}“ ist hierbei als Platzhalter für das die Adresse des Backend zu verstehen – dieser wird von Magento automatisch ausgetauscht. Als Resultat wird dem Nutzer automatisch unser AdminController angezeigt, wenn er den “GlossarController von Adminhtml” aufrufen möchte.

Der <adminhtml>-Block

  <adminhtml>
    <menu>
      <cms>
        <children>
          <glossary translate="title" module="glossary">
            <title>Glossary</title>
            <action>adminhtml/glossary</action>
            <sort_order>50</sort_order>
          </glossary>
        </children>
      </cms>
    </menu>

Der erste Teil des XML-Blocks beschreibt die Einbindung unseres Moduls in das Menü des Backends. Die Hauptmenü-Punkte sind Kindknoten von <menu>; in unserem Fall bauen wir keinen neuen Punkt in der ersten Ebene ein, sondern fügen einen neuen Unterpunkt zu CMS hinzu.

<cms> versteht sich als Referenz auf die Definitionen, die in der config.xml des CMS-Moduls eingefügt wurden – so könnten andere Module wiederum auf die Definitionen von <glossary> zugreifen und diese ändern oder erweitern. Zu beachten ist hierbei auch, dass zwei Module einer Extensions auch eindeutige Keys benötigen!

<title>, <action> und <sort_order> sind an sich selbsterklärend; bei <action> sollte nach Möglichkeit die Adresse angegeben werden, die wir im <rewrite> definiert haben.

    <acl>
      <resources>
        <admin>
          <children>
            <cms>
              <children>
                <glossary translate="title" module="glossary">
                  <title>Glossary</title>
                  <sort_order>50</sort_order>
                </glossary>
              </children>
            </cms>
          </children>
        </admin>
      </resources>
    </acl>
  </adminhtml>

Der <acl>-Bereich ist bezüglich des Aufbaus verwandt mit dem beschriebenen Menü. Er ermöglicht die Rechteverwaltung im Backend von Magento. Logischerweise wird der Glossar auch hier wieder als Kindknoten von CMS definiert.

Als Resultat gibt es in der Rechteverwaltung eine neue Checkbox – beim Generieren des Menüs und Aufruf des Moduls wird überprüft, ob das entsprechende Häkchen gesetzt ist oder eben nicht. Als Hinweis sei erlaubt, dass beim Testen der Rechte ein neuer Login Wunder bewirken kann, da die Rechte beim Login überprüft und in die Session des Nutzers gespeichert werden.

Die gesamte config.xml

Wie die gesamte Konfiguration aussehen kann, zeigt das folgende Listing:

<?xml version="1.0"?>
<config>
  <modules>
    <Flagbit_Glossary>
      <active>true</active>
      <codePool>local</codePool>
      <version>0.2.0</version>
    </Flagbit_Glossary>
  </modules>
  <admin>
    <routers>
      <glossary>
        <use>admin</use>
        <args>
          <module>Flagbit_Glossary</module>
          <frontName>glossary</frontName>
        </args>
      </glossary>
    </routers>
    <rewrite>
      <Flagbit_Glossary>
        <from>
          <![CDATA[#^/{adminhtml}/glossary/#]]>
        </from>
        <to>/glossary/admin/</to>
      </Flagbit_Glossary>
    </rewrite>
  </admin>
  <adminhtml>
    <menu>
      <cms>
        <children>
          <glossary translate="title" module="glossary">
            <title>Glossary</title>
            <action>adminhtml/glossary</action>
            <sort_order>50</sort_order>
          </glossary>
        </children>
      </cms>
    </menu>
    <acl>
      <resources>
        <admin>
          <children>
            <cms>
              <children>
                <glossary translate="title" module="glossary">
                  <title>Glossary</title>
                  <sort_order>50</sort_order>
                </glossary>
              </children>
            </cms>
          </children>
        </admin>
      </resources>
    </acl>
  </adminhtml>
</config>

Fazit

Im ersten Beitrag zur Entwicklung von Backend-Modulen haben wir die Definitionen der Konfiguration kurz unter die Lupe genommen. Mangels Dokumentation fällt deren Interpretation nicht immer leicht – den Platzhalter für {adminhtml} mussten wir uns auch im Quelltext zusammensuchen.

Mit der Konfiguration konnten wir den Grundstein für die Entwicklung von Backend-Modulen legen, indem wir unsere Controller registriert und in das Menü mit eingebunden haben. Viel Funktionalität haben wir damit natürlich noch nicht – in den kommenden Beiträgen werden wir diese Hülle mit Leben füllen.

Preisangaben in Online-Shops

Jedem Online-Shop-Betreiber sollte sich die Frage nach der Gestaltung der Preisangaben auf den Shop-Seiten stellen, denn nicht gesetzeskonforme Preisangaben können im Einzelfall zu Abmahnungen führen. Der Gesetzgeber hat in Bezug auf Preisangaben in Online-Shops nicht nur eine Regelung der inhaltlichen Mindestanforderungen (Welche Angaben sind aufzuführen?), sondern auch der Gestaltung getroffen. Selbst bei optischen Hervorhebungen ist der Shopbetreiber nicht frei:

Der Endpreis, inkl. Umsatzsteuer und Versandkosten, ist am Produkt anzugeben. Außerdem muss jeder Preis (zumindest über eine „Sternchenfußnote“, einen Link o.Ä.) den Hinweis enthalten, dass Umsatzsteuer und Versand- bzw. Lieferkosten enthalten sind. Auch die Höhe dieser Kosten ist anzugeben. Diese Vorgaben gelten meist selbst dann, wenn sich das Angebot des Online-Shops ausschließlich an Unternehmer richtet; einziger Ausweg sind Maßnahmen, die Verbraucher „ausschließen“. Dazu in Kürze mehr.

Für Online-Shops gelten darüber hinaus die für den Fernabsatz normierten speziellen Pflichten aus § 1 Abs. 2 der Preisangabenverordnung. Selbst eine optische Hervorhebung des Nettopreises gegenüber dem Bruttopreis in einem an Unternehmer gerichteten Shop ist danach nicht zulässig, denn § 1 Abs. 6 Satz 3 PAngV schreibt zwingend vor, dass der Endpreis hervorzuheben ist.

Fazit: Bei der Konzeption eines Online-Shops sollten die Gestaltung und der Inhalt der Preisangaben unbedingt im Auge behalten werden. Auch der Entwickler / Designer sollte dies bei seinen Entwürfen berücksichtigen, um Irritationen im Verhältnis zum Kunden zu vermeiden.

ANT und Zend Studio 7

Um ANT im Zend Studio 7 zu aktivieren sind folgende Schritte nötig:

  1. Neues Projekt anlegen: File -> New -> Other
    Den Haken “Show All Wizards” setzen, jetzt kann Java Project from Existing Ant Buildfile auswählt werden, Auswahl mit “next >” bestätigen. zend-studio_new-java-project-ant
  2. Haken bei “Always enable activities and don´t ask me again” setzen und mit “OK” bestätigenzend-studio_confirm-enablement
  3. Projekt erstellen abbrechen “Cancel”zend-studio_new-java-project-cancel

Und damit ist ANT aktiviert und kann genutzt werden.

Das Mage :: Blog-Team wächst!

Wir freuen uns, ein neues Mitglied in unserem Autorenteam begrüßen zu können. Joachim Städter ist Anwalt und berät seit seiner Zulassung zur Rechtsanwaltschaft u.a. Online-Shop-Betreiber in den vielfältigen Fragestellungen, die sich in der E-Commerce-Praxis stellen. Hierzu zählen die Erstellung von AGBs sowie die rechtliche Prüfung und Validierung von kommerziellen Internet-Angeboten. Ab dem 11. Januar 2009 wird er in der Kanzlei Heckert & Kollegen tätig sein. Er möchte bereits ab sofort seine Erfahrungen mit den Lesern unseres Mage :: Blogs teilen und über aktuelle Entwickungen und Probleme informieren.

Außerdem bringt Joachim Städter knapp zwei Jahre Erfahrung im Bereich Online-Marketing mit, wodurch er neben der juristischen Perspektive auch Erfahrungen zu praktischen Problemen bezüglich E-Commerce, E-Publishing und E-Marketing einbringen kann. Die Kombination beider Sichtweisen ist bei der Beleuchtung diverser Probleme von Online Shops von besonders hohem Wert.

Bereits ab der dieser Woche möchten wir erste Beiträge präsentieren. Wir wollen jedoch darauf hinweisen, dass die eingestellten Beiträge nicht als Grundlage für Entscheidungen mit rechtlicher Relevanz herangezogen werden  sollen. Viel mehr sind die Leser angehalten, hierzu gesondert kundigen Rechtsrat einzuholen.

Beitragsserie: Entwicklung eines Backendmoduls

In den Gesprächen der letzten Tage im offiziellen deutschen Magento-IRC-Channel (#magento-de bei irc.freenode.net) kamen vermehrt Fragen zur Entwicklung von Modulen im Magento-Backend auf.

  • Wie muss ich den Router definieren, damit meine Controller angesprochen werden?
  • Wie kann ich ein Grid erstellen und Erweitern?
  • Wie definiert man neue Menü-Einträge? Wie konfiguriert man das Rechtemanagement?

Diese und weitere Fragen sollen in einer Beitragsserie hier im Mage :: Blog beleuchtet werden. Leider muss ich alle enttäuschen, die heute bereits sehnsüchtig nach dem – zugegebenermaßen für heute versprochenen – ersten Teil der Serie warten. Ich werde versuchen, diesen noch am Wochenende nachzureichen.

UPDATE: Offensichtlich verzögert sich die Veröffentlichung leider ein wenig. Wir arbetien daran, den ersten Beitrag so schnell wie möglich online zu bekommen.

Neuer Online-Shop für Betriebsausstattung

Seit heute gibt es einen neuen Shop für Sack- und Transportkarren, Regale, Leitern und weitere Betriebsausstattung. Flagbit hat hierzu den kompletten Shop auf Basis von Magento in nach dem ansprechenden Design unserer Partner-Agentur 2k gestaltet. Besondere Angebote auf der Startseite lassen sich bequem vom Kunden über das Backend eingeben. Rechnungen und Lieferscheine werden täglich automatisiert generiert und per E-Mail zugestellt.

Interview mit Michael Türk auf der Meet-Magento

t3n hat auf der Meet-Magento ein Interview mit Michael Türk zu den Themen TypoGento und Magento Integration Platform (MIP) aufgezeichnet: Interview ansehen.

TypoGento ermöglicht die Verbindung von Magento mit TYPO3. Dadurch wird das Beste aus beiden Welten nutzbar: das CMS von TYPO3 und das Shopsystem von Magento. Ein aktuelles Beispiel für den erfolgreichen Einsatz von TypoGento stellt brandeins Online dar.

MIP wurde auf der Meet-Magento ebenfalls vorgestellt. Diese ermöglicht eine vergleichsweise einfache Anbindung eines ERP-Systems an Magento unter anderem durch den Einsatz von XSL-Transformation.

« Vorherige Einträge

Page optimized by WP Minify WordPress Plugin