Affichage des articles dont le libellé est Php. Afficher tous les articles
Affichage des articles dont le libellé est Php. Afficher tous les articles

vendredi 20 avril 2012

Problème d'installation d'un module Prestashop

Aujourd'hui, j'ai du installer quelques modules pour Prestashop, dont certains modifiés par mes soins au préalable. Lors de mes tests, l'installation s'était déroulée sans problème. Cependant, comme une mise en production ne se déroule jamais comme prévu, un de mes modules a refusé de s'installer. Après plus d'une  heure de recherche (problème de copie, erreur PHP, problème de nom de fichier, ...) j'ai fini par trouver l'origine du problème.

Problème: un module Prestashop refuse de s'installer.

Cause: la fonction d'installation du module crée un nouveau hook dans la base de données. Cependant, comme il s'agit d'un module existant modifié, le hook existe déjà. Il n'est donc pas possible d'ajouter le hook.

Solution: modifier la fonction d'installation afin d'appeler la fonction de désinstallation avant d'installer le module.

mardi 17 avril 2012

Héritage PHP

Je travaille actuellement avec Prestashop, et pour les besoins d'un client, je m'occupe de surcharger certaines classes et certains controllers.

Dans l'un des controllers, j'ai était confronté à un problème que je n'avais encore jamais eu: appeler une fonction dans une classe ancêtre, sans passer par le parent... Le tout, sans modifier ni le parent, ni l'ancêtre.

Un peu de mal à comprendre ? Utilisons un exemple: imaginons que l'on ait trois classes: A, B et C. Les classes A et B ne peuvent être modifiées. La classe C hérite obligatoirement de B.


class A {    
    public function fct($param) {
        $result = $param + $param;
        return $result;
    }
}

class B extends A {
    public function fct($param) {
        $result = parent::fct($param);
        return $result + $param;
    }
}

class C extends B {
    public function fct($param) {
        // Doit retourner ($param + $param) * $param; // C'est-à-dire fct($param) dans A, * $param
    }
}

Problème: appeler la fonction fct de la classe A, sans passer par la classe B.

Solution: PHP est génial! C'est prévu dans la version 5.3.2. Il faut juste mettre le nom de la classe avant d'appeler le parent.


class C extends B {
    public function fct($param) {
        $result = A::fct($param);
        return $result * $param;
    }
}

Et voilà: on bypass la classe B aussi simplement que ça !