Jacques Bodin-Hullin Développeur d'applications Web

La perfection est atteinte non quand il ne reste rien à ajouter, mais quand il ne reste rien à enlever.

Antoine de Saint Exupéry

Les scripts Magento

Nous sommes tous confrontés à un moment ou à un autre à devoir palier un problème rapidement sur un site en production.

Le problème le plus souvent doit se régler avec un script shell. Un script shell ok... mais en PHP ! Hors de question de se taper le script bash/python ou autre alors qu'on a besoin de charger Magento, d'accéder à la base etc.

Et surtout... il faut bien l'avouer, pouvoir accéder à la config, aux modèles et autres collections... bah c'est quand même bien pratique !


Tout d'abord il faut déterminer un endroit où nous pouvons stocker nos scripts...

J'ai pour habitude de faire un répertoire /misc. Alors je vais la garder et c'est dans ce répertoire que nous allons créer nos fichiers.

$ mkdir misc
$ vim misc/change_admin_password.php

Tant qu'à faire... autant réaliser un script pratique :)

On commence donc par charger Magento :

<?php

// Mage ! require_once DIR . '/../app/Mage.php';

// Init Magento Mage::app('admin');

// Init store (needed for save products for example) Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);

Peut-être qu'avant ça il serait préférable de tester la validiter de notre ligne de commande ?

<?php

// Usage function :) function usage() { echo "Usage: php -f " . basename(FILE) . " <username>\n"; exit(65); }

// Check command line if ($argc != 2) { usage(); }

Une fois qu'on a notre utilisateur, on le charge et on vérifie qu'il existe bien :

<?php

// We get the user $user = Mage::getModel('admin/user')->load($argv[1], 'username');

// User exists? if (!$user->getId()) { echo "Bad username.\n\n"; usage(); }

Ensuite on demande le mot de passe et on met à jour l'utilisateur :

<?php

// We ask for the password do { echo "Which password? "; $password = trim(fgets(STDIN)); } while (!$password);

// We change the user password :) $user->setNewPassword($password)->save();

echo "User updated\n";

exit(0);

On exécute :

$ php misc/change_admin_password.php jacques
Which password? monSuperPassword      
User updated
$

Voilà ce que ça donne :

<?php
declare(ticks = 1);
// Mage !
require_once __DIR__ . '/../app/Mage.php';
// Usage function :)
function usage()
{
echo "Usage: php -f " . basename(__FILE__) . " <username>\n";
exit(65);
}
// Check command line
if ($argc != 2) {
usage();
}
// Init Magento
Mage::app('admin');
// Init store (needed for save products for example)
Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
// We get the user
$user = Mage::getModel('admin/user')->load($argv[1], 'username');
// User exists?
if (!$user->getId()) {
echo "Bad username.\n\n";
usage();
}
// We ask for the password
do {
$password = trim(readline('Wich password?'));
} while (!$password);
// We change the user password :)
$user->setNewPassword($password)->save();
echo "User updated\n";
exit(0);

Sauf qu'on a un problème... Là le script est super simple.

Et pour régler votre urgence vous avez besoin de vous mettre dans un environnement de "setup". En gros vous voulez être comme dans le fameux mysql4-install-0.1.0.php ;)

Pour récupérer un setup de l'EAV par exemple (pour pouvoir faire des getAttributeId) :

<?php
$setup = Mage::getModel('eav/entity_setup', 'eav');

// Op le SQL ! // $setup->run($sql);

Pour récupérer une connection et une ressource :

<?php
$res = Mage::getSingleton('core/resource');
$cn = $res->getConnection('core_write');

// Nom d'une table ? // $res->getTableName('foo'); // Un select ? (Zend_Db_Select) // $select = $cn->select();

Voilà, à vous de jouer ! Et n'hésitez pas à partager vos scripts dans les commentaires, c'est toujours bon à prendre :)


Commentaires

blog comments powered by Disqus

Quelques infos

Contact

Mon QRcode

le QRcode

Un projet, Une agence

Monsieur Biz, une agence spécialisée Magento pour votre projet.

C'est par ici que ça se passe !