Posts mit dem Label Magento werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Magento werden angezeigt. Alle Posts anzeigen

Mittwoch, 25. Juli 2012

Magento: Konfigurierbare Produkte, Direktauswahl der Attribute auf der Kategorieseite/Artikelübersicht

Will man auf der Kategorieseite/Product List/Artikelübersicht bei konfigurierbaren Artikeln/Produkten in Magento eine Direktauswahl der Attribute haben, um das aus der Übersicht in den Warenkorb zu bekommen funktioniert das direkt leider so nicht. Ich habe viel recherchiert und da ich nicht der PHP-Code-Checker bin eine Lösung gesucht, die mir weiterhilft. Hier habe ich eine Step-by-Step-Anleitung gefunden, die mir mit etwas Mühe und ein paar Stunden Arbeit es ermöglicht hat das zu lösen:

http://www.catgento.com/adding-configurable-product-options-to-category-list-in-magento/

Jetzt wollte ich das Ganze noch mal in deutsch schreiben und die Feinheiten noch beschreiben, an denen ich gehängen bin bis es funktioniert hat. Wir brauchen hierzu verschiedene Dateien, um Magento quasi dazu zu zwingen unseren Wunsch umzusetzen:

Schritt 1:

Erstelle ein neues Template unter dem Namen configurable_category.phtml und speichere es unter folgendem Pfad in deinem verwendeten Theme: app/design/frontend/default/MY-THEME/template/catalog/product/view/type. Gibt es in deinem Theme diese Ordnerstruktur nicht, dann erstelle sie. Die Datei enthält diesen Code:


<?php
$_product    = $this->getProduct();
$_attributes = Mage::helper('core')->decorateArray($this->getAllowAttributes());
?>

<?php if ($_product->isSaleable() && count($_attributes)):?>
<dl>
    <?php foreach($_attributes as $_attribute): ?>
    <dt><label><em>*</em><?php echo $_attribute->getLabel() ?></label></dt>
    <dd<?php if ($_attribute->decoratedIsLast){?><?php }?>>
        <div>
        <select name="super_attribute[<?php echo $_attribute->getAttributeId() ?>]" id="attribute<?php echo $_attribute->getAttributeId() ?>" class="required-entry super-attribute-select_<?php echo $_product->getId()?>">
        <option><?php echo $this->__('Choose an Option...') ?></option>
        </select>
        </div>
    </dd>
    <?php endforeach; ?>
</dl>

<script type="text/javascript">
    var spConfig_<?php echo $_product->getId()?> = new Inchoo_Product.Config(<?php echo $this->getJsonConfig() ?>);
</script>
<?php endif;?>


Schritt 2:

Nun erstellen wir eine Datei mit dem Namen configurable_list.js und speichern diese direkt in den js-Ordner der Magento-Installation. Hierin verwenden wir den folgenden Code:

if(typeof Inchoo_Product =='undefined') {
    var Inchoo_Product  = {};
}
 
/**************************** CONFIGURABLE PRODUCT **************************/
Inchoo_Product.Config = Class.create();
Inchoo_Product.Config.prototype = {
    initialize: function(config){
        this.config     = config;
        this.taxConfig  = this.config.taxConfig;
        var settingsClassToSelect = '.super-attribute-select_'+this.config.productId;
        this.settings   = $$(settingsClassToSelect);
        this.state      = new Hash();
        this.priceTemplate = new Template(this.config.template);
        this.prices     = config.prices;
 
        this.settings.each(function(element){
            Event.observe(element, 'change', this.configure.bind(this))
        }.bind(this));
 
        // fill state
        this.settings.each(function(element){
            var attributeId = element.id.replace(/[a-z]*/, '');
            attributeId = attributeId.replace(/_.*/, '');
            if(attributeId && this.config.attributes[attributeId]) {
                element.config = this.config.attributes[attributeId];
                element.attributeId = attributeId;
                this.state[attributeId] = false;
            }
        }.bind(this))
 
        // Init settings dropdown
        var childSettings = [];
        for(var i=this.settings.length-1;i>=0;i--){
            var prevSetting = this.settings[i-1] ? this.settings[i-1] : false;
            var nextSetting = this.settings[i+1] ? this.settings[i+1] : false;
            if(i==0){
                this.fillSelect(this.settings[i])
            }
            else {
                this.settings[i].disabled=true;
            }
            $(this.settings[i]).childSettings = childSettings.clone();
            $(this.settings[i]).prevSetting   = prevSetting;
            $(this.settings[i]).nextSetting   = nextSetting;
            childSettings.push(this.settings[i]);
        }
 
        // Set default values - from config and overwrite them by url values
        if (config.defaultValues) {
            this.values = config.defaultValues;
        }
 
        var separatorIndex = window.location.href.indexOf('#');
        if (separatorIndex != -1) {
            var paramsStr = window.location.href.substr(separatorIndex+1);
            var urlValues = paramsStr.toQueryParams();
            if (!this.values) {
                this.values = {};
            }
            for (var i in urlValues) {
                this.values[i] = urlValues[i];
            }
        }
 
        this.configureForValues();
        document.observe("dom:loaded", this.configureForValues.bind(this));
    },
 
    configureForValues: function () {
        if (this.values) {
            this.settings.each(function(element){
                var attributeId = element.attributeId;
                element.value = (typeof(this.values[attributeId]) == 'undefined')? '' : this.values[attributeId];
                this.configureElement(element);
            }.bind(this));
        }
    },
 
    configure: function(event){
        var element = Event.element(event);
        this.configureElement(element);
    },
 
    configureElement : function(element) {
        this.reloadOptionLabels(element);
        if(element.value){
            this.state[element.config.id] = element.value;
            if(element.nextSetting){
                element.nextSetting.disabled = false;
                this.fillSelect(element.nextSetting);
                this.resetChildren(element.nextSetting);
            }
        }
        else {
            this.resetChildren(element);
        }
        //this.reloadPrice();
//      Calculator.updatePrice();
    },
 
    reloadOptionLabels: function(element){
        var selectedPrice;
        if(element.options[element.selectedIndex].config){
            selectedPrice = parseFloat(element.options[element.selectedIndex].config.price)
        }
        else{
            selectedPrice = 0;
        }
        for(var i=0;i<element.options.length;i++){
            if(element.options[i].config){
                element.options[i].text = this.getOptionLabel(element.options[i].config, element.options[i].config.price-selectedPrice);
            }
        }
    },
 
    resetChildren : function(element){
        if(element.childSettings) {
            for(var i=0;i<element.childSettings.length;i++){
                element.childSettings[i].selectedIndex = 0;
                element.childSettings[i].disabled = true;
                if(element.config){
                    this.state[element.config.id] = false;
                }
            }
        }
    },
 
    fillSelect: function(element){
        var attributeId = element.id.replace(/[a-z]*/, '');
        attributeId = attributeId.replace(/_.*/, '');
        var options = this.getAttributeOptions(attributeId);
        this.clearSelect(element);
        element.options[0] = new Option(this.config.chooseText, '');
 
        var prevConfig = false;
        if(element.prevSetting){
            prevConfig = element.prevSetting.options[element.prevSetting.selectedIndex];
        }
 
        if(options) {
            var index = 1;
            for(var i=0;i<options.length;i++){
                var allowedProducts = [];
                if(prevConfig) {
                    for(var j=0;j<options[i].products.length;j++){
                        if(prevConfig.config.allowedProducts
                            && prevConfig.config.allowedProducts.indexOf(options[i].products[j])>-1){
                            allowedProducts.push(options[i].products[j]);
                        }
                    }
                } else {
                    allowedProducts = options[i].products.clone();
                }
 
                if(allowedProducts.size()>0){
                    options[i].allowedProducts = allowedProducts;
                    element.options[index] = new Option(this.getOptionLabel(options[i], options[i].price), options[i].id);
                    element.options[index].config = options[i];
                    index++;
                }
            }
        }
    },
 
    getOptionLabel: function(option, price){
        var price = parseFloat(price);
        if (this.taxConfig.includeTax) {
            var tax = price / (100 + this.taxConfig.defaultTax) * this.taxConfig.defaultTax;
            var excl = price - tax;
            var incl = excl*(1+(this.taxConfig.currentTax/100));
        } else {
            var tax = price * (this.taxConfig.currentTax / 100);
            var excl = price;
            var incl = excl + tax;
        }
 
        if (this.taxConfig.showIncludeTax || this.taxConfig.showBothPrices) {
            price = incl;
        } else {
            price = excl;
        }
 
        var str = option.label;
        if(price){
            if (this.taxConfig.showBothPrices) {
                str+= ' ' + this.formatPrice(excl, true) + ' (' + this.formatPrice(price, true) + ' ' + this.taxConfig.inclTaxTitle + ')';
            } else {
                str+= ' ' + this.formatPrice(price, true);
            }
        }
        return str;
    },
 
    formatPrice: function(price, showSign){
        var str = '';
        price = parseFloat(price);
        if(showSign){
            if(price<0){
                str+= '-';
                price = -price;
            }
            else{
                str+= '+';
            }
        }
 
        var roundedPrice = (Math.round(price*100)/100).toString();
 
        if (this.prices && this.prices[roundedPrice]) {
            str+= this.prices[roundedPrice];
        }
        else {
            str+= this.priceTemplate.evaluate({price:price.toFixed(2)});
        }
        return str;
    },
 
    clearSelect: function(element){
        for(var i=element.options.length-1;i>=0;i--){
            element.remove(i);
        }
    },
 
    getAttributeOptions: function(attributeId){
        if(this.config.attributes[attributeId]){
            return this.config.attributes[attributeId].options;
        }
    },
 
    reloadPrice: function(){
        var price    = 0;
        var oldPrice = 0;
        for(var i=this.settings.length-1;i>=0;i--){
            var selected = this.settings[i].options[this.settings[i].selectedIndex];
            if(selected.config){
                price    += parseFloat(selected.config.price);
                oldPrice += parseFloat(selected.config.oldPrice);
            }
        }
 
        optionsPrice.changePrice('config', {'price': price, 'oldPrice': oldPrice});
        optionsPrice.reload();
 
        return price;
 
        if($('product-price-'+this.config.productId)){
            $('product-price-'+this.config.productId).innerHTML = price;
        }
        this.reloadOldPrice();
    },
 
    reloadOldPrice: function(){
        if ($('old-price-'+this.config.productId)) {
 
            var price = parseFloat(this.config.oldPrice);
            for(var i=this.settings.length-1;i>=0;i--){
                var selected = this.settings[i].options[this.settings[i].selectedIndex];
                if(selected.config){
                    price+= parseFloat(selected.config.price);
                }
            }
            if (price < 0)
                price = 0;
            price = this.formatPrice(price);
 
            if($('old-price-'+this.config.productId)){
                $('old-price-'+this.config.productId).innerHTML = price;
            }
 
        }
    }
}

Diese Datei ist verantwortlich für die Darstellung der einzelnen Attribute als Dropdown im Frontend.


Schritt 3:

Nun müssen wir die neue js-Datei auch laden. Das machen wir in der catalog.xml, die man unter dem folgenden Pfad app/design/frontend/default/MY-THEME/layout findet. Man fügt im Bereich "Category default layout" oder auch an anderen Stellen wo man das Ausgabe gerne noch zusätzlich hätte folgenden Code ein:

<reference name="head">
      <action method="addJs"><script>configurable_list.js</script></action>
</reference>


Schritt 4:

Jetzt benötigen wir die die Datei list.phtml, die man unter app/design/frontend/default/MY-THEME/template/catalog/product findet. Hier müssen wir zwei mal, einmal für die Grid-Darstellung und einmal für die List-Darstellung ein Stück Code ausstauschen. Am besten den kompletten Code tauschen:

<div class="actions">
    <?php if($_product->isSaleable()): ?>
    <form action="<?php echo $this->helper('checkout/cart')->getAddUrl($_product) ?>" method="post" id="product_addtocart_form" <?php if($_product->getOptions()): ?> enctype="multipart/form-data"<?php endif; ?>>
    <?php Mage::unregister('product') ?>
    <?php Mage::register('product', $_product); ?>
     <?php if ( $_product->getTypeId() == 'configurable'): ?>
     
            <?php echo $this->getLayout()->createBlock('catalog/product_view_type_configurable', '', array('template'=> 'catalog/product/view/type/configurable_category.phtml'))->toHtml(); ?>
        <?php endif; ?>
        <button type="submit" title="<?php echo $this->__('Add to Cart') ?>" class="button btn-cart"><span><span><?php echo $this->__('Add to Cart') ?></span></span></button>
    <?php else: ?>
        <?php if ($_product->getIsSalable()): ?>
            <p class="availability in-stock"><span><?php echo $this->__('In stock') ?></span></p>
        <?php else: ?>
            <p class="availability out-of-stock"><span><?php echo $this->__('Out of stock') ?></span></p>
        <?php endif; ?>
    <?php endif; ?>
        <ul class="add-to-links">
            <?php if ($this->helper('wishlist')->isAllow()) : ?>
                <li><a href="<?php echo $this->helper('wishlist')->getAddUrl($_product) ?>" class="link-wishlist"><?php echo $this->__('Add to Wishlist') ?></a></li>
            <?php endif; ?>
            <?php if($_compareUrl=$this->getAddToCompareUrl($_product)): ?>
                <li><a href="<?php echo $_compareUrl ?>" class="link-compare"><?php echo $this->__('Add to Compare') ?></a></li>
            <?php endif; ?>
        </ul>
    </form>
</div>

Wenn ich jetzt keine Fehler bei der Beschreibung gemacht habe und ihr keine beim Einbauen, sollte der Kram jetzt hinhauen. Genauer könnt ihr das alles noch mal auf englisch auf dem oben stehenden Link nachlesen. Allerdings ist hier der Step 4 und 5 etwas verwirrend und ich habe in in einen Schritt zusammengefasst. Außerdem ist in Step 4 ein "Link" im Code richtig, der dann im Step 5 aber falsch ist. In meiner Beschreibung ist das schon korrigiert. Siehe auch die Kommentare in dem englischen Artikel wenn ihr mehr wissen wollt.

Mittwoch, 22. Februar 2012

Checkboxen im Magento Warenkorb ausblenden

Eigentlich sollte das Ausblenden der Boxen Rabattcode eingeben und Versandkosten berechnen im Magento Warenkorb folgendermaßen gehen:

Man sucht die Datei: /app/design/frontend/default/Template-Name/layout/checkout.xml

Hier kommentiert man dann diese Zeilen aus:

<block type="checkout/cart_coupon" name="checkout.cart.coupon" as="coupon" template="checkout/cart/coupon.phtml"/>
<block type="checkout/cart_shipping" name="checkout.cart.shipping" as="shipping" template="checkout/cart/shipping.phtml"/>


Dann sollte die beiden Blöcke eigentlich weg sein. Das bei mir so auch schon mal funktioniert meine ich, aber in diesem Fall irgendwie nicht.


Also habe ich mir übers Magento-Backend die Template Hints eingeblendet und geschaut wo die Templates der Blöcke liegen und wie sie heißen. Dann habe ich einfach die Template-Dateien im FTP-Programm auskommentiert indem ich sie umbenannt habe.


Ich habe keine Ahnung, ob man das so machen kann oder sich damit irgendwelche anderen Probleme mit ins Haus holt, aber beim Frontend werden die Template-Namen noch angezeigt in der Entwickleransicht (Template Hints), aber die Checkboxen sind weg so wie ich es wollte.


Template Pfadhinweise im Magento-Frontend einblenden

Um im Frontend von Magento einzelne Bereiche den passenden Templates zuzuordnen gibt es eine nette Möglichkeit übers Magento-Backend eine entsprechende Ansicht einzublenden.

Man geht auf: System -> Konfiguration -> Entwickleroptionen -> Debug -> Vorlagen Pfadhinweise

Hier muss man unbedignt oben links von Standardkonfiguration auf z.B. Main Website umschalten, sonst bekommt man die entsprechende Funktion unter Debug gar nicht angezeigt.

Hier setzt man dan die Funktion Vorlagen Pfadhinweise auf Ja und speichert die Konfiguration.


So sieht es dann im Frontend aus:


Dienstag, 21. Februar 2012

Sonntag, 19. Februar 2012

Wie mache ich einen Zieltrichter für den Magento Onepage-Checkout

Beim Tracking in einem Onlineshop wie Magento gibt es ja viele interessante Prozesse und Kennzahlen. Z. B. auch wie sich die potentiellen Kunden beim Checkout verhalten: schließen sie eine Bestellung ab, brechen sie vorzeitig im Bestellprozess ab und wo brechen sie im Bestellprozess ab?

Hierfür bietet Google Analytics die Möglichkeit an sog. Zieltrichter zu definieren. Normalerweise geht das über entsprechend eigenständige Ziel-URLs im Trichterprozess. Jetzt hat der Onpage-Checkout bei Magento allerdings nicht für jeden Schritt eine eigene URL. Was man in Magento und Google Analytics machen muss um den Prozess aber trotzdem in einem Trichter abbilden zu können ist in folgendem Link sehr schön beschrieben:

http://ducrot.wordpress.com/2010/01/27/magento-bestellablauf-mit-google-analytics-verfolgen/

Montag, 13. Februar 2012

Individuelle Versandarten Magento

Ziel war es einer Versandkostenpauschale (Standard) noch die Versandart Express hinzuzufügen. Dachte das ist easy bei Magento und ich klicke im Backend einfach auf eine Buttton und kann eine zusätzliche Versandart hinzugügen. Leider ist es in Magento dann doch nicht so trivial zu lösen. Das Geheimnis einer individuellen Versandvariante ist die schon vorhandene Versandart Table Rates.Mit Table Rates kann man eine komplexe Matrix erstellen mittels eines CSV-Files, in dem man viele denkbare Szenarien abbildet wie z. B. Versand in unterschiedliche Länder, verschiedene Kosten bei unterschiedlichen Versandgewichten, usw. Wir benutzen für unseren Zweck nur einen kleiner Teil dieser möglichen Funktionalitäten bei Table Rates.

Zuerst muss man aber im Magento-Backend die Table Rates Funktionalität aktivieren. Ganz wichtig ist es hier den Geltungsbereich oben links auf "Main Website" einzustellen damit z. B. der Titel überhaupt zugewiesen werden kann oder mit den CSV-Files gearbeitet werden kann. Um an eine Vorlage des CSV-Files zu kommen geht man den Button "CSV exportieren" und öffnet diese Datei in z. B. einem Texteditor.


Hier sieht man in der ersten Zeile welche Möglichkeiten einem zur Verfügung stehen. In der folgenden Zeile geben wir unsere Wunschspezifikationen ein. Der "*" bedeutet immer, dass es für alles gilt, also z. B. für alle Länder, Regionen, Postleitzahlen, usw. wie in unserem Fall. Bei uns müssen wir nur eine Wert für das Gewicht setzen also ab "0" und alles darüber. Ich glaue hier funktioniert der * nicht, deshalb so. Im letzten Punkt er Zeile (Ve) hinterlegen wir unseren "neuen Preis". Man speichert die Datei wieder als CSV und kann sie dann wie man im Screenshot oben sieht wieder übers Backend importieren.


Als Ergebnis haben wir nun beim Magento-Checkout unsere zusätzliche individuelle Versandarte "Express" eingefügt inklusive dem eigenen neuen Preis von 20 Credits.


Attribute-Label im Backend ändern bei Magento

Wie kann ich den Namen eines Backend-Attributes in Magento ändern? Früher ging das wohl über das Sprachfile irgendwo bei Adminhtml glaube ich. Bei den neueren Versionen (bei mir in diesem Fall Magento 1.6.0) geht das wohl nicht mehr. Es bleibt einem leider nichts anderes übrig als den Namen des Labels direkt in der Datenbank zu ändern. In unserem Fall haben wir das Tax/VAT-Feld zu einem Company-Feld umfunktioniert. Um den angezeigten Namen im Backend zu ändern geht man in die Tabelle magento_eav_attribute und sucht sich den taxvat-Eintrag raus und klickt auf den Bearbeitunsg-Bleistift. Hier darf man sich jetzt nicht durch die Bezeichnung "frontend-label" täuschen lassen. So wie ich es verstehe ist es das Frontend des Backends ;-) Bei Wert trägt man nun hier ein wie der Name des Attributes im Backend ausgegeben werden soll.



Bestellbenachrichtigung bei Magento für Shopbetreiber

Eigentlich eine simple Sache. Aber irgendwann habe ich mir mal überlegt wie ich die Info über eine neue Bestellung in Magento nicht nur über das Dashboard im Backend bekomme, sondern zusätzlich als E-Mail-Benachrichtigung auf meine eigene E-Mail-Adresse. Also eine recht fundamentale Einstellung, aber wo kann ich die machen in Magento. Versteckt ist das Ganze untern dem Punkt Verkaufs-E-Mails:

System -> Konfiguration -> Verkäufe -> Verkaufs-E-Mails

Hier kann man dann für jede beliebige E-Mail, die im Verkaufsprozess generiert werden entscheiden wer diese Info/Verkaufs-E-Mail noch zusätzlich bekommen soll.


Freitag, 10. Februar 2012

Magento Pflichtfelder ändern

Wie kann ich (zumindest im Backend) die Pflichtfelder z.B. bei den Kundendaten ändern? Dazu muss man z.B. über phpMyAdmin in die Datenbank und die Tabelle magento_eav_attribute suchen und dort dann den entsprechenden Eintrag den man bearbeiten will. Bei uns z.B. firstname. Klickt man den Bearbeitungs-Bleistift an, kommt man in den Eintrag und findet ein Feld is_required. Steht hier als Wert 1 ist es ein Pflichtfeld, steht hier der Wert 0 ist es kein Pflichtfeld. Danach mit Ok bestätigen und die Einstellung sollte passen.



Customer Grid Erweiterung bei Magento

Wie kann ich die Kundenübersicht bei Magento unter dem Backend-Menüpunkt "Kunden verwalten" um eine Zeile erweitern. Vorab muss man noch sagen, dass wir das schon per Default vorhanden Steuerfeld "Tax/VAT" für uns in ein "Company" Feld umbenannt haben. Jetzt ging es noch darum dieses Feld in der Übersicht bei "Kunden verwalten" darzustellen. Es gibt wahrscheinlich noch eine elegantere aber auch aufwändiger Lösung als in den Core einzugreifen, aber wir haben es so gemacht. Unter diesem Pfad findet man das entsprechende Dokument:

app/code/core/Mage/Adminhtml/Block/Customer/Grid.php

In diesem Dokument fügt man dann an den folgenden zwei Stellen z.B. den Code im Screenshot zu sehen hinzu:

Neues Attribut hinzufügen bei: _prepareCollection() function

Neue Spalte hinzufügen bei: _prepareColumns() function


Haut alles hin sollte das Ganze dann folgendermaßen aussehen:


Freitag, 27. Januar 2012

Versandkosten werden falsch angezeigt in Magento

Diese Geschichte hat mich über Tage immer wieder beschäftigt ohne eine Lösung dafür zu gefunden zu haben. Da ich das ganze System vor kurzem erst auf einen anderen Server umgezogen hatte und da durchaus Probleme mit einer sauberen Datenübertragung hatte, dachte ich dass da etwas zerschossen ist und habe auch fleißig Systemdateien neu hochgeladen und Extensions z.T. neu installiert. Das hatte auf jeden Fall ein paar andere Probleme gelöst, die ich hatte, aber die Versandenkosten in Magenot wurden immer noch falsch ausgegen: z.B. hatte ich 4,90 eingegeben und Magento hat mir im Frontend 3,00 ausgegeben??? Lustigerweise ist die Lösung ganz ganz einfach und hat nichts mit einem beschädigten System zu tun: Im Backend mus man beim Versandkostenbetrag einen PUNKT als Trennzeichen eingeben und im Frontend wird beim deutschen Sprachpaket dann ein KOMMA ausgegeben. Geändert und schon hat´s funktioniert.

Frontend mit KOMMA:


Backend mit PUNKT:


Dienstag, 10. Januar 2012

Transaktions E-Mails Magento

Hat man in einem Magento Shop die Extension "German Market Ready" installiert befinden sich bei den Transaktions E-Mails bei Magento eine ganze Menge Basis-Templates. Eine schöne Beschreibung wie man hier seine eigenen Templates aus den Vorlagen heraus erstellt und v.a. wo man dann später die fertigen eigenen Vorlagen zuweist und verknüpft, findet man unter folgendem Link:

http://neoshops.de/2011/07/13/transaktions-e-mails-in-magento-wo-ist-eigentlich-welche-e-mail/


Magento und Google Analytics

Ich habe im Netz gesucht wie ich Magento eCommerce und Google Anlaytics am besten verbinden kann und habe diesen sehr schönen und aktuellen Blog-Artikel gefunden:

http://www.krick-interactive.com/sem-blog/2011/11/17/google-und-magento-teil-1-google-analytics/


Dienstag, 3. Januar 2012

PHP Fatal error: Class 'Mage_Core_Model_Resource_Type_Db_Pdo_Mysql'


Nachdem ich nächtelang gekämpft habe eine Domain und eine Magento Installation umzuziehen, hing ich dann an folgendem Fehler aus dem error-log: PHP Fatal error: Class 'Mage_Core_Model_Resource_Type_Db_Pdo_Mysql'

Als Effekt hatte ich im Frontend wie im Backend einen Whitescreen. Also bin ich im Netz auf die Suche nach dem Fehler gegangen.

Ergebnis:

Es fehlen irgendwo Dateien, die entweder im Zip/Unzip- oder im FTP-Prozess verloren gegangen sind. Bei mir war das fiese, dass meine Backup/Umzugsdaten wohl nicht in Ordnung waren. Ich habe dann aus einem "Basispaket" den app-Folder noch mal neu aufgespielt und schau an, es hat tatsächlich funktioniert. Natürlich müssen die Datenbank-Informationen in der app/etc/local.xml stimmen.

Montag, 2. Januar 2012

Tabellen komplett aus my SQL Datenbank löschen

Ich wollte meine Datenbank für ein Magento Shopsystem von den "Testdaten" bereinigen und habe eine Lösung gesucht, wie das über die Oberfläche von phpMyAdmin  funktioniert. Einfach alle anwählen und löschen geht wohl bei den Magento-Tabellen nicht. Aber Gott sei Dank hat sich darüber schon mal jemand Gedanken gemacht:

http://www.gurkcity.de/blog/Loeschen-von-Datenbanktabellen-in-MySQL5-schlaegt-fehl-41.html

Samstag, 10. Dezember 2011

Magento Produkt Schlagworte / Product Tags ausblenden

Da es in Magento einfach so von Einstellmöglichkeiten und Funktionen wimmelt, kann man sich oft nicht erinnern wie man was gemacht hat, obwohl es oft ganz einfach ist. So auch in diesem Fall. Es geht darum das Modul Produkt Schlagworte bzw. Product Tags aus der Artikelansicht auszublenden. Muss ich hier im PHP was auskommentieren oder wo setzte ich jetzt wieder an??? In diesem Fall ganz einfach: Man geht auf System -> Konfiguration -> Erweitert -> Erweitert und deaktiviert Das Modul Mage_Tag.

Montag, 7. November 2011

Eigene Währung anlegen in Magento

Hier ein Link wo alles schön beschrieben ist:

http://www.cfoerster.com/blog/9-webentwicklung/31-eigene-waehrung-fuer-magento-commerce

Keine Dezimalstellen-Anzeige im Magento Frontend

Nach mal wieder längerer Recherche mit richtig viel verschiedenen Hardcore-Codes und unbefriedigenden Ergebnissen. Bin ich doch tatsächlich auf eine Extension gestoßen, die das Problem erst mal auf einfache Weise löst:
http://www.magentocommerce.com/magento-connect/price-layout-extension.html

Sonntag, 6. November 2011

Kommerzielle Magento Extension installieren

Freeware Extensions kann man in Magento über Magento Connect über den Extension-Key relativ einfach installieren. Jetzt war ich aber in der Verlegenheit eine kommerzielle Extension nutzen zu müssen, hier gibt es keinen Extension-Key, sondern ein ZIP-file mit einem Magento-typischen Verzeichnisbaum. Kernelement dieser Struktur ist ein Ordner extension in dem sich wiederum die zwei Ordner app und skin befinden, wie man sie aus dem Verzeichnisbaum von Magenot kennt.

In der Installationsanleitung steht nun man soll "den Inhalt aus dem Ordner extension in sein Magento Root-Verzeichnis auf dem Webserver kopieren". Nachdem ich mir in den letzten zwei Tagen schon zwei mal das System abgeschossen habe und doch viele Stunden Recherche brauchte, um es jeweils wieder zu aktivieren, war ich jetzt doch vorsichtiger: Ich soll quasi mit die zwei wichtigsten Ordner in der Magento-Verzeichnisstruktur mit gleich benannten Ordner aus der Extension überschreiben???? Ich will doch nicht meine ganzen entscheidenden Daten verlieren und mein System schon wieder in die Wüste schicken. Klar war auch, dass die Ordner der Extension auch nur den Extension-spezifischen Inhalt enthielten.

Nach ein paar Stunden Recherche habe ich im Netz nicht viel brauchbares finden können und bei dem wenigen, das ich fand war auch immer mal wieder von "überschreiben" der bestehenden Ordner skin und app auf dem Webserver die Rede - und überschreiben wollte ich nun wirklich nicht.

Also habe ich doch direkt an den Support des Extensions-Anbieters geschrieben, die übrigens direkt sonntags auch geantwortet haben. Aussage war, dass die wenn man im FTP-Programm die Ordner mit gleichem Namen (also skin und app) rüberzieht, diese nicht überschrieben werden, sondern verschmelzen ??!! Ok, noch nie gehört, aber mit etwas Bauchweh dann troztdem ausprobiert. Und siehe da, tatsächlich würde ich nach "ersetzen" oder "überschreiben" gefragt und die spezifischen Extension-Daten wurden den schon bestehenden Ordnern skin und app hinzugefügt. Danach verlief alles nach Anleitung und die Extension war installiert, ole ole.

503 Error bei Magento

Nachdem ich im Magento Connect versucht habe ein "falsches" Extension-Paket hochzuladen ist dieser Fehler aufgetreten. Eine Lösungsmöglichkeit ist:
  1. die Cache-Dateien Mage--? in var/cache leeren
  2. im Root-Verzeichnis von Magento die Datei maintainance.flag suche und löschen
  3. den Browser-Cache leeren
Wenn man Glück hat geht es jetzt wieder :-).