Magento: order verzenden werkt niet

Na upgrade van de Magento webshop naar versie 1.7 werkt verzenden order niet meer

Een probleempje dat ontstond na de upgrade, de button doet niets als je er op klikt. Het lijkt te maken te hebben met Fooman Speester vanwege het comprimeren van de javascript bestanden. De oplossing is gelukkig simpel.

 

Zoek het volgende bestand op:

js/mage/adminhtml/sales/packaging.js

Rond regel 304 met je het volgende

 

pack.id 'package_block_' + ++this.packageIncrement;

vervangen met:

 

pack.id 'package_block_' + (++this.packageIncrement);


Als je hierna op de verzend button klikt is je order compleet.

Magento: upgrade Magento methode 2

Als het niet lukt om Magento te upgraden via de standaardmethode

In mijn andere artikel had ik aangegeven hoe Magento te upgraden. Helaas kom je soms zoveel fouten tegen dat het niet lijkt te lukken. Daarom hier nog een alternatieve methode.

Het is belangrijk dat je SSH toegang hebt.
Maak om te beginnen een backup van je database. Dat doe je via het volgende commando:

mysqldump -uGEBRUIKERSNAAM -pWACHTWOORD DATABASENAAM > backup.sql

Hierna maak je ook een kopie van de root folder waarin Magento is geinstalleerd. Via het commando:

cp -R MAGENTOMAP MAGENTOMAP.save

Let op dat je geen foutmeldingen hebt! Als de upgrade niet lukt wil je graag een backup achter de hand hebben. Doe dit ook NIET op een live webshop. Zorg ervoor dat er geen toegang tot de shop is.

Leeg de cache en verwijder de sessions.

Download de nieuwste stabiele versie van Magento. In dit geval gaan we uit van magento 1.6.2. De downloadpagina vindt je hier.

Kies voor de gzip versie (eindigend op .gz dus).

Sla deze op de server op. Pak het bestand uit via tar -xvf magento-1.6.2.0.tar.gz

Kopieeer dan de inhoud van de map ‘magento’ naar je root folder van de webshop. Via commando:
cp -R magento/* MAP_NAAR_WEBSHOP

hierna start je je browser op en typ je de url van je webshop in. Hierdoor wordt de upgrade van de database geinitialiseerd. Je zult wat foutmeldingen voorbij zien komen, maar het is belangrijk om een aantal keren F5 te geven (refresh).

In linux kun je het commando ‘top’  geven om te zien wat er gebeurt.

Aan het eind hiervan kwam ik de volgende foutmelding tegen:

Fatal error: Call to a member function toHtml() on a non-object in /var/www/clients/client15/web28/web/app/code/core/Mage/Core/Model/Layout.php on line 529

Dat is gelukkig eenvoudig te verhelpen. Het heeft te maken met de template. Hiervoor moet je het volgende aanpassen:

Zoek naar je page.xml. Deze stond in mijn geval onder app/design/frontend/default/helloclean/layout

(uiteraard zul je zelf een andere template hebben – in dit geval was het helloclean).
Vervang nu de regel

<block type="core/profiler" output="toHtml"/>

door
<block type="core/profiler" output="toHtml" name="core_profiler"/>

Zorg er ook voor dat je de cache nog even leegt. F5, en klaar.

Magento: 2 achtergrond afbeeldingen gebruiken

2 verschillende afbeeldingen als achtergrond gebruiken.

Hoewel dit natuurlijk niet specifiek iets voor Magento is, wil ik het toch even onder deze rubriek uitleggen.

Een voorbeeld hiervan tref je aan op de site van beadles

Afbeelding van beadles.nl

Een afbeelding is hierbij toegevoegd aan de linkerbovenhoek en de rechteronderhoek. Hoe doe we dat? Het gebruiken van een afbeelding voor de body is makkelijk:

body{
    color:#2F2F2F;
    background-attachment: fixed;
    background-color: #FFF;
    background-image: url(../images/body_bg.jpg);
    background-repeat: no-repeat;
    background-position: left top;   
}

Hiermee is dus de afbeelding van de linkerbovenhoek geplaatst.

Daarnaast willen we nog een afbeelding in de rechteronderhoek. Daarvoor hebben we een div met een extra class nodig waarin Magento voorziet, namelijk .page:

.page {
    background-image: url(../images/body_bg2.jpg);
    background-repeat: no-repeat;
    background-position: right bottom;
    z-index: 10;
    background-attachment: fixed;
}

De afbeeldingen blijven mooi op hun plaats (fixed).

Niet zo heel moeilijk dus, maar je moet het even weten.

 

Magento: delen met sociale media in Magento

<h4>Buttons toevoegen om te delen met sociale media</h4>
<p>Aangezien sociale media steeds belangrijker worden is het van belang om dit ook op te nemen in je webshop. Op veel sites zie je al knoppen voor Twitter en Facebook, met de mogelijkheid een pagina door te sturen.</p>
<!–break–>
<p>Dat ziet er dan zo uit:</p>
<p><a href=”http://www.beadles.nl/roze-speksteen.html” target=”_blank”><img height=”275″ width=”728″ src=”/image/socialmedia.JPG” alt=”Social media” /></a></p>
<p>Hoe gaan we dat maken? In werkelijkheid is het niet heel gecompliceerd. Om te beginnen is het natuurlijk handig om even wat button op te zoeken, maar daar hoef ik waarschijnlijk niets over te vertellen.</p>
<p>De buttons willen we toevoegen in de productdetailpagina (maar uiteraard zijn er meer mogelijkheden denkbaar). Deze vinden we onder:<br />
app\design\frontend\default\TEMPLATENAAM\catalog\product\</p>
<p>Hier openen we view.phtml.<br />
Daarna moeten we wat code invoegen als volgt:</p>
<p><strong>Voor Twitter:</strong></p>
<p>&lt;a <strong>class=&quot;share&quot;</strong> title=&quot;Verzend pagina via Twitter!&quot; href=&quot;http://twitter.com/share?status=Kijk eens naar &lt;?php echo $this-&gt;htmlEscape($_product-&gt;getName()) ?&gt; op &lt;?php echo $_product-&gt;getProductUrl() ?&gt; &quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;/media/twitter.png&quot; alt=&quot;Beadles op Twitter&quot;/&gt;&lt;span <strong>class=&quot;sharetext</strong>&quot;&gt;Deel op twitter&lt;/span&gt;&lt;/a&gt;&lt;br&gt;</p>
<p><strong>Voor Facebook:</strong></p>
<p>&lt;a <strong>class=&quot;share&quot;</strong> href=&quot;http://www.facebook.com/sharer.php?u=&lt;?php echo $_product-&gt;getProductUrl() ?&gt;&amp;t=Bekijk+dit+eens&quot; target=&rdquo;_blank&rdquo; &lt;img src=&quot;/media/facebook.gif&quot; alt=&quot;Deel op facebook&quot;&gt;&lt;span <strong>class=&quot;sharetext&quot;</strong>&gt;Deel op facebook&lt;/span&gt;&lt;/a&gt;</p>
<p>Ik heb wat classes aangemaakt zodat je de boel mooi kunt stylen. Uiteraard is de link <strong>/media/facebook.gif </strong>afhankelijk van de echte locatie en naam van de afbeelding. Dit geld natuurlijk ook voor twitter.</p>
<p>De code: &lt;?php echo $_product-&gt;getProductUrl() ?&gt; haalt de Url van het betreffende product op. Het wordt dan automatisch meegenomen naar Twitter of Facebook.</p>

Magento: winkelwagen leeg na annuleren betaling

Probleem: na het annuleren van een betaling is de winkelwagen leeg.

Dit is niet wenselijk, aangezien een klant om meerdere redenen de betaling kan annuleren. Het kan bijvoorbeeld zo zijn dat hij nog een extra product wil kopen of anders wil betalen. De winkelwagen moet dus pas leeg worden gemaakt op het moment dat de betaling gedaan is.
Er zijn 2 mogelijke oplossingen hiervoor:

Oplossing 1 werkt in combinatie met OneStepCheckout.

Oplossing 2 in andere gevallen

Oplossing 1:
Op regel 163 in app/code/core/Mage/Sales/Model/Service/Quote.php verander $quote->setIsActive(false); in $quote->setIsActive(true);

Oplossing 2:
Maak de volgende aanpassing
(maak bij voorkeur een lokale kopie in app/code/local –> zie wiki):

app/code/core/Mage/Checkout/controllers/OnepageController.php regel 484 – 491 ORIGINEEL:
$this->getOnepage()->getQuote()->save();
/**
* when there is redirect to third party, we don’t want to save order yet
* we will save the order in return action. */
if (isset($redirectUrl)) { $result[‘redirect’] = $redirectUrl; }

VERANDER IN
//$this->getOnepage()->getQuote()->save();
/**
* when there is redirect to third party, we don’t want to save order yet
* we will save the order in return action. */

if (isset($redirectUrl)) {
$result[‘redirect’] = $redirectUrl;
}
else {
$this->getOnepage()->getQuote()->save();
}

Cache leegmaken, klaar.

 

Magento: onclick events aanmaken

Tekstvak automatisch leegmaken als je erin klikt

Iets wat eigenlijk niet alleen maar onder Magento valt, maar toch wel vaak gevraagd wordt: je heb van die tekstvakken met bijvoorbeeld Email erin. Je wilt natuurlijk niet eerst met backspace deze tekst weghalen,

maar dit doen we dus met Javascript.

Je hebt bijvoorbeeld dit invulvak voor een nieuwsbrief:

Email en Naam moet verdwijnen als je begint te typen.

Je moet dan even de template opzoeken waarin dit staat (even de hints aanzetten onder configuratie/developer). Het vetgedrukte gedeelte is toegevoegd:

<?php //echo $this->getFormActionUrl() ?>
<div class="block-subscribe-home">
    <h1>
        <?php echo $this->__(‘NIEUWSBRIEF’) ?>
    </h1>
    <form action="<?php echo $this->getFormActionUrl() ?><?php //echo Mage::getUrl(); ?>contacts/index/post/" method="post" id="newsletter-validate-detail">
        <div class="block-content">
            <!–<label for="newsletter"><?php //echo $this->__(‘Sign Up for Our Newsletter:’) ?></label>–>
            <div class="input-box">
               <input type="text" name="email" value="Email" onfocus="if (this.value==’Email’) this.value = ” " onblur="if (this.value==”) this.value = ‘Email’ " id="newsletter" title="<?php echo $this->__(‘Sign up for our newsletter’) ?>" class="input-text required-entry validate-email" />
               <input type="text" name="name" value="Naam" onfocus="if (this.value==’Naam’) this.value = ” " onblur="if (this.value==”) this.value = ‘Naam’ " id="name" title="<?php echo $this->__(‘name’) ?>" class="input-text" />
            </div>
            <div class="actions">
                <button type="submit" title="<?php echo $this->__(‘Subscribe’) ?>" class="button"><span><span><?php echo $this->__(‘Subscribe’) ?></span></span></button>
            </div>
        </div>
    </form>
    <script type="text/javascript">
 

Wat gebeurt er precies?

Onfocus = als er in geklikt of getypt wordt –> tekst wordt verwijderd.
Onblur   = als de focus weg is –> tekst wordt teruggezet.

Simpel(maar dat is alles als je het eenmaal weet), maar het voorkomt veel irritatie.

Magento: pagination ontbreekt

Ontbrekende mogelijkheid om naar volgende pagina te gaan in zoekresultaten

In Magento 1.4.0.1 zit een bug. Hierdoor is het niet mogelijk om naar een volgende pagina in de zoekresultaten te gaan. Dit los je op de volgende manier op.

Aanpassen:
/app/design/frontend/default/THEME/layout/catalogssearch.xml

Onder <catalogsearch_result_index> 

Vind het volgende:
<block type="catalog/product_list" name="search_result_list" template="catalog/product/list.phtml"></block> 


Vervang dit met:
<block type="catalog/product_list" name="search_result_list" template="catalog/product/list.phtml"> 

<block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml">
<block type="page/html_pager" name="product_list_toolbar_pager"/>
</block>
<action method="setToolbarBlockName"><name>product_list_toolbar</name></action> 
</block>

Het zelfde doe je voor <catalogsearch_advanced_result>

Aanpassen:
/app/design/frontend/default/THEME/layout/catalog.xml

Onder <catalog_category_layered>
Zoek het volgende:
<block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml">
</block>

Vervangen door:
<block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml">
<block type="page/html_pager" name="product_list_toolbar_pager"/>
</block>

Doe dit ook voor <catalog_category_default>

Daarna zou het probleem opgelost moeten zijn en kun je gewoon door de pagina’s heenbladeren.

Magento: shop werkt niet na importeren database

Na overzetten van shop naar andere server werkt de shop niet meer

Natuurlijk zijn er veel redenen denkbaar voor dit probleem. De meest voor de hand liggende is natuurlijk de koppeling met de database.

Dit kun je eenvoudig controleren door de gegevens in app/etc/local.xml te checken.

Soms krijg je echter een melding als deze:

Notice: Undefined index:  0 in /Applications/MAMP/htdocs/thesite/app/code/core/Mage/Core/Model/Mysql4/Config.php on line 107
Trace:
#0 /Applications/MAMP/htdocs/thesite/app/code/core/Mage/Core/Model/Mysql4/Config.php(107): mageCoreErrorHandler(8, ‘Undefined index…’, ‘/Applications/M…’, 107, Array)
#1 /Applications/MAMP/htdocs/thesite/app/code/core/Mage/Core/Model/Config.php(200): Mage_Core_Model_Mysql4_Config->loadToXml(Object(Mage_Core_Model_Config))
#2 /Applications/MAMP/htdocs/thesite/app/code/core/Mage/Core/Model/App.php(208): Mage_Core_Model_Config->init(Array)
#3 /Applications/MAMP/htdocs/thesite/app/Mage.php(404): Mage_Core_Model_App->init(’’, ‘store’, Array)
#4 /Applications/MAMP/htdocs/thesite/app/Mage.php(423): Mage::app(’’, ‘store’, Array)
#5 /Applications/MAMP/htdocs/thesite/index.php(40): Mage::run()
#6 {main}

Undefined index lijkt te wijzen op het volgende probleem:

Bij exporteren moet je letten op het volgende:

Disable check foreign keys moet aangevinkt staan. Anders krijg je een probleem met de index.

Bij het importeren van de database stond auto_increment aan, waardoor bepaalde indexwaarden opgehoogd zijn. Met name de volgende:

Voer de volgende SQL code uit om het probleem met de index te corrigeren:

SET FOREIGN_KEY_CHECKS=0;
UPDATE core_store SET store_id = 0 WHERE code=’admin’;
UPDATE core_store_group SET group_id = 0 WHERE name=’Default’;
UPDATE core_website SET website_id = 0 WHERE code=’admin’;
UPDATE customer_group SET customer_group_id = 0 WHERE customer_group_code=’NOT LOGGED IN’;
SET FOREIGN_KEY_CHECKS=1;

Zoals gezegd is dit waarschijnlijk veroorzaakt door auto-increment te gebruiken bij importeren/exporteren met tools zoals phpmyadmin.

Even inloggen, gegevens aanpassen in de betreffende tabellen in de database en het probleem is verholpen.

 

Magento: filter opmaak

Het filter in Magento opmaken door er een class aan toe te voegen

Een van de mooie dingen van Magento is de mogelijkheid om te filteren op basis van attributen. Maar soms wil je dat filter een beetje mooier weergeven.

Bij het filteren op maat zie je bijvoorbeeld het volgende:

De Maat wordt als een lange rij gegevens weergegeven en dat is eigenlijk niet echt mooi. Vooral omdat er veel witruimte is aan de zijkant. Daarbij kun je  je voorstellen dat dit een erg lange lijst kan worden. Veel mooier is om het als volgt weer te geven:

Om dit te realiseren heb ik een simpele oplossing bedacht. Het is namelijk zaak om de attributen in een DIV te zetten en er een class aan toe te voegen om het te stylen.

Allereest is het zaak om filter.phtml te openen. Deze staat in dit geval onder /app/design/frontend/TEMPLATE/TEMPLATE/catalog/layer/filter.phtml

Als je de hints even aanzet kun je zien waar je het filter kunt vinden.

Vervolgens heb ik de volgende aanpassingen aangebracht(vet):
?>
<div class="omlijning">
<ol>
    <?php foreach ($this->getItems() as $_item): ?>
<div class="<?php echo $_item->getName() ?>">
           <li>
            <a href="<?php echo $this->urlEscape($_item->getUrl()) ?>" >
                <span class="count"><?php echo $_item->getCount() ?></span>
                <?php echo $_item->getLabel() ?>
            </a>
        </li>
</div>   
    <?php endforeach ?> </div>
</ol>

 

Wat gebeurt er? Er worden 2 klassen aangemaakt in dit geval, namelijk UW en MAAT. De omschrijving (getname) is namelijk Uw Maat. We gebruiken de class Maat om de boel te stylen:

.maat {
    font-size: 13px;
    display:block;
    width: 25px;
    float: left;
    border-top-width: 1px;
    border-right-width: 1px;
    border-bottom-width: 1px;
    border-left-width: 1px;
    border-top-style: solid;
    border-right-style: solid;
    border-bottom-style: solid;
    border-left-style: solid;
    padding: 2px 2px 2px 10px;
    margin: -4px 4px 8px 4px;
}

Hierna hebben we een mooi gestyled filter.

 

Magento: checkout erg traag

Trage checkout in Magento

Een veel voorkomend probleem in Magentoshops is het feit het na het plaatsen van de bestelling tergend lang duurt voordat je bij de bank komt.
Hier kunnen een aantal oorzaken voor zijn.

Om te beginnen is het goed om even te checken of de cache aanstaat en of de folders /var/cache en /var/session wel writable zijn. Zo niet, dan even zorgen dat de mappen writable zijn.

Meestal heeft het echter te maken met een bug in Magento. Deze is als volgt te fixen:

In app/code/core/Mage/Downloadable/etc/config.xml, verwijder/comment de volgende regels (maak eerst even een kopie voordat je dit doet):

<sales_order_item_save_after>
    <observers>
        <downloadable_observer>
            <class>downloadable/observer</class>
            <method>saveDownloadableOrderItem</method>
        </downloadable_observer>
    </observers>
</sales_order_item_save_after>

LET OP: deze code komt 2x voor in config.xml

In app/code/core/Mage/Rss/etc/config.xml, verwijder/comment de volgende regels (maak eerst even een kopie voordat je dit doet):

   
<sales_order_item_save_after>
    <observers>
        <notifystock>
            <class>rss/observer</class>
            <method>salesOrderItemSaveAfterNotifyStock</method>
        </notifystock>
    </observers>
</sales_order_item_save_after>
<sales_order_item_save_after>
    <observers>
        <ordernew>
            <class>rss/observer</class>
            <method>salesOrderItemSaveAfterOrderNew</method>
        </ordernew>
    </observers>
</sales_order_item_save_after>

 

LET OP: dit kan wel consequenties hebben als je downloads aanbiedt in je shop! 

Na de aanpassing zul je een dramatische verbetering in performance zijn.