Cleaning the log tables and rebuilding indexes with shell scripts

magento shells scripts usage

Based on the same idea as my “cache clearing script” (but 10x better), Magento now includes some handy scripts to clean the log tables, to compile source files and to rebuild indexes. For people with very large databases (10k+ products) this is sometimes the only way to actually accomplish something without running out of memory or exceeding execution time limits. The scripts are located in the /shell folder. These scripts are made to be run manually by logging on the server with SSH or they may also be setup to be executed periodically as a cron job.

Below, is a little preview of the possible operations

Usage: php -f log.php -- [options]
php -f log.php -- clean --days 1
clean                Clean Logs
--days <days>  Save log, days. (Minimum 1 day, if defined - ignoring system value)
status               Display statistics per log tables
help                 This help
Usage: php -f indexer.php -- [options]
--status <indexer>         Show Indexer(s) Status
--mode <indexer>           Show Indexer(s) Index Mode
--mode-realtime <indexer>  Set index mode type "Update on Save"
--mode-manual <indexer>    Set index mode type "Manual Update"
--reindex <indexer>        Reindex Data
info                       Show allowed indexers
reindexall                 Reindex Data by all indexers
help                       This help
<indexer> Comma separated indexer codes or value "all" for all indexers
Usage:  php -f compiler.php -- [options]
state         Show Compilation State
compile       Run Compilation Process
clear         Disable Compiler include path and Remove compiled files
enable        Enable Compiler include path
disable       Disable Compiler include path
help          This help

Magento Notice: Undefined index: 0

Today I got this mysterious error message after moving a Magento website to a new server.

Magento Notice: Undefined index: 0  in .../htdocs/app/code/core/Mage/Core/Model/Mysql4/Config.php on line 92

Turns out this was due to a faulty import of the database. Apparently there are a few tables where using an id of 0 in the auto_increment column has a particular meaning and is intended. When restoring the MySQL dump through Navicat it replaced id values of 0 in auto_increment columns with new auto-incremented ids instead of 0 which broke Magento.

To fix this I simply dropped the whole database and reimported the dump using the official MySQL command line client (mysql -u username -p db_name < scrip.sql) and everything worked fine.

Magento: Ultimate cache clear script

Update: If you use a recent version of Magento there might be a better solution here.

If you have been using Magento with a BIG database of products you will soon realize that the built-in “cache management” is quite limited due to the server’s usual time limit on requests. You just can’t refresh your catalog rewrites on 5000 products in less then a good 5 minutes and the other functions might give you the same problems as well.

By extracting the code from the cache management controller I was able to build a custom script that can be called via command line on the server and that will allow you to do a full cache refresh without any kind of time limit or connection timeout issues. The only requirement is shell access to your website files by SSH, Telnet or a terminal of some sort.

Continue reading “Magento: Ultimate cache clear script”

Magento: How to change the admin theme

So you want to use Magento for your company and now you have to change the look of the backend. Of course you don’t want to change the default Magento adminhtml theme and kill any chances of upgrading your templates later on. So thats where this post comes into play. ;)

Theres an easy way to add your own theme folder and use it to customize the look of your admin control panel. All files that aren’t included in your theme will fall back to the default Magento theme, thus avoiding any problems with missing templates and making it a lot easier to change only a few files.

Add a new adminhtml theme

Start by adding a new folder inside the app/design/adminhtml/default folder. To start out, the folder should also contain one sub-folders called template.

So, for example, you add a folder called mytheme, and inside it you add another folder called template.

Overriding Magento configuration

All you have to do is add a new config.xml file inside app/code/local/MyCompany/Adminhtml/etc. Add the following code inside the file:

Note: if you created this file by following one of my earlier guides you don’t have to create it again and you would simply add the <stores> section at the appropriate location inside the existing file.
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <MyCompany_Adminhtml>
            <version>0.1.1</version>
        </MyCompany_Adminhtml>
    </modules>
    <stores>
        <admin>
            <!-- override default admin design package and theme -->
            <design>
                <package>
                    <name>default</name>
                </package>
                <theme>
                    <default>mytheme</default>
                </theme>
            </design>
        </admin>
    </stores>
</config>

You will also have to tell Magento about this new module in an XML file placed inside /app/etc/modules. This file could be called MyCompany.xml and inside you would copy/paste:

Note: if you created this file by following one of my earlier guides you don’t have to create it again.
<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <MyCompany_Adminhtml>
	    <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Adminhtml />
            </depends>
        </MyCompany_Adminhtml>
    </modules>
</config>

Changing template files

Now to change the default Magento templates you basically copy the .phtml files from the app/design/adminhtml/default/default/template folder into your own template folder and change the contents of the .phtml file to suit your needs.

For example, if you want to change the login box and remove the Magento copyright message:

Copy app/design/adminhtml/default/default/template/login.phml into the app/design/adminhtml/default/mytheme/template folder and then change the <p class=”legal”></p> to put your own legal note.

Magento: How to disable update notifications

A short tutorial on how to block the “New Magento Version” notifications in the Magento admin without modifying the core packages.

Create a new package under app/code/local , for this example lets make a “MyCompany” package. If you already have an existing package for your magento mods you can use that one but you will have to change all references to MyCompany in the following code.

Create folder app/code/local/MyCompany

Create a new module called “Adminhtml” containing a “Block” folder and a “etc” folder.

Create folder app/code/local/MyCompany/Adminhtml
Create folder app/code/local/MyCompany/Adminhtml/Block
Create folder app/code/local/MyCompany/Adminhtml/etc

Add a “Notification” folder inside the Block folder.

Create folder app/code/local/MyCompany/Adminhtml/Block/Notification

Create Toolbar.php inside the MyCompany/Block/Notification folder.

<?php
/**
 * Block all notifications
 */
class MyCompany_Adminhtml_Block_Notification_Toolbar extends Mage_Adminhtml_Block_Template
{
    public function isShow()
    {
	return false;
    }

    public function isMessageWindowAvailable()
    {
        return false;
    }
}

Create Window.php inside the MyCompany/Adminhtml/Block/Notification folder.

<?php
/**
 * Prevent popup window
 */
class MyCompany_Adminhtml_Block_Notification_Window extends Mage_Adminhtml_Block_Notification_Window
{
    public function canShow()
    {
        return false;
    }
}

Create config.xml file inside the MyCompany/Adminhtml/etc folder

<?xml version="1.0" encoding="UTF-8"?>

<config>

    <modules>
        <MyCompany_Adminhtml>
            <version>0.1.0</version>
        </MyCompany_Adminhtml>
    </modules>

    <global>

        <blocks>
          <adminhtml>
              <rewrite>
             	  <notification_window>MyCompany_Adminhtml_Block_Notification_Window</notification_window>
		  <notification_toolbar>MyCompany_Adminhtml_Block_Notification_Toolbar</notification_toolbar>
              </rewrite>
          </adminhtml>
        </blocks>

    </global>

</config>

Last but not least, you have to create a new Modules XML file to load your module. Create MyCompany.xml inside the app/etc/modules folder.

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <MyCompany_Adminhtml>
	    <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Adminhtml />
            </depends>
        </MyCompany_Adminhtml>
    </modules>
</config>