Posting in the Magento forums has been disabled pending the implementation of a new and improved forum solution which should better serve the community.

For new questions please post at magento.stackexchange.com, the community-run support site for the Magento community. We will be providing updates on the new forum solution soon. For questions or concerns please email community@magento.com.

Magento Forum

Créer mes propres modules / fonctions / méthodes
 
Herve Guetin
Sr. Member
 
Avatar
Total Posts:  216
Joined:  2008-05-10
Lyon, FR
 

Hello,

D’abord : désolé pour la terminologie ci-après qui n’est certainement pas la bonne.
Même si le topic paraît long, je pense que la réponse est simple !

> Mon idée : afficher au panier une mention qui dit “il vous reste X€ à dépenser pour avoir le port offert”.

- Ok pour créer un phtml appelé par checkout.xml :

<block type="core/template" name="checkout.cart.port" as="port" template="checkout/cart/port.phtml"/>

- Ok pour l’appeler dans cart.phtml avec

getChild('port')

- Mais, dans le fichier port.html, j’ai besoin d’utiliser la fonction getTotal()->getValue() également présente dans template/checkout/cart/total/default.phtml pour déterminer le montant que mon client doit encore payer pour avoir la livraison offerte :

montant restant = montant pour livraison offerte - montant total déjà au panier (çàd : getTotal()->getValue())

Ben çà marche pas car, j’imagine, il n’y a pas de fichier .php associé à port.phtml et Magento ne trouve pas les fonctions.

Le fichier code/core/Mage/Checkout/Block/Cart/Totals.php permet de générer les montants totaux. J’ai donc copié/collé son contenu dans un fichier Port.php que j’ai placé dans le même rep.

Ben çà marche toujours pas.

> Ma question : comment dire à Magento d’aller chercher un .php que je crée moi-même ? J’ai bien réussi à ajouter des fonctions dans des .php existant… smile

Merci pour vos réponses qui seront très utiles car répondre à ce cas précis me permettra d’envisager des fonctionnalités à ajouter sur mon site et également de m’auto-répondre sur le sujet des cadeaux offerts aux clients (voir le thread ici).

 
Magento Community Magento Community
Magento Community
Magento Community
 
neuro
Sr. Member
 
Avatar
Total Posts:  104
Joined:  2008-09-29
France
 

Je suppose que tu connais include(), require(), require_once(), include_once(), get_included_files(), readfile(), virtual() et include_path mais je te le dis au cas ou; sans quoi -> php.net, désolé de pas pouvoir t’aider plus :/

 
Magento Community Magento Community
Magento Community
Magento Community
 
SeL_
Magento Team
 
Avatar
Total Posts:  1140
Joined:  2007-10-10
Paris, France
 

Bonjour,

Quand tu définis un block dans ton fichier xml avec le code :

<block type="core/template" name="checkout.cart.port" as="port" template="checkout/cart/port.phtml"/>
ça signifie que tu choisis d’utiliser le block Core/Block/Template.php.
C’est l’attribut type qui définit ça :
type="core/template"

Donc, si tu souhaites appeler le block Checkout/Block/Cart/Totals.php, il faut configurer :

type="checkout/cart_totals"
Le “checkout” indique le module, puis on met un slash ("/"), puis on met la liste des répertoires permettant d’accéder au fichier block (Checkout/Block/Cart/Totals.php) en ignorant le répertoire Block (et tout en minuscule, séparés par des underscores).

Rappel : ne pas faire de modifs dans les fichiers du core de Magento, sinon tu perdras tout lors de la prochaine mise à jour.

 
Magento Community Magento Community
Magento Community
Magento Community
 
neuro
Sr. Member
 
Avatar
Total Posts:  104
Joined:  2008-09-29
France
 

Merci pour moi en tout cas :)

 
Magento Community Magento Community
Magento Community
Magento Community
 
Herve Guetin
Sr. Member
 
Avatar
Total Posts:  216
Joined:  2008-05-10
Lyon, FR
 

Bon, tout çà à l’air de marcher. Merci ! Je vais maintenant tenter d’appeler les fonctions en question dans mon nouveau fichier .php et là je serai fixé.

 
Magento Community Magento Community
Magento Community
Magento Community
 
obione
Sr. Member
 
Avatar
Total Posts:  84
Joined:  2008-06-11
France
 
VR... - 30 October 2008 09:53 AM

Bon, tout çà à l’air de marcher. Merci ! Je vais maintenant tenter d’appeler les fonctions en question dans mon nouveau fichier .php et là je serai fixé.

Si ton développement fonctionne, je suis intéressé par ta méthode.

 
Magento Community Magento Community
Magento Community
Magento Community
 
Herve Guetin
Sr. Member
 
Avatar
Total Posts:  216
Joined:  2008-05-10
Lyon, FR
 

Après quelques essais, j’ai réussi mais je ne garantis pas que ce que je propose soit optimisé !

Dans le fichier template/checkout/cart.phtml
J’ai ajouté la ligne

<?php echo $this->getChildHtml('port'?>
pour appeler la page “port.phtml”

Dans le dossier template/checkout/cart/

J’ai ajouté un fichier nommé port.html et qui contient le code :
<?php
echo $this->renderTotals('footer');
?>
Dans le dossier template/checkout/
J’ai ajouté un dossier port/ dans lequel j’ai placé un fichier nommé default.phtml
Ce fichier contient le code permettant d’afficher l’info que je veux dans mon module “port” et fait donc appel aux css nouvellement créées (.free-shipping, not-reached, .reached). A vous de faire les vôtres !
Le voici pour exemple :
<?php
    $montantPortOffert 
100/*Cart total amount to reach to get free shipping*/
    
$montantComplementPlancher 25/*Value from which we display the message in order not to display too high amounts*/
    
$grandTotal $this->getTotal()->getValue();
    
$complementPanier $montantPortOffert-$grandTotal/*Amount remaining to buy to get free shipping */
?>
<?php 
if($complementPanier <= $montantComplementPlancher && $grandTotal $montantPortOffert): ?>
    
<div class="box free-shipping">
        <
div class="not-reached">
            
<?php echo $this->__('Continue shopping for') . '&nbsp;' Mage::helper('core')->currency($complementPanier) . '&nbsp;' $this->__('to get free shipping!'); ?>
        
</div>
    </
div>
<?php endif; ?>

<?php 
if($grandTotal >= $montantPortOffert): ?>
    
<div class="box free-shipping">
        <
div class="reached">
            
<?php echo $this->__('Shipping is free for your order!'); ?>
        
</div>
    </
div>
<?php endif; ?>
Dans le dossier locale/fr_FR
J’ai créé un fichier Mage_Port.csv contenant les traductions :
"Continue shopping for","Compléter votre panier avec "
"to get free shipping!"
,"pour profiter de la livraison offerte."

Dans le fichier layout/checkout.xml
J’ai appelé mon module “port” dans le handle ‘default’

<block type="checkout/cart_port" name="checkout.cart.port" as="port" template="checkout/cart/port.phtml"/>

Créer le répertoire :
code/local/Mage/Checkout/Block/Port/ et y placer un fichier nommé Default.php et contenant le code suivant :

class Mage_Checkout_Block_Port_Default extends Mage_Core_Block_Template
{
    
protected $_template 'checkout/port/default.phtml';

    protected function 
_construct(){
        $this
->setTemplate($this->_template);
    
}
}
Créer le répertoire :
code/local/Mage/Checkout/Block/Cart/ et y placer un fichier nommé Port.php et contenant le code suivant :
class Mage_Checkout_Block_Cart_Port extends Mage_Checkout_Block_Cart_Abstract
{
    
protected $_totalrendererPort;
    protected 
$_defaultrendererPort 'checkout/port_default';

    protected 
$_totals null;

    public function 
getTotals()
    
{
        
if (is_null($this->_totals)) {
            
return parent::getTotals();
        
}
        
return $this->_totals;
    
}

    
public function setTotals($value)
    
{
        $this
->_totals $value;
        return 
$this;
    
}

    
protected function _getTotalrendererPort($code)
    
{
        
if (!isset($this->_totalrendererPort[$code])) {
            $this
->_totalrendererPort[$code] $this->_defaultrendererPort;
            
$config Mage::getConfig()->getNode("global/sales/quote/totals/{$code}/rendererPort");
            if (
$config)
                
$this->_totalrendererPort[$code] = (string) $config;

            
$this->_totalrendererPort[$code] $this->getLayout()->createBlock($this->_totalrendererPort[$code]"{$code}_total_rendererPort");
        
}

        
return $this->_totalrendererPort[$code];
    
}

    
public function renderTotal($total$area null$colspan 1)
    
{
        
return $this->_getTotalrendererPort($total->getCode())
            ->
setTotal($total)
            ->
setColspan($colspan)
            ->
setRenderingArea(is_null($area) ? -$area)
            ->
toHtml();
    
}

    
public function renderTotals($area null$colspan 1)
    
{
        $html 
'';

        foreach(
$this->getTotals() as $total{
            
if ($total->getArea() != $area && $area != -1{
                
continue;
            
}

            $html 
.= $this->renderTotal($total$area$colspan);
        
}

        
return $html;
    
}
}

IMPORTANT
Ne pas oublier de rafraîchir le cache, écritures catalogue, etc… dans le BO.

 
Magento Community Magento Community
Magento Community
Magento Community
 
SeL_
Magento Team
 
Avatar
Total Posts:  1140
Joined:  2007-10-10
Paris, France
 

Bravo !

Juste une petite suggestion d’amélioration : Il est possible d’ajouter un texte au milieu d’un libellé à traduire.
Par exemple, dans ton cas, tu aurais un seul libellé au lieu de 2 pour la phrase “Compléter votre panier avec [...] pour profiter de la livraison offerte.”
Il faut pour cela utiliser un libellé comme ça : “Compléter votre panier avec %s pour profiter de la livraison offerte.”
Et en remplaçant

<?php echo $this->__('Continue shopping for') . '&nbsp;' Mage::helper('core')->currency($complementPanier) . '&nbsp;' $this->__('to get free shipping!'); ?>
par
<?php echo $this->__('Continue shopping for %s to get free shipping!'Mage::helper('core')->currency($complementPanier)); ?>

Et pourquoi pas créer une petite extension Magento Connect ? smile

 
Magento Community Magento Community
Magento Community
Magento Community
 
visual concept
Jr. Member
 
Total Posts:  10
Joined:  2008-09-03
 

Comment faire pour gérer la configuration de ton module dans l’admin de magento?

 
Magento Community Magento Community
Magento Community
Magento Community
 
Herve Guetin
Sr. Member
 
Avatar
Total Posts:  216
Joined:  2008-05-10
Lyon, FR
 

Hello,

Ce module n’est pas un vrai “module”. Il n’est effectivement pas (pour l’instant) implémenté dans le back-office.
C’est quelque-chose que je dois apprendre à faire afin de renseigner les variables dans le back-office et que le PHP aille les chercher pour activer ou non le port offert.
Les variables sont toutefois modifiables directement dans le PHTML (template/.../checkout/port.phtml dont je parle dans le post au-dessus) :

<?php
    $montantPortOffert 
100/*Cart total amount to reach to get free shipping*/
    
$montantComplementPlancher 25/*Value from which we display the message in order not to display too high amounts*/
    
$grandTotal $this->getTotal()->getValue();
    
$complementPanier $montantPortOffert-$grandTotal/*Amount remaining to buy to get free shipping */
?>

- $montantPortOffert : montant à atteindre par le client pour profiter du port offert
- $montantComplementPlancher : est le montant “reste à acheter pour profiter du port offert” plancher pour que le message “il vous reste… à acheter” s’affiche. En gros et pour caricaturer : s’il reste 500 euros à acheter pour profiter du port offert, on évite de l’afficher… çà fait un peu tiré par les cheveux. Dans mon exemple, j’ai mis 25. Ainsi, le message s’affiche s’il reste 25 euros ou moins à acheter pour profiter du port offert.
- $grandTotal : le montant du panier
- $complementPanier : le montant restant à acheter pour profiter du port offert.

Voilà, en attendant que je fasses des progrès pour en faire un vrai module smile

 
Magento Community Magento Community
Magento Community
Magento Community
 
SeL_
Magento Team
 
Avatar
Total Posts:  1140
Joined:  2007-10-10
Paris, France
 

@VR…
Pour la création d’une extension Magento Connect, il y a un tuto :
http://www.magentocommerce.com/wiki/packaging_a_magento_extension

Pour ajouter du paramétrage dans le back office, je te conseille de regarder des modules simples comme Mage_Contacts
Regarde les fichiers :
- etc/config.xml pour la configuration par défaut
- etc/system.xml pour afficher des menus et paramètres supplémentaires dans le back office.
- dans Helper/Data.php : un exemple de récupération du paramétrage pour le store : Mage::getStoreConfig( self::XML_PATH_ENABLED );

Bon courage !

 
Magento Community Magento Community
Magento Community
Magento Community
 
Phidias
Jr. Member
 
Total Posts:  2
Joined:  2009-07-16
 

Hello,

Je n’arrive pas à trouver l’extension Magento connect en question. Quelqu’un peut m’orienter ? Merci.

 
Magento Community Magento Community
Magento Community
Magento Community
 
Pierre_FAY
Jr. Member
 
Total Posts:  24
Joined:  2009-07-29
Lille, France
 

J’ai créer un Tutoriel parce que j’étais en galére pour trouver de la doc moi aussi quand j’ai commencé a développer sous Magento, tu peux aller voir ce tutoriel si tu veux. J’ai essayé de faire au plus simple.

Bon courrage,

Pierre FAY

 
Magento Community Magento Community
Magento Community
Magento Community
 
zmove
Guru
 
Total Posts:  317
Joined:  2008-04-30
 

Il y a un problème avec cette méthode

$grandTotal = $this->getTotal()->getValue();

Si il y a une estimation des frais de livraison, le grand total le prends en compte.

Or, c’est idiot d’avoir ce genre de calcul

$montantPortOffert = 60;

- Sous total : 50€
- Frais de port : 10€
- Grand total : 60€

Eh bien le bloc pour frais de port gratuits s’affichera alors que c’est grace aux frais de port de 10€ que le montant est atteint.

Bref, il faudrait avoir le grand total mais en enlevant les frais de port.

Mon problème est que toutes les méthodes que je peux trouver permettent d’obtenir les frais de port HT.

Or, j’aimerais offerir les frais de port a partir de 60€ TTC (comme un peu tout le monde en fait, j’imagine mal faire ce genre de discours marketing en se basant sur le HT) (Sauf si c’est du B2B).

J’ai donc besoin de récupérer les frais de port TTC, mais je n’y arrive pas. Quelqu’un à une idée ?

Cordialement,

Alex

 
Magento Community Magento Community
Magento Community
Magento Community
 
arnauddevass
Jr. Member
 
Total Posts:  7
Joined:  2012-05-16
 

Bonjour Mogalupa,

Pourrais-tu me dire à quoi servent les deux fichiers php?

Merci d\’avance!

 
Magento Community Magento Community
Magento Community
Magento Community
Magento Community
Magento Community
Back to top