Tuesday, December 8, 2015

Disable all community and local (non-core) modules in Magento

Sometimes when something is not working properly on a Magento shop, it is very useful to disable some modules, to see if one of them is causing the problem. Magento has a standard feature, that allows you to disable all the local modules, editing the local.xml, finding "<disable_local_modules>false</disable_local_modules>" and replacing false with true.

This feature is nice, but it doesn't help in two situations:
  • when you want to deactivate community modules also. In this case, you can use something as described in this blog post.
  • when you want to disable all the modules but then re-enable a few of them.
For the second situation, I wrote a simple shell script that creates a "modules deactivator" under app/etc/modules, which disables all the non-core modules. After the script finishes, you can go to this "modules deactivator" XML, and enable the modules you want, so you can test each module individually.

The script consists of two files: a bash script, and a PHP script, used to get the modules that should be deactivated.

This is the bash script:
#!/bin/sh
MODULES_DEACTIVATOR_FILE=app/etc/modules/zzzzz_DisableModules.xml
SCRIPT_FOLDER="`dirname ${BASH_SOURCE[0]}`"
PHP_BIN=php
echo "<?xml version=\"1.0\"?>" > $MODULES_DEACTIVATOR_FILE
echo "<config>" >> $MODULES_DEACTIVATOR_FILE
echo " <modules>" >> $MODULES_DEACTIVATOR_FILE
for m in $($PHP_BIN $SCRIPT_FOLDER/active_non_core_modules.php)
do
echo " <$m>" >> $MODULES_DEACTIVATOR_FILE
echo " <active>false</active>" >> $MODULES_DEACTIVATOR_FILE
echo " </$m>" >> $MODULES_DEACTIVATOR_FILE
done
echo " </modules>" >> $MODULES_DEACTIVATOR_FILE
echo "</config>" >> $MODULES_DEACTIVATOR_FILE

And this is the PHP script:
<?php
require_once('app/Mage.php');
$modules = Mage::app()->getConfig()->getNode('modules')->asCanonicalArray();
$modules = array_filter($modules, function ($module) {
return $module['codePool'] != 'core' && $module['active'] === 'true';
});
echo(implode(PHP_EOL, array_keys($modules)));

To use them, just save the two scripts in the same folder (the PHP script must be named active_non_core_modules.php), and then run the bash script, from the Magento root folder.

No comments:

Post a Comment