Dataflow Per-Store Import Causing Copy of All Attributes

Fancy importing a subset of some product attributes on a per-store basis, whilst keeping the attributes that weren't imported using the defaults?

Tough, you can't!

Well, not with dataflow anyway. This card covers how Magento handles product saves, and the dataflow product adapter 'suffers' from this issue (by the way, the adapter class is Mage_Catalog_Model_Convert_Adapter_Product in case you fancy taking a look, the parse() method is where the magic happen...

Magento Version History

Here is a table showing major changes over the Magento version history:

| CE | PE | EE | Year | Major Changes |
|-----|------|------|------|---------------------------------------------------------------------------------------------------------------------------------...

Nginx Virtual Store Subdirectories

Note - this article only applies to nginx and PHP-FPM!

If you want to have stores which are accessed via subdirectories as opposed to domain names, the standard method I've found is to make a directory with a copy of index.php in it, using one of the following approaches:

  • Leaving index.php exactly as-is, and calling fastcgi_param MAGE_RUN_CODE us; in your nginx config
  • Changing index.php to call a hardcoded string of us, either by altering the call to Mage::run(), or by setting $mageRunCode

I'm not happy with either o...

Varnish Cache Clears

Clear for an entire domain:

varnishadm "ban req.http.host == www.mydomain.com"

Clear for a URL on a domain that starts with something, or ends with something (just regex, so change as you like):

varnishadm "ban req.http.host == www.mydomain.com && req.url ~ ^/some-directory"
varnishadm "ban req.http.host == www.mydomain.com && req.url ~ .css$"

Clear for a specific URL:

varnishadm "ban req.http.host == www.mydomain.com && req.url == /some/specific/url"

Here is a nice cheatsheet for ya - [http://kly.no/varnish/regex.txt](...

Get All Children Of A Block

Sorted:

$this->getSortedChildren()

Unsorted:

$this->getChild()

Children of Anonymous Blocks are Orphaned

What a sad state of affairs. If a childs parent has no name, the child block becomes orphaned and alone, somewhere lost in Layout XML hell. To sort it, give the parent a name. The reason? The layout XML parser uses the name of the parent in XML to set the parent of the child block class instance, so if there is no name, the child is orphaned.

This won't work:

<block type="core/text_list">
    <block type="core/template" template="a/valid/template.phtml" />
</block>

This will:

<block type="core/text_list" name="whatever_th...

Cache

Here is a quick rundown of cache initialisation, from the group up.

Mage::run() or Mage::app()

    Mage_Core_Model_App::init() or Mage_Core_Model_App::baseInit()

        Mage_Core_Model_App::_initCache();

            Mage_Core_Model_Cache::__construct()

                use _getBackendOptions() and _getFrontendOptions() to sanitise options

                use Zend_Cache::factory() to get frontend and backend:

                    frontend: Varien_Cache_Core
                    backend: Zend_Cache_Backend...

Stock Availability on Credit Note, Cancellation and Payment Deny

In summary - making a credit memo can increase the stock quantity but will never set the "Stock Availability" of the product to "In Stock", whereas a config option can control whether an order cancellation sets "In Stock" automatically. Denying a payment has the same behaviour as cancelling an order. If you want everything to have the same behaviour, set the config option to not set items status to be in stock on order cancellation.

Credit Memo

When crediting a credit memo, if you choose the "Return to Stock" option, this will only inc...

local.xml Boilerplate

For when you have no local.xml:

<?xml version="1.0"?>
<!--
/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Academic Free License (AFL 3.0)
 * that is bundled with this package in the file LICENSE_AFL.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/afl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to license@m...

Import and URL Keys

Don't bother setting the url key, as this can be a tedious task in Excel, just simply import without one and reindex.

Removing Custom Attributes Across Multiple Products

If you have custom attributes named the same across multiple products, you
wish to remove said attributes, this might come in useful. The SQL below restricts
the removal of the attributes to a certain attribute set name, but you can remove
this is you want to remove custom options from all attribute sets:

DELETE o
FROM catalog_product_option o
INNER JOIN catalog_product_option_title t ON o.option_id = t.option_id
INNER JOIN catalog_product_entity p ON o.product_id = p.entity_id
INNER JOIN eav_attribute_set a ON p.attribu...

Associating An Orphan Sage Pay Suite Transaction With An Order

We had a situation whereby a client placed an order and went through Sage Pay
succesfully, however the order was not able to be created on Magento, so we had
an error stating "WARNING - There are approved Sage Pay transactions that have
no associated Magento orders. Click here to go to Orphan Transactions List".
This isn't the easiest of problems to solve, so here is how we did it:

  1. Find out the order details, this will probably mean ringing the customer and
    finding out what they ordered and where they want it delivered to.
    Alternat...

Windows Apache 2.4 VirtualHost Definition

Put this in your httpd.conf:

<VirtualHost *:80>
    DocumentRoot "C:/your/docroot"
    ServerName yourname.local
    DirectoryIndex index.php
</VirtualHost>
<Directory "C:/your/docroot">
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
</Directory>

Add Category Attributes Through SQL Updates

This is creating a module which will update categories to include new attributes.

  1. inside app/etc/modules/yourmodule.xml put the following:

     <?xml version="1.0"?>
     <config>
         <modules>
             <Yourmodule_Sql>
                 <active>true</active>
                 <codePool>local</codePool>
             <Yourmodule_Sql>
         </modules>
     </config>
    
  2. Next, inside app/code/local/Yourmodule/Sql/etc/config.xml put the following:

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

URL rewrite XML

The following remaps services/view/index/url_key/param:

<global>
    <rewrite>
        <service>
            <from><![CDATA[#^/services/(.+)#]]></from>
            <to><![CDATA[services/view/index/url_key/$1/]]></to>
            <complete>1</complete>
        </service>
    </rewrite>
</global>

Complete tag:
if set to 1 magento will use the source layout handles otherwise it will use new layout handles associated with the rewrite.

Getting The Amount Of Items in the Cart

To get the amount of line items (i.e. 10 of 1 product is 1):

Mage::helper('checkout/cart')->getItemsCount();

To get the total number of items (i.e. 10 of 1 product is 10):

Mage::helper('checkout/cart')->getSummaryCount();

Resize A Product Image

Mage::helper('catalog/image')->init($product, 'image')->resize(150);

Adding Attribute To Category List Product Collection

Only a core set of attributes are added to the product collection (for the list page) by default. This bit of XML will allow you to add additional attributes to that collection:

<config>
    <frontend>
        <product>
            <collection>
                <attributes>
                    <some_attribute/>
                </attributes>
            </collection>
        </product>
    </frontend>
</config>

![](http://mikewhitby.co.uk/makandra-track.gif?a=adding-attribute-to-category-list-produ...