Setting environment variables for your Magento store through .htaccess

Once in a while i get the question, Martijn how can we select a storeview without editting the index.php file, as Magento is prepared for this?!

Well, the Magento index.php file is indeed prepared for this. The full Magento index.php for releases 1.4.2.0 and later is as below.

<?php
/**
* Magento
*
* NOTICE OF LICENSE
*
* This source file is subject to the Open Software License (OSL 3.0)
* that is bundled with this package in the file LICENSE.txt.
* It is also available through the world-wide-web at this URL:
* http://opensource.org/licenses/osl-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@magentocommerce.com so we can send you a copy immediately.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade Magento to newer
* versions in the future. If you wish to customize Magento for your
* needs please refer to http://www.magentocommerce.com for more information.
*
* @category   Mage
* @package    Mage
* @copyright  Copyright (c) 2008 Irubin Consulting Inc. DBA Varien (http://www.varien.com)
* @license    http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
*/

if (version_compare(phpversion(), '5.2.0', '<')===true) {
    echo  '<div style="font:12px/1.35em arial, helvetica, sans-serif;"><div style="margin:0 0 25px 0; border-bottom:1px solid #ccc;"><h3 style="margin:0; font-size:1.7em; font-weight:normal; text-transform:none; text-align:left; color:#2f2f2f;">Whoops, it looks like you have an invalid PHP version.</h3></div><p>Magento supports PHP 5.2.0 or newer. <a href="http://www.magentocommerce.com/install" target="">Find out</a> how to install</a> Magento using PHP-CGI as a work-around.</p></div>';
    exit;
}

/**
* Error reporting
*/
error_reporting(E_ALL | E_STRICT);

/**
* Compilation includes configuration file
*/
$compilerConfig = 'includes/config.php';
if (file_exists($compilerConfig)) {
    include $compilerConfig;
}

$mageFilename = 'app/Mage.php';
$maintenanceFile = 'maintenance.flag';

if (!file_exists($mageFilename)) {
    if (is_dir('downloader')) {
        header("Location: downloader");
    } else {
        echo $mageFilename." was not found";
    }
    exit;
}

if (file_exists($maintenanceFile)) {
    include_once dirname(__FILE__) . '/errors/503.php';
    exit;
}

require_once $mageFilename;

#Varien_Profiler::enable();

if (isset($_SERVER['MAGE_IS_DEVELOPER_MODE'])) {
    Mage::setIsDeveloperMode(true);
}

#ini_set('display_errors', 1);

umask(0);

/* Store or website code */
$mageRunCode = isset($_SERVER['MAGE_RUN_CODE']) ? $_SERVER['MAGE_RUN_CODE'] : '';

/* Run store or run website */
$mageRunType = isset($_SERVER['MAGE_RUN_TYPE']) ? $_SERVER['MAGE_RUN_TYPE'] : 'store';

Mage::run($mageRunCode, $mageRunType);

On lines 66 you will find a conditional test that would allow you to turn on the Magento Developer-mode. On lines 75 and 78 you will see how the $mageRunCode and $mageRunType is populated by server values.

All three values can be set from the .htaccess files or vhost configurations of your server with the code below.

### Setting environment variables for your Magento store.
SetEnvIf Remote_Addr "your.ip.address.here" MAGE_IS_DEVELOPER_MODE=TRUE
SetEnvIf Host "your.domain.here" MAGE_RUN_CODE=storeview_code

### Next line is important for multi language stores on the same domain.
### When running multiple languages on one domain, the storeview code is
### stored in the frontend cookie. Without this line, your store would
### default back to the storeview set above
SetEnvIfNoCase ^Cookie$ "frontend=(.+)" MAGE_RUN_CODE=

With the code at line 2, you can turn on the developer mode for only the specified ip address. The code at line 3 allows you to set a specific storeview-code to be used while executing the Magento web-app.

However, setting always a specific storeview-code is a bad idea. In multilingual stores you could make it default back to the default language all the time. Therefor i recommend not to set a storeview if a cookie is set with a frontend-id.

I hope this is useful for all the Magento Developers out there. If you like my articles, please spread the word using the Tweet button or the Facebook-‘Recommend’-button.

By the way, don’t forget that Magento redirects by default to your base url. So be aware that you need to set this storeview url for a second store in the General Web section of the System config

.

Magento Currency Importer

Recently I walked in to a new challenge. A customer needed to import the exchange rates provided by the European Central Bank (ECB).

As each Magento store builder knows, Magento only works with one webservice by default and that one is www.webservicex.net.

On the Magento website their is a wiki-page written about how to extend and implement Yahoo Finance, but the guide is pretty broken. And as I needed the rates from the ECB, I decided to build this in to a small module which I also would release on Magento Connect.

My Currency Importer can be found in the Magento Connect database. I would appreciate a positive feedback if it works for you. If things don’t work, please contact me by leaving a message on Connect or below in the comments (if still open).

The Currency Importer allows you to use ECB or Yahoo Finance for now. ECB has a limited exchange rate set.

Magento Sample Module

Recently on Freenode someone asked me wether i have a small sample module of a Magento module. Attached you can find an older (1.4.x.x) Sample module with the directory structure of a Magento module.

The required module.xml and config.xml’s are present. Extend where needed with your own setup scripts and classes.

Magento Sample Module