Magento vs. OXID eSales – ein Vergleich

11. November 2009 at 15:32

Immer wieder fragen uns unsere Kunden wo der Unterschied zwischen OXID eSales und Magento ist. Immerhin gibt es zum heutigen Stand bei beiden Systemen eine kostenlose, sowie eine „Premium“-Kauf-Version mit erweiterten Funktionen & Hersteller-Support.

An dieser Stelle möchten wir die beiden Shop-Systeme sowie die dahinter stehenden Anbieter vergleichen.

magento_oxid_vergleich

Die Vergangenheit

OXID eSales war zunächst nur als kostenpflichtige Shopversionen auf dem Markt und ist erst seit dem Oktober 2008 mit einer kostenlosen Community Edition vertreten. Varien ist genau den umgekehrten Weg gegangen und hat mit der kostenpflichtigen Magento Enterprise Edition sozusagen nachgezogen. OXID ist neben der Enterprise- und der Community-Edition auch noch als Professional Edition und Mietshop zu haben.

Shop-Software

Zwischen OXID eSales und Magento sind kaum noch Unterschiede zu erkennen. Das Layout ist bei beiden Systemen frei editierbar und damit sind der Gestaltungsvielfalt keine technischen Grenzen gesetzt, die Funktionalität lässt ebenfalls bei beiden Systemen kaum Wünsche offen. Wie hoch der individuelle Programmieraufwand zum Anpassen der einzelnen Shops ist, hängt von den entsprechenden Skills ab. Magento verfügt über ein auf XML basiertes Layout, wo die Einarbeitung ggf. etwas mehr Zeit aufwendiger ist als bei dem OXID Template welches auf Smarty basiert.

Beide Systeme verfügbaren über Vergleichslisten, Merkzettel, Sitesales, Empfehlungen bis hin zum Preisalarm sind alle zu erwartenden fortschrittlichen Shop-Funktionalitäten vorhanden.

Dokumentation

OXID eSales ist aufgrund seiner deutschen Abstammung komplett in deutscher Sprache dokumentiert. In der Tiefe allerdings online nicht auf dem Stand von Magento.

Magento bietet, auch wegen seiner großen Community, nicht nur die offizielle Dokumentation online in engl. Sprache an, sondern es gibt weitere sehr viele Dokumentationen & Support über das Wiki sowie viele Blogs welche sich mit dem Thema Megento befassen (so wie auch hier im Fly2Mars-Medial.de/seoblog).

Fazit

Wer technisch versiert ist und auf neue Technologien baut sowie ein leistungsstarken Server(-Farm?) zur Verfügung hat, würde ich Magento allein wegen dessen Features einen satten Vorsprung einräumen. Vor allem in Anbetracht der schnellen Entwicklung der letzten Jahre. Ansonsten sind beide Systeme ähnlich, wobei das Template-System von Oxid gerade für Einsteiger einfacher zu verstehen ist und damit die individuale Template-Entwicklung.

Beide Systeme installieren, konfigurieren und warten sich nicht von selbst. Um die richtige Entscheidung für den idealen Shop für sich selbst treffen zu können, sollte eine individuelle Anforderungsliste erstellt werden.
Nicht alle Shops haben die selben Anforderungen, nicht jeder Betreiber die gleichen Wünsche. Eine vorab erstellte Checkliste zum späteren Vergleich der Systeme ist zu empfehlen. Auch die Kosten für die Anpassungen (Template, Individual-Entwicklungen, Wartung, Adminisration, Server-Betrieb/Hosting, ggf. externe Dienstleistungen, usw.) sollten nicht im Vergleich fehlen.

Ein guter weiterer ausführlicher Vergleich als Slide findet ihr hier (Danke an Björn von Mayflower für den Tipp)!

Sie haben ebenfalls Erfahrungen mit Magento oder Oxid eSales?

Teilt Sie mit uns und anderen Lesern diesen Artikels und schreibt ein Kommentar!

Sie Benötigen Unterstützung bei der Erstellung oder Anpassung eines Magento eCommerce Shop System?

Fly2Mars-Media unterstützt Sie in diesem und vielen anderen Bereichen rund um das Thema Internet & IT!

Für ein individuelles Angebot nehmen Sie noch heute Kontakt mit uns auf.

Zugriff von Magento von extern über Magento-API

10. November 2009 at 11:20

Magento ermöglicht nicht nur das Verwalten der Daten über das eigene Admin-Back-End, sondern auch den Zugriff über eine sogenannte „WSDL“ eine SOAP Kommunikation zur Magento-API aufzubauen. Die Magento SOAP Schnittstelle bietet sämtliche Funktionalitäten, Artikel-Import mit Bildern, Bestellungen verwalten, Lagerverwaltung, etc..

Um die Sicherheit zu gewährleisten muss ein API-Users samt Password definiert werden. Im folgenden möchten wir Euch eine kurze Einleitung zur Verwendung geben. Vorab solltet ihr noch prüfen ob die SOAP-PHP-Extension geladen ist (siehe php.ini)

Anlegen einer Rolle für die API-User

Unter System->Web Dienste->Gruppenberechtigungen vergebt ihr ein Namen für die Gruppe und bei Gruppenberechtigung Quellen das entsprechende Zugriff-Level auf die entsprechenden Ressourcen bzw. wählt ggf. Alle bei Quellenzugriff aus (speichern nicht vergessen).

Anlegen des API-Benutzers

Das geht im Admin-Bereich unter System -> Web Dienste-> Benutzer, dort auf den Button neuer Benutzer klicken und die entsprechenden Daten eingeben. Unter Benutzer Gruppenberechtigung wählt ihr die eben neu angelegte Gruppe um das Zugriffs-Level zu managen (speichern nicht vergessen).

Zugriff über externen PHP-Script auf Magento API

Mit dem folgenden PHP-Script könnt ihr Euch nun mit der Magento-API connecten und anschließend eine Übersicht der zur Verfügung stehenden Funktionen ausgeben lassen (SOAP V1 Zugriff):

<?php
/**
 * fly2mars-media
 * http://www.fly2mars-media.de
 * http://www.fly2mars-media.de/seoblog
 */
$host= '127.0.0.1';  // host name der magento installation
$options = array();
$proxy = new SoapClient('http://' . $host . '/index.php/api/soap/?wsdl');
// show available function
$avail = $proxy->__getFunctions();
foreach($avail as $func)
{
 echo "<p>" . $func . "</p>";
}
$proxy->endSession($session);
?>

Bei $host ist logischerweise der Hostname einzutragen unter welchem die Magentoinstallation aufgerufen werden kann.

Mit dem folgenden PHP-Script könnt ihr Euch nun mit der Magento-API connecten und anschließend eine Übersicht der zur Verfügung stehenden Funktionen ausgeben lassen (SOAP V2 Zugriff):

<?php
/**
 * fly2mars-media
 * http://www.fly2mars-media.de
 * http://www.fly2mars-media.de/seoblog
 */
$host= '127.0.0.1';  // host name der magento installation
$options = array();
$proxy = new SoapClient('http://' . $host . '/api/v2_soap?wsdl=1', $options);
// show available function
$avail = $proxy->__getFunctions();
foreach($avail as $func)
{
 echo "<p>" . $func . "</p>";
}
$proxy->endSession($session);
?>

Wie ihr seht, gibt es zwei Möglichkeiten des Zugriffs über SOAP auf die Magento-API.
V2 wurde um die Kompatibilität mit Java und .NET erweitert samt mehr Funktionen zum Aufruf (vergleicht einfach die Funktions-Listen beider Versionen).

Soweit so gut … als nächstes lassen wir uns eine  Katalog-Liste als Baumstruktur ausgeben, dazu verwendet ihr folgenden PHP-Code:

<?php
/**
 * fly2mars-media
 * http://www.fly2mars-media.de
 * http://www.fly2mars-media.de/seoblog
 */
$host= '127.0.0.1';
$options = array();
$proxy = new SoapClient('http://' . $host . '/index.php/api/soap/?wsdl');
// add or edit this in Magento-Admin -> Web Services
$apiuser= 'apiuser';
$apikey = 'efjiwofjioefjio234789f3h7ed789fh';
try
{
 $session = $proxy->login($apiuser, $apikey);
 $proxy->startSession();
 $catalog = $proxy->call($session, "catalog_category.tree");
} catch (Exception $e)
{
 echo "==> Error: ".$e->getMessage();
 exit();
}
foreach($catalog['children'] as $child)
{
 echo $child['name'] . " (id:" . $child['category_id'] . ")\n";
}
//Logout
$proxy->endSession($session);
?>

Bei $host ist logischerweise der Hostname einzutragen unter welchem die Magentoinstallation aufgerufen werden kann. Bei $apiuser und $apikey tragt ihr die entsprechend im Admin-Back-End eingegebenen Daten des API-Users ein.

Nach dem ausführen des Scriptes erhaltet ihr folgende Ausgabe:

Mit dem Zugriff über die API lassen sich problemlos externe ERP- oder CRM-Anwendungen an Magento anschließen oder Daten (Warenbestand) importieren.

Sie Benötigen Unterstützung bei der Erstellung oder Anpassung eines Magento eCommerce Shop System?

Fly2Mars-Media unterstützt Sie in diesem und vielen anderen Bereichen rund um das Thema Internet & IT!

Für ein individuelles Angebot nehmen Sie noch heute Kontakt mit uns auf.

Einführung in Magento

2. November 2009 at 19:11

magento

Magento ist eine sich schnell entwickelnde sehr professionellen Open-Source-E-Commerce-Plattform mit einer ständig wachsenden User- & Fan-Gemeinschaft. Die erste Version 1.0 wurde am 31. März 2008 veröffentlicht. Seit dem hat sich viel getan, die Veröffentlichung der Version 1.4 steht kurz bevor.

Trotz der guten Usability und der mittlerweile guten Dokumentation, macht vor allem die gute Skalierbarkeit einigen Benutzern zu schaffen. Geht die Installation und Basiskonfiguration noch sehr einfach, spätere Template-Anpassungen oder das Schreiben bzw. Anpassen von Erweiterungen wird zur Qual.

Sehr schnell wird über Magento geschimpft und gar das Konzept bzw. die Struktur in Frage gestellt. Der wirkliche Grund ist allerdings meist das fehlende Basis-Wissen. Installiert sich Magento noch fast von selbst, so gehört bei der Anpassung ein gewisses Basiswissen einfach dazu. Gerne bieten wir Ihnen Dienstleistungen rund um Magento an.

In folgende Themen sollten Sie über entsprechendes Basis-Wissen verfügen:

  1. HTML/XHTML
  2. CSS
  3. Javascript, AJAX (Prototype & jQuery)
  4. XML, JSON
  5. PHP / OO-Programmierung
  6. MySQL Datenbank
  7. Magento basiert auf dem Zend-Framework – Erfahrung mit dem Framework ist von Vorteil
  8. sehr zu Empfehlen: SEO & SEM Basis-Wissen

Bei der Anbindung an externe Systeme, z.B. mit einem ERP-System, ist ggf. zusätzliche Kenntniss von Notwendig!
Mit dem genannten Fähigkeiten sollten die gängisten Anpassungen, Installation, Support & Wartung des Systems möglich sein.

Sie Benötigen Unterstützung bei der Erstellung oder Anpassung eines Magento eCommerce Shop System?

Fly2Mars-Media unterstützt Sie in diesem und vielen anderen Bereichen rund um das Thema Internet & IT!

Für ein individuelles Angebot nehmen Sie noch heute Kontakt mit uns auf.

Magento Resources – Coding Tipps – Magento Cheat Sheet – Magento Hints

29. Oktober 2009 at 20:45

php code

Eine MySQL Datenbank kopieren als Linux Root

Mit dem folgendem Befehlt könnt ihr erfolgreich eine Magento Datenbank kopieren:

$ mysqldump -u root –password=pass db1 | mysql -u root –password=pass db2

Aktuelle Store ID abfragen

Manchmal ist es notwendig die aktuelle Store-ID abzufragen, das geht wie folgt:

Mage::app()->getStore()->getCode()

Aktuelles Land des gewählten Stores ausgeben / get current country of the selected store in Magento

    public function getStoreCountry()
    {
    	return Mage::getStoreConfig('general/country/default', Mage::app()->getStore()->getId());
    }

Heraus finden ob ein Benutzer am System angemeldet ist

Das ist wirklich nützlich wenn Sie z.B. eine spezielle Nachricht oder Gutschein-Code nur für eingeloggte Kunden anzeigen wollen

Mage::getSingleton( 'customer/session' )->isLoggedIn()

Blocks anzeigen welche in dem Bereich nicht geladen sind (Template)

In dem Beispiel binden wir die Top-Suche außerhalb der header.phtml ein. Sie können die Methode überall in den Template-Dateien aufrufen, um Blücke anzuzeigen welche an der Stelle nicht geladen werden.

$this->getChildHtml()
<?php echo $this->getLayout()->getBlock('top.search')->toHtml()?>

Auch das Einbinden von Blocks ohne Template-Datei

Auch das Einbinden von Blocks ohne Template-Datei ist möglich, in der Layout-XML (z.B. page.xml) definiert ihr unter

<layout>
<default>
<block type="page/html" name="root" output="toHtml" template="page/2columns-left.phtml">
<block type="module_name/folder_one" name="folder_one" as="folder_one" />
</block>
</defaul>
</layout>

Beachtet dabei dass der Type „folder_one“ die Verzeichnis-Struktur im Modul-Ordner unter „Block“ ist.

Die Ausgabe erfolgt dann im entsprechenden Template (in diesem Fall page/2columns-left.phtml) durch:

echo $this->getLayout()->getBlock('etracker_track')->toHtml();

Ein bestimmtes Attribut ausgeben

Um den Namen eines Attributes in einer Bestellung anzuzeigen, folgenden Code aufrufen (z.B. in template/catalog/product/view.phtml ):

 <?php echo $_product->getAttributeText('furniture_type') ?> 

Wie gibt man den aktuellen Layout Ordner (theme folder) ausgeben?

 <?php echo $this->getSkinUrl('') ?> 

Die Ausgabe ist ähnlich: http://www.yoursite.com/skin/frontend/default/default/

Warum das sinnvoll ist:
Falls Sie ein neuen CSS Style hinzufügen wollen um z.B. ein Hintergrundbild anzuzeigen, ist der Beste Weg dieses in das Ihr Template Bilder Ordner zu packen und eine Referenz über diesen Aufruf zu setzen:

.className {
background-image: url( }

Oder eine JavaScript Datei einzubinden:

<script type="text/javascript" src="<?php echo $this->getSkinUrl('js/Script.js')?>">

Abfrage von Daten aus der Datenbank (ohne SQL-Abfrage)

Einige Module haben ein Resoure-Model definiert, über das Ihr Daten direkt von der Datenbank abfragen könnt (mapping). Der Zugriff erfolgt in der Regel dann für die Spalte xy über das die Methode getXy() des Models.

Abfrage von Daten aus der Datenbank (per SQL-Abfrage)

Im Rahmen der Entwicklung von Erweiterungen ist es ggf. notwendig Daten aus der Datenbank abzufragen.
Da Magento auf das ZendFramework basiert, ist der Aufruf identisch und zwar wie folgt:

$select = '';
$table = 'table_name';
$where = 'id=' . $id;
$order = '';
// read data
$connection = Mage::getSingleton('core/resource')
->getConnection('core_read');
$select = $connection->select()
->from($table)
->where($where)
->order($order);
$data = $connection->fetchAll($select);

Session Variable in Magento setzen und abfragen

Mage::getSingleton('core/session')->setYourVariable('data');
 $Data = Mage::getSingleton('core/session')->getYourVariable();

Hier noch eine Übersicht von diversen häufig gebrauchten Funktionen (wird zukünftig noch erweitert):

Diverse Werte

<?php
$storeId     = Mage::app()->getStore()->getId();
$storeName   = Mage::app()->getStore()->getName();
$storeCode   = Mage::app()->getStore()->getCode();
$groupId     = Mage::app()->getStore()->getGroupID();
$groupName   = Mage::app()->getStore()->getGroup()->getName();
$websiteName = Mage::app()->getWebsite()->getName();

Models

<?php
$customer = Mage::getModel('customer/customer');
$order    = Mage::getModel('sales/order');
$product  = Mage::getModel('catalog/product');
/* own modul in local */
Mage::getModel('namespace_modul/model')->init($item);

Blocks

<?php
$block = Mage::app()->getLayout()->createBlock('Namespace_Module_Block_BlockName');

Helpers

<?php
$helper = Mage::helper('helper');

Logging

<?php
Mage::log('Schreibe das ins Logfile');

Globale Variable setzen & auslesen

Globale Variable in Magento definieren:

Mage::register('globaleVariable', 'Inhalt');
Mage::log('log-message', Zend_Log::DEBUG, 'logefile.log');

Globale Variable in Magento auslesen:

Mage::registry('globaleVariable');

Globale Variable in Magento löschen:

Mage::unregister('globaleVariable');

Website ID anzeigen (website_id)

<?php echo  Mage::app()->getWebsite()->getID(); ?>

StoreGroup ID anzeigen (group_id)

<?php echo  Mage::app()->getStore()->getGroupID(); ?>

Website Name anzeigen (name)

<?php echo  Mage::app()->getWebsite()->getName(); ?>

Store Name anzeigen (name)

<?php echo  Mage::app()->getStore()->getGroup()->getName(); ?>

StoreView Name anzeigen (name)

<?php echo  Mage::app()->getStore()->getName(); ?>

Skin URL

<?php echo $this->getSkinUrl('images/test.jpg')  ?>

SKU anzeigen

<?php echo  $this->htmlEscape($_product->getSku()) ?>

Hersteller anzeigen

<?php echo  $_product->getAttributeText('manufacturer') ?>

Link zur anzeige einer Kategorie erzeugen

// die Zahl bei load() ist die Category-ID
Mage::getModel('catalog/category')->load('1000')->getUrl();

Link zu einem bestimmen Pfad erzeugen

$this->getUrl('checkout/cart/')

Alternativ

Mage::getBaseDir('lib');  // lib folder
Mage::getBaseDir('media'); // media folder

die aktuelle Action (ActionName) auslesen

// liefert als return zB. &quot;new&quot;
$this->getRequest()->getActionName());

den aktuellen Controller (ControllerName) auslesen

// liefert als return zB. &quot;catalog&quot;
$this->getRequest()->getControllerName());

Module überschreiben (config.xml)

Wenn ihr ein Model überschreiben möchtet so sieht dazu die Config wie folgt aus. Hier am Beispiel des Catalog Model Mage_Catalog_Model_Config welches durch die neu angelegte Klasse Namespace_Catalog_Model_Config erweitert wird, welche im neu angelegten Module Ordner unter /app/code/local/Namespace/Catalog/Model/Config.php abgelegt ist ):

<?xml version=&quot;1.0&quot;?>
<config>
 <modules>
 <Namespace_Catalog>
 <version>0.0.1</version>
 </Namespace_Catalog>
 </modules>
 <global>
 <models>
 <catalog>
 <rewrite>
 <config>Namespace_Catalog_Model_Config</config>
 </rewrite>
 </catalog>
 </models>
 </global>
</config>

Magento: Alle aktiven Sprachen anzeigen / show Available Languages

$availLangs = Mage::getStoreConfig('general/locale/available_languages');
 if (!is_array($availLangs)) {
 $availLangs = explode(',', $availLangs);
 }

Magento: Liste aller verfügbaren Länder / show list of available countries

if (!$countryCollection) {
$countryCollection = Mage::getModel('directory/country_api')->items();
}
foreach($countryCollection as $country) {
var_dump($country);
}

Magento: Filter Attribute erweitern / entfernen (Filter List on Product/Category/Search List)

// $this = Mage_Catalog_Block_Product_List_Toolbar
$this->addOrderToAvailableOrders('price', $this->__('Price'));
// $this = Mage_Catalog_Block_Product_List_Toolbar
// remove attribute
$this->removeOrderFromAvailableOrders('price');

Im Editor Path setzen

{{store direct_url='datenschutzerklaerung'}}

Get the current category name in Magento / Aktuellen Kategorie Namen in Magento ausgeben

Mage::registry('current_category')->getName();

Get the current category in Magento / Aktuellen Kategorie in Magento

Mage::registry('current_category');

Get the current category level in Magento / aktuell Ebene der Kategorie in Magento ausgeben

$currCat = Mage::registry('current_category');
echo $currCat->getLevel();

Display all sub-categories from the actual category in Magento / Unterkategorien der aktuellen Kategorie anzeigen in Magento ausgeben

$currCat = Mage::registry('current_category');
$_categories = Mage::getModel('catalog/category')->getCategories($currCat->getEntityId());
foreach($_categories as $_category)
	echo $_category->getName();

Get Request Param

$this->getRequest()->getParam('website');

Daten auslesen / Filtern / Collection / getResourceModel

$collection = Mage::getResourceModel('sales/order_collection')
 ->addFieldToSelect('grand_total')
 ->addFieldToFilter('customer_id', Mage::getSingleton('customer/session')->getId());
 $collection->load();
 return $collection->getSize();

Index Management – Reindex starten aus php-script

// e.g. for flat-catalog 1
$mageFilename = '../app/Mage.php';
require_once $mageFilename;
$indexer = Mage::getSingleton('catalog/product_flat_indexer')->rebuild(1);

den Aktuell Block im Layout / Template ausgeben – get the current block name in layout

$this->getNameInLayout()

Variable von z.b. controller an Template übergeben

Variable definieren

// load xml layout
 $this->loadLayout();
 // load layout block
 $this->getLayout()
 ->getBlock('block_name')
 ->setVariableName($value);

im template ruft ihr die variable ab mit

$this->getVariableName();

Zugriff auf die Config (config values in core_config_data table)

// e.g. the cookie domain value - enter the "path"-value from the "core_config_data table" in the database
Mage::getStoreConfig('web/cookie/cookie_domain')

Dabei ist egal ob die Paramter in der Datenbank oder in der config.xml hinterlegt ist.

Um die folgenden Werte aus der config.xml auszulesen …

<config>
<default>
<namespace_modulename>
<value>asdf</value>
</namespace_modulename>
</config>
</default>

… verwendet diesen PHP-Snipped:

Mage::getStoreConfig('namespace_modulename/value');

die aktuelle Action (ActionName) auslesen

// liefert als return zB. &quot;new&quot;
$this->getRequest()->getActionName());

Link in einer CMS-Page setzen

// z.b. zur Kontakt-Seite
{{store url='contacts'}}

load parent category by product id / Hauptkategorie anhand der Produkt ID laden in Magento

if(!empty($_product)) {
$_categories = Mage::getModel('catalog/product')
->load($_product)
->getCategoryCollection()
->addAttributeToSelect('name')
->addAttributeToFilter('level', 2);
foreach ($_categories as $_category) {
// get parent category name
echo Mage::getModel('catalog/category')->load($_category->getId())->getName();
// get parent category id
echo Mage::getModel('catalog/category')->load($_category->getId())->getId();
}
}

load current currency code in magento / aktuelle Währungs Kürzel des Stores in Magento auslesen

$baseCurrencyCode = Mage::app()->getStore((int)$this->getParam('store'))->getBaseCurrencyCode();

The current url of the page you are in magento / die aktuelle Seiten URL in Magento

$currentUrl = $this->helper('core/url')->getCurrentUrl();

function to get the real country name of a country-code (e.g. ‚gb‘) set in store-view as code

	public function get_country_name()
	{
		// Mage::app()->getWebsite()->getCode() is 'gb'
                $collection = Mage::getModel('directory/country')->loadByCode(Mage::app()->getWebsite()->getCode());
		return Mage::app()->getLocale()->getCountryTranslation($collection->getId());
	}

get country name for country code (e.g. ‚gb‘ or ‚de‘)

$countryName = Mage::getModel('directory/country')->load('gb')->getName();

Attribute & Entity hinzufügen, EAV-Model erweitern in Magento

Ausführliche Infos zu diesem Punkt im Magento Wiki

get product type in Magento

$_product->getTypeId();

isXmlHttpRequest

// $this = Mage_Core_Controller_Request_Http
$this->getRequest()->isXmlHttpRequest();

Getting the Secure (HTTPS) url for Magento

// first opportunity
Mage::getUrl('datacargofactory', array('_secure'=>true)
// second opportunity about the config
Mage::getStoreConfig('web/secure/base_url')

Check Magento Shop Url is Currently Secure

// return true or false
Mage::app()->getStore()->isCurrentlySecure();

Add customer attribute in Magento

$customer = Mage::getModel('customer/customer')->load($customerId);
$customer->setAttributeName($value);
$customer->save();

get current time in Magento / aktuelle Zeit in Magento

$now = Mage::getModel('core/date')->timestamp(time());

get products collection by category in Magento

$productCollection = Mage::getResourceModel('catalog/product_collection')
->addCategoryFilter($category);

show sql select statement from collection

$collection->getSelect()->__toString();

get magento root path / magento root pfad ausgeben

echo Mage::getRoot();

get magento base path / magento base pfad ausgeben

echo Mage::getBaseDir();

load magento store view / magento store view laden

 Mage::app()->getStore()->load(0);

load customer greater than customer_id 5 / magento Kunden laden ab Kunden-ID 5

                $customerItemsCollection = Mage::getModel('customer/customer')->getCollection()
                    ->addAttributeToFilter('entity_id', array('gt' => 5))
                    ->getAllIds();

get magento store url

Mage::getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB)

save current product url in session / get current product url

$productId  = (int) $this->getRequest()->getParam('id');
$product    = Mage::getModel('catalog/product')->load($productId);
if($productId != '' && !empty($product)) {
Mage::getSingleton('customer/session')->setBeforeReviewRegUrl($product->getProductUrl());
}

beliebige tempaltes einbinden über xml config files in Magento

<fly2mars_catalog_order>
<remove name="right"/>
<remove name="left"/>
<reference name="root">
<action method="setTemplate"><template>page/1column.phtml</template></action>
</reference>
<reference name="content">
<block type="core/template" name="catalog.order" template="fly2mars/catalog/order.phtml"/>
</reference>
</fly2mars_catalog_order>
<fly2mars_newsletter_subscribe>
<remove name="right"/>
<remove name="left"/>
<reference name="root">
<action method="setTemplate"><template>page/1column.phtml</template></action>
</reference>
<reference name="content">
<block type="core/template" name="catalog.order" template="fly2mars/newsletter/subscribe.phtml"/>
</reference>
</fly2mars_newsletter_subscribe>

alternativ  nur einbinden einer phtml-datei in den header

<default>
<reference name="head">
<block type="core/template" name="marin_tracking" template="fly2mars/tracking.phtml" />
</reference>
<default>

get cms/page collection with filter in magento /cms/page collection mit filter in magento abfrage

$this->_cmsPaqgesCollection = Mage::getModel('cms/page')->getCollection()->addStoreFilter(Mage::app()->getStore()->getId());
$this->_cmsPaqgesCollection->getColumnValues('page_id');
$this->_cmsPaqgesCollection->getColumnValues('title');
$this->_cmsPaqgesCollection->getSelect()->where('page_id=5' );
foreach ($this->_cmsPaqgesCollectiona as $page) {
$PageData = $page->getData();
}

current url with(out) param or store code in url / canonical url / current cms url

$currentUrl = Mage::getUrl('', array(
'_current' => false,
'_use_rewrite' => true,
'_secure' => true,
'_store' => $storeId,
'_store_to_url' => false
));

get store home url / URL der Store Startseite in Magento

echo Mage::helper('core/url')->getHomeUrl();

get create date of a product in magento/ Produkt Erstellungsdatum eines Produktes in Magento

echo $product->getCreatedAt();   // get create date
echo $product->getUpdatedAt();  // get update date

rewrite magento resource-model / Magento Resource Model überschreiben

<config>
<global>
<models>
<sitemap_resource>
<rewrite>
<sitemap>Fly2marsmedia_Sitemap_Model_Resource_Sitemap</sitemap>
</rewrite>
</sitemap_resource>
</models>
</global>
</config>

Get full merged config.xml in magento / In Magento die final erzeugte config.xml ausgeben

Die einzelnen Module enthalten jeweils diverse config.xml-Dateien. Diese werden final von Magento zu einer einzigen config-xml-datei zusammen gefügt. Diese könnt ihr euch mit folgendem PHP-Code ausgeben lassen:

Mage::log(Mage::app()->getConfig()->getNode()->asNiceXml(), Zend_Log::DEBUG, "config-xml.log");

Magento SQL: Get attribute_id and update value from eav with sql select

SELECT * FROM eav_attribute WHERE entity_type_id=10;
UPDATE catalog_product_entity_varchar SET value="new page layout" WHERE attribute_id=929;
// entity_id = product id
select * from catalog_product_entity_int WHERE attribute_id=929 AND `store_id`=2 AND `entity_id`=158

Magento config.xml: rewrite an adminhtml controller

<config>
  <admin>
        <routers>
            <fly2marsmedia_customer>
                <use>admin</use>
                <args>
                    <module>fly2marsmedia_customer</module>
                    <frontName>fly2marscustomer</frontName>
                </args>
            </fly2marsmedia_customer>
            <adminhtml>
                <args>
                    <modules>
                        <fly2marsmedia_customer before="Mage_Adminhtml">fly2marsmedia_customer_Adminhtml</fly2marsmedia_customer>
                    </modules>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>

Blöcke überschreiben / overwrite blocks

Blöcke werden in Magento wie folgt überschrieben:

Die Klasse (Datei) in ein neuen Namespace kopieren, dort die klasse entsprechend umbenennen.

In der config.xml des neuen Modules gebt ihr folgendes an:

<global>

<blocks>

<fly2marsmedia_review>

<class>Fly2marsmedia_Review_Block</class>

</fly2marsmedia_review>

</blocks>

</global>

Unbedingt die entsprechende Layout-XML unter app/design/template-path/layout/ anpassen, so dass der neue geänderte

block bei „type“ eingetragen wird.

z.b.

<block type=“review/product_view“ name=“product.info“ template=“catalog/product/view.phtml“>

ändern zu

<block type=“fly2marsmedia_review/product_view“ name=“product.info“ template=“catalog/product/view.phtml“>

Magento Function to check if is referred from customer last order area

    /**
     * check if page is reffered from the customer account (last orders)
     *
     * @return true|false
     */
    public function isReferredFromCustomerAccount()
    {
        $refererUrl     = $this->getRequest()->getServer('HTTP_REFERER');
        if (strpos(strtolower($refererUrl), strtolower('sales/order/view/order_id')) !== false
        ) {
	        return true;
        } else {
            return false;
        }
    }

30 wichtige Magento Extensions

26. Oktober 2009 at 14:42

magento

Eine Übersicht der derzeit 30 wichtigsten Magento Extensions findet ihr unter folgenden Links:

Teil 1

Teil 2

Magento: Nach Datenbank-Import Fehlermeldung im Front-End

22. Oktober 2009 at 14:58

Notice: Undefined index:  0  in /var/www/…/httpdocs/app/code/core/Mage/Core/Model/Mysql4/Config.php on line 92

#0 /var/www/…/httpdocs/app/code/core/Mage/Core/Model/Mysql4/Config.php(92): mageCoreErrorHandler(8, ‚Undefined index…‘, ‚/var/www/…‘, 92, Array)
#1 /var/www/…/httpdocs/app/code/core/Mage/Core/Model/Config.php(268): Mage_Core_Model_Mysql4_Config->loadToXml(Object(Mage_Core_Model_Config))
#2 /var/www/…/httpdocs/app/code/core/Mage/Core/Model/App.php(263): Mage_Core_Model_Config->init(Array)
#3 /var/www/…/httpdocs/app/Mage.php(434): Mage_Core_Model_App->init(“, ’store‘, Array)
#4 /var/www/…/httpdocs/app/Mage.php(455): Mage::app(“, ’store‘, Array)
#5 /var/www/…/httpdocs/index.php(79): Mage::run(“)
#6 {main}

Ihr habt ein Magento-Backup wieder in eine Datenbank importiert und bekommt beim Aufruf des Shops über das Front-End eine ähnliche Fehlermeldung?

Magento speichert bei der Installation die Website-IDs in die Datenbank mit der ID 0. Bei dem Import oder der Übertragung der Datenbank in eine Andere ist ggf. aus der ID 0 für den Admin-Teil der Website eine 2 geworden (so bei uns im aktuellen Fall).

Ändert ihr nun in der Tabelle core_website und core_store die website_id des Datensatzes mit dem Code admin zurück in eine 0, so ist der Fehler behoben.

Unabhängig davon auch beim Import den Fremdschlüssel-Check deaktivieren wie diesem Artikel beschrieben.

Magento: Live (Inline)-Übersetzung im Front- oder Backend-End aktivieren

21. Oktober 2009 at 09:02

Ihr möchtet Übersetzungen im Front- oder Back-End tätigen? Magento liefert dazu eine Live (Inline) Übersetzungs-Option an.

Diese könnt ihr im Admin-Menu unter „Entwickleroptionen/Inline übersetzungen“ aktivieren.

Ab sofort er haltet ihr durch klick auf die entsprechende Wort-Phrase die Möglichkeit direkt Übersetzungen vorzunehmen.

magento screenshot - live uebersetzung

magento screenshot - live uebersetzung

Alternativ in der Config-Datei „\app\code\core\Mage\Core\etc\config.xml “ im folgenden Bereich:

<translate_inline>
<
active>1</active>

<
active_admin>0</active_admin>

</
translate_inline>

Performancemodul für Magento angekündigt

20. Oktober 2009 at 19:01

Die Leipziger Internetagentur Netresearch will dem OpenSource-Shopsystem Magento Beine machen und hat ein Performance-Modul angekündigt. Mit dem Modul soll der Seitenaufbau im Magentoshop beschleunigt werden.

Aktuell werden die Produktlisten und Produktdetailseiten im Magentoshop bei jedem Aufruf neu generiert, dadurch verlängert sich die Ladezeit beim Seitenaufbau. Das Modul von Netresearch rüstet eine Cachingfunktion nach, welche das Neugenerieren unnötig macht. Die Ladezeit soll sich dadurch um bis zu 2/3 verringern lassen.

Das neue Modul wird offiziell am 2. November auf dem Community Treff „Meet Magento #2.09“ in der Frankfurter Börse vorgestellt.

Die Magento-Community ist gespannt!

Cookie Problem mit Magento under Windows & XAMPP?

15. Oktober 2009 at 19:50

Ihr bekommt unter Magento beim befüllen des Warenkorbes oder beim Login den Fehler „Please enable cookies in your web browser to continue.“?

Dieses  Magento-Cookie-Problem konnten wir unter Windows auf XAMPP-Basis reproduzieren. Irgendwie scheint es da ein Problem bei der Auflösung der Hostnames zu geben, als Workaround könnt ihr Magento auf IP-Basis installieren.
Anstatt

http://localhost/mymagentoshop

gebt ihr

http://127.0.0.1/mymagentoshop

bei der Installation/Konfiguration ein und das Problem sollte gelöst sein.

Alternativ könnt ihr in der Datei app/code/core/Mage/Core/Model/Session/Abstract/Varien.php in Zeile 77 die Code-Zeilen

// set session cookie params
session_set_cookie_params(
 $this->getCookie()->getLifetime(),
 $this->getCookie()->getPath(),
 $this->getCookie()->getDomain(),
 $this->getCookie()->isSecure(),
 $this->getCookie()->getHttponly()
);

ändern in

// set session cookie params
session_set_cookie_params(
 $this->getCookie()->getLifetime(),
 $this->getCookie()->getPath()
 //$this->getCookie()->getDomain(),
 //$this->getCookie()->isSecure(),
 //$this->getCookie()->getHttponly()
);

ACHTUNG: Ist ein Core-Hack der bei dem nächsten Update wieder überschrieben wird. Hinzu kommt das die Sicherheit gefährdet wird, damit nicht geeignet zum produktiven Einsatz. Für den Einsatz in einer lokalen lokalen XAMPP-Test-Umgebung unbedenklich.

HTML-Referenz für die Magento-Systemkonfiguration

14. Oktober 2009 at 13:35

Eine HTML-Referenz für die Magento-Systemkonfiguration findet ihr hier !

Gerade für Magento-Einsteiger eine gute Übersicht, mit wo es notwendig erscheint, kurzen Erklärungen.