RSS
 

Archives de la catégorie ‘Magento’

Problème de titre de page « identifiant client »

05 avr

J’ai un soucis avec mes titres de pages, ils sont tous identiques « identifiant client ».
Ce problème est survenu après avoir mis un formulaire d’identification :

<block type="customer/form_login" name="mini_login" template="customer/form/mini.login.phtml" />

Remplacé dans app/code/core/Mage/Customer/Block/Form/Login.php

Ligne 40

 {
 $this->getLayout()->getBlock('head')->setTitle(Mage::helper('customer')->__('Customer Login'));
 return parent::_prepareLayout();
}

Remplacé par :

 {
 $this->getLayout()->getBlock('head');
 return parent::_prepareLayout();
 }

La balise TITLE reprend bien celle des CMS, catégories, produits, etc …

 
 

Récupérer les infos du magasin

01 avr

Get store data
Mage::app()->getStore();

Store Id
Mage::app()->getStore()->getStoreId();

Store code
Mage::app()->getStore()->getCode();

Website Id
Mage::app()->getStore()->getWebsiteId();

Store Name
Mage::app()->getStore()->getName();

Is Active
Mage::app()->getStore()->getIsActive();

Store Home Url
Mage::app()->getStore()->getHomeUrl();

 
 

Navigation par filtre sur toutes les pages

27 juin

Je veux avoir une navigation par filtre sur toutes les pages de mon site.
Je veux filtrer distinctement les résultats de mes catégories et sur les autres pages, je renvoie la requête de filtre vers la page de résultat de recherche avancée.

1- Modifier tout le fichier : catalog/layout/filter.phtml avec le code suivant :

<?php
//contrôler la façon dont la navigation des attributs se présentent
//liste déroulante , soit par défaut ou méthode ( liste ordonnée )
$attributeName = $this->getName();
$itemcountthreshold = 120;
$itemcount = $this->getItemsCount();
$displayitemcount = true; //mettre true/falsepour afficher le nombres d'articles par attribut filtrer

if($itemcount > $itemcountthreshold){
$attributeName = "Overthreshold";
}

if(!function_exists("_displayOrderedlist")){
function _displayOrderedlist($atts,$displayitemcount){
echo '<ol>';
foreach($atts->getItems() as $_item){
echo '<li><a href="'.$_item->getUrl().'">'.$_item->getLabel().'</a>';
if($displayitemcount){
echo ' ('.$_item->getCount().')';
}
echo '</li>';
}
echo '</ol>';
}
}
if(!function_exists("_displayDropdown")){
function _displayDropdown($atts,$displayitemcount){
echo '<select id="layered-select" name="layered-select" onchange="if (this.selectedIndex > 0) location.href=this[this.selectedIndex].value;">';
echo '<option selected="selected">'.$atts->getName().'</option>';
foreach ($atts->getItems() as $_item){
echo '<option value="'.$_item->getUrl().'">';
echo $_item->getLabel();
if($displayitemcount){
echo ' ('.$_item->getCount().')';
}
echo '</option>';
}
echo '</select>';
}
}

switch ($attributeName) {
case 'Marque':        //mettre ici les labels des attributs filtrable
case 'Carrosserie':
case 'Modèle':
case 'Energie':
case 'Transmission':
case 'Prix':
_displayDropdown($this,$displayitemcount);
break;

default:
_displayOrderedlist($this,$displayitemcount);
break;
}    

?>


2-Enregistrer le fichier
catalog/layout/view.phtml sous homeview.phtml
Ce fichier servira pour toutes les pages de mon site (hors pages de listing des catégories)
Ce fichier renvoi les requêtes du filtre vers la page de résultat des recherches : http://www.monsite/catalogsearch/advanced/result

remplacer :

<?php echo $_filter->getHtml() ?>

par

 <?php echo str_replace("http://".$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'],"http://webstore.lavillauroy.fr/catalogsearch/advanced/result",$_filter->getHtml()); ?>

Cette fonction remplace l’url de la page active par celle de la page de résultats de recherche et ajoute à l’url le filtre de recherche.

3- J’applique le filtre sur les pages de tout le catalogue :
Dans app/design/frontend/default/default/layout/catalog.xml
J’ajoute entre les balises <!– Default layout, loads most of the pages–> :

<reference name="left">
<block type="catalog/layer_view" name="catalog.leftnav" after="-" template="catalog/layer/homeview.phtml"/>
</reference>

Entre les balises<!–Category layered navigation layout–>

<reference name="left">
<remove name="catalog.leftnav" />            <!-- On désinstalle le filtre pour tout le site au profit de celui pour les catégories -->
<block type="catalog/layer_view" name="category.leftnav" after="-" template="catalog/layer/view.phtml"/>
</reference>

4- J’ajoute le filtre dans le fichier app/design/frontend/default/default/layout/catalogsearch.xml
Entre les balises <catalogsearch_result_index> … </catalogsearch_result_index>
!!!! Je met bien le fichier homeview.html car on ne change pas l’url de résultat de filtre…

<reference name="left">
<block type="catalog/layer_view" name="catalog.leftnav" after="-" template="catalog/layer/homeview.phtml"/>
</reference>

Entre les balises <catalogsearch_advanced_index> … </catalogsearch_advanced_index>

<reference name="left">
<remove name="catalog.leftnav" />            <!-- On désinstalle le filtre pour tout le site au profit de celui pour les catégories -->
<block type="catalog/layer_view" name="category.leftnav" after="-" template="catalog/layer/view.phtml"/>
</reference>

5- J’ajoute le filtre sur les pages des catégories du site. Dans l’admin : Catalogue/Gérer les catégories ,  onglet Design personnalisé/Mise à jour d’agencement :

<reference name="left">
<action method="unsetChild"><name>catalog.leftnav</name></action>        <!-- On désinstalle le filtre pour tout le site au profit de celui pour les catégories -->
<block type="catalog/layer_view" name="category.leftnav" after="-" template="catalog/layer/view.phtml"/>
</reference>
 
1 commentaire

Classé dans Magento

 

Catégorie accessible uniquement aux professionnels

27 juin

Ce code permet de masquer une catégorie de produits (nommée espace-pro) aux clients généraux.
Cette partie est accessible aux utilisateurs appartenant au groupe PRO.

1- Modifier le fichier catalog/product/list.phtml, en insérant au début du fichier le code suivant :

<?php
$_isLoggedIn = $this->helper('customer')->isLoggedIn();                    // Vérification si client logué
$_isPro= Mage::getSingleton('customer/session')->getCustomerGroupId();    // Récupération de l'ID du groupe client
$_PageCourante = $this->helper('core/url')->getCurrentUrl();            // Récupération de l'url de la page courante
// Je cherche si la valeur "espace-pro.html" est contenue dans mon URL courante (c'est la catégorie contenant mes produits à masquer)
$_EspacePro =  strpos($_PageCourante,"espace-pro.html");
// Si la valeur est contenue dans mon url et que le groupe client est PRO (id=3 dans mon cas)
if($_EspacePro !== false) {
//si le client n'est pas loggué, renvoyer vers la page de login.
if(!$_isLoggedIn){
$_loginURL = $this->helper('customer/data')->getLoginUrl();
header("Location: $_loginURL");
exit;
}
//si le client est loggué, et que son groupe client n'est pas PRO.
if($_isLoggedIn && $_isPro != 3){
$_NotifURL = $this->getUrl('notification-pro');;
header("Location: $_NotifURL");
exit;
}
}
?>

2- Dans l’admin, créer une page CMS Espace PRO Cette page va servir de notification aux clients identifiés, n’appartenant pas au groupe PRO
clé URL de la page : notification-pro
Le contenu de la page  est de type :
La page demandée n’est pas accessible.

* Si vous n’êtes pas un client professionnel

Que pouvez-vous faire ?

* Créer un compte client pro que nous validerons.
* Retourner à la page précédente.
* Utilisez la navigation par filtres en haut à gauche de la page pour rechercher vos produits.
* Ou cliquez sur ce lien pour retrouver en page d’accueil : Retour à l’accueil

 
 

Vignette de promotions

27 juin

Cette article reprend le tutoriel très complet de jguiss que vous trouverez ici : http://www.jguiss.com/2009/06/customiser-la-liste-des-produits-sur-magento/

Pour aller plus loin, on peut insérer dans cette vignette la valeur en pourcentage de la promotion. Vous trouverez le code pour y parvenir ici : http://internet-pau.com/magento/2010/06/calcul-automatique-des-promotions-en-pourcentage/

1- Créer un attribut

<?php /* AFFICHAGE DE LA VIGNETTE PROMO */
$vignette = $_product->getAttributeText('etiquette');
if (!empty($vignette)) { ?>          // si l'attribut vignette est renseigné, on affiche le bloc vignette
<div>      // on ajoute devant la class de style list (pour l'affichage dans list.phtml) et view pour view.phtml, car la class .-10% n'est pas valide contrairement à .list10
<?php if ($vignette != 'promotion' && $vignette != 'nouveaute' && $vignette != 'topvente') { ?> // si l'attribut de vignette est différent de promotion, nouveauté et topvente, alors on affiche le montant (10,11...)
-<?php echo $vignette; ?>%          // on affiche la valeur de la promo
<?php } ?>
</div>
<?php } ?>

Dans l’admin Catalogue > Attributs > Gérer les attributs > Nouvel attribut
Créer attribut « etiquette » labels : « promotion, topvente, nouveaute,10,15,20… »
Définir les groupes d’attribut avec le nouvel attribut « etiquette »

2- Actualiser le Layout de chaque catégorie pour y insérer l’étiquette
Layout catalog : rechercher « product-list » et ajouter <action method=’addAttribute’><attribute>etiquette</attribute></action>
Ou bien, dans le XML de mise à jour d’agencement, section CMS, dans l’admin, ajouter :

<reference name='content'>
<block type='catalog/product_list' name='product_list'>
<action method='addAttribute'><attribute>etiquette</attribute></action> </block> </reference>

/app/design/frontend/default/blue/template/catalog/product/list.phtml
/app/design/frontend/default/blue/template/catalog/product/view.phtml
/app/design/frontend/default/blue/template/catalog/product/sales.phtml
/app/design/frontend/default/blue/template/catalog/product/new.phtml  … ajouter :

<div class="<?php echo $_product->getAttributeText('etiquette')?>"></div>

Si on souhaite afficher le montant de la promo dans la vignette:

<?php /* AFFICHAGE DE LA VIGNETTE PROMO */
$vignette = $_product->getAttributeText('etiquette');
if (!empty($vignette)) { ?>          // si l'attribut vignette est renseigné, on affiche le bloc vignette
<div>      // on ajoute devant la class de style list (pour l'affichage dans list.phtml) et view pour view.phtml, car la class .-10% n'est pas valide contrairement à .list10
<?php if ($vignette != 'promotion' && $vignette != 'nouveaute' && $vignette != 'topvente') { ?> // si l'attribut de vignette est différent de promotion, nouveauté et topvente, alors on affiche le montant (10,11...)
-<?php echo $vignette; ?>%          // on affiche la valeur de la promo
<?php } ?>
</div>
<?php } ?>

3- Modifier le fichier css style.css … ajouter :

/*  Etiquette de promo...  */
.item { position:relative; }

.topvente, .promotion, .nouveaute, .dix, .quinze, .vingt {
 position:absolute;
 float:right;
 display:inline;
 height:50px;
 width:50px;
}

.topvente { background:transparent url(../images/topvente.png) no-repeat scroll 0 0; }
.promotion { background:transparent url(../images/promotion.png) no-repeat scroll 0 0; }
.nouveaute { background:transparent url(../images/nouveaute.png) no-repeat scroll 0 0; }
.dix { background:transparent url(../images/dix.png) no-repeat scroll 0 0; }
.quinze { background:transparent url(../images/lavillauroy/quinze.png) no-repeat scroll 0 0; }
.vingt { background:transparent url(../images/vingt.png) no-repeat scroll 0 0; }

Si on souhaite afficher le montant de la promo dans la vignette:

/*  Etiquette de promo...  */
.item { position:relative; }

.viewtopvente, .viewpromotion, .viewnouveaute  {
 position:absolute;
 height:50px;
 width:50px;
 right:0;
 top:0;
 text-align:center;
 font:bold 14px/44px Arial, Helvetica, sans-serif;
 color:#FFF;
}
.listtopvente, .listpromotion, .listnouveaute {
 float:right;
 height:50px;
 width:50px;
 text-align:center;
 font:bold 14px/44px Arial, Helvetica, sans-serif;
 color:#FFF;
}

.viewtopvente, .listtopvente { background:transparent url(../images/topvente.png) no-repeat scroll 0 0; }
.viewpromotion, .listpromotion { background:transparent url(../images/promotion.png) no-repeat scroll 0 0; }
.viewnouveaute, .listnouveaute { background:transparent url(../images/nouveaute.png) no-repeat scroll 0 0; }
 
8 commentaires

Classé dans Magento

 

Calcul automatique des promotions en pourcentage

27 juin

Insérer ce bout de code à la ligne 356 avant <?php endif; ?> du fichier app/frontend/design/default/mon-theme/template/catalog/product/price.phtml

<?php // On calcule le pourcentage de remise
// on convertie le prix promo en entier => on enlève le sigle euro, on remplace la virgule par un point et on supprime l'espace dans le prix en remplaçant : ($_finalPrice,true,false) par : ($_finalPrice,false,false)
$promo = str_replace("€","",(str_replace(",",".",$_coreHelper->currency($_finalPrice,false,false))));;
$prix = str_replace("€","",(str_replace(",",".",$_coreHelper->currency($_regularPrice,false,false))));
echo '<p>'.str_replace(".",",",sprintf('%.1f',((($promo-$prix)/$prix )*100))).'%</p>';  //Affiche -xx,x%
?>
 
1 commentaire

Classé dans Magento

 

Afficher des articles dans un slideshow

27 juin

On veut afficher ces produits choisis dans un slideshow.

J’ai choisis le script glider.js, utilisant la librairie Scriptaculous. Cette librairie est déjà utilisée par Magento. Cela évite ainsi de charger une nouvelle librairie.


1- On insère le code javascript
dans app/design/frontend/default/mon-theme/layout/page.xml
On insère ces lignes vers la ligne 50 :

2-Télécharger glider.js et l’ajouter dans le dossier js/

3- On enregistre le fichier app/design/frontend/default/mon-theme/template/catalog/product/list.phtml sous defil.phtml

Exemple de fichier defil.phtml

<?php $_productCollection=$this->getLoadedProductCollection() ?>
<?php if(!$_productCollection->count()): ?>
<p class="note-msg">
    <?php echo $this->__('There are no products matching the selection.') ?>
</p>
<?php else: ?>
<div id="slider">
    <a href="#" onClick="my_glider.previous();return false;" class="bt">
        <img src="<?php echo $this->getSkinUrl('images/voiture-prev.png'); ?>"  alt="Voiture précédente" /></a>
    <div class="scroller">
        <div class="content">
            <?php $_iterator = 0; ?>
            <?php foreach ($_productCollection as $_product): ?>
            <?php if ($_iterator>=4): continue;  endif;         										// on fixe le nombre de produits affichés à 4 ?>
            <div class="section" id="section<?php echo $_iterator ?>">								// on ajoute à l'id section la valeur de l'itérateur
                <div class="products-list" id="products-list">
                    <?php // Product Image ?>
                    <a href="<?php echo $_product->getProductUrl() ?>" title="
                        <?php echo $this->htmlEscape($this->getImageLabel($_product, 'small_image')) ?>" class="product-image">
                        <img src="<?php echo $this->helper('catalog/image')->init($_product, 'small_image')->directResize(120,120,3); ?>" width="120" height="90" alt="<?php echo $this->htmlEscape($this->getImageLabel($_product, 'small_image')) ?>" /></a>
                    <?php // Product description ?>
                    <div class="product-shop">
                        <div class="f-fix">
                            <h2 class="product-name"><a href="<?php echo $_product->getProductUrl() ?>" title="<?php echo $this->htmlEscape($_product->getName()) ?>"><?php echo $this->htmlEscape($_product->getName())?></a></h2>
                            <?php if($_product->getRatingSummary()): ?>
                            <?php echo $this->getReviewsSummaryHtml($_product) ?>
                            <?php endif; ?>
                            <?php echo $this->getPriceHtml($_product, true) ?>
                            <?php if($_product->isSaleable()): ?>
                            <!--<p><button type="button" title="<?php echo $this->__('Add to Cart') ?>" class="button btn-cart" onclick="setLocation('<?php echo $this->getAddToCartUrl($_product) ?>')"><span><span><?php echo $this->__('Add to Cart') ?></span></span></button></p>-->
                            <?php else: ?>
                            <p class="availability out-of-stock">
                                <span>
                                    <?php echo $this->__('Out of stock') ?>
                                </span>
                            </p>
                            <?php endif; ?>
                        </div>
                    </div>
                </div>
            </div>
            <?php endforeach; ?>
<script type="text/javascript">decorateList('products-list', 'none-recursive')</script>
        </div>
    </div>
    <a href="#" onClick="my_glider.next();return false" class="bt">
        <img src="<?php echo $this->getSkinUrl('images/voiture-next.png'); ?>"  alt="Voiture suivante" /></a>
</div>
<script type="text/javascript" charset="utf-8">
        var my_glider = new Glider('slider', {duration:0.4, autoGlide: true});		//on peut modifier la durée en changeant 0.4 et l'éxécution automatique en mettant autoGlide:false
	</script>
<?php endif; ?>

4- On insère le style CSS relatif au slider, dans /skin/frontend/default/mon-theme/css/styles.css

/* PROMO Défilante - View Type: List */
#slider {
/* modify width and height of scrolling section if necessary */
width: 538px;
height: 98px;
background: url(../images/voiture-pas-chere.png) no-repeat ;
padding:12px 6px;
}
div.scroller {
/* modify width and height of scrolling section if necessary */
float:left;
display:inline;
width: 504px;
height: 103px;
overflow: hidden;
}
div.scroller div.section {
/* modify width and height of each section as needed (should match the size of the scroller window) */
width:480px;
height:103px;
overflow:hidden;
float:left;
display:inline;
padding:4px 1em 0 1em;
}
div.scroller div.content {
width: 10000px;
}
a.bt { display:inline; float:left; width:17px; height:103px; padding:0; cursor:pointer; }
#slider .products-list .product-name { width:235px; }
#slider .products-list .product-name a { color:#000; height:90px; width:235px; float:left; }
#slider .products-list .product-name a:hover { color:#F7CD30; }

5- On affiche le résultat avec la ligne suivante placée dans un layout

<block type=”catalog/product_list_defil” name=”product_defil” template=”catalog/product/defil.phtml”/>

Ou dans du contenu d’une page ou d’un bloc CMS

{{block type='catalog/product_list_defil' template='catalog/product/defil.phtml'}}
 
1 commentaire

Classé dans Magento

 

Erreur 500 après une mise à jour de Magento

25 juin

Si vous rencontrez ce problème, vous devez vider le cache et les sessions :

var/cache
var/session

en ssh :

rm -rf /var/www/maboutique.com/var/cache/*
rm -rf /var/www/maboutique.com/var/session/*

Puis videz le cache à partir de l’admin

 
 

Afficher des produits de son choix sur une page

24 juin

Par exemple, je veux faire figurer une sélection de produits en haut de page, dans un slideshow, dans la page de résultats.
Voir exemple : http://www.import-auto-discount.com/achat-voiture-neuve.html
slideshow magento

On veut afficher des produits choisis dans une page

1 – Création d’un attribut nommé defil dans catalogue/Attribut/Gérer les attribut/ Nouvel attribut
Ajouter un attribut

2- Insérer l’attribut dans le groupe d’attribut souhaité dans Catalogue/Attribut/Gérer les groupes d’attribut
Groupe d'attribut
3 – Copier app/code/core/Mage/Catalog/Block/Product/List/Promotion.php et l’enregistrer sous app/code/local/Mage/Catalog/Block/Product/List/Defil.php
et modifier ces lignes :

class Mage_Catalog_Block_Product_List_Defil extends Mage_Catalog_Block_Product_List     // On change le nom de la classe
{
protected function _getProductCollection()
{
if (is_null($this->_productCollection)) {
$collection = Mage::getResourceModel('catalog/product_collection');
Mage::getModel('catalog/layer')->prepareProductCollection($collection);
// your custom filter
$collection->getSelect()->order('rand()');        // On ajoute un affichage aléatoire
$collection->addAttributeToFilter('defil', 1)     // On remplace promotion par defil
->addStoreFilter()
->setPage(1, 2)                // On limite le nombre de résultats affichés à 2
->load();

$this->_productCollection = $collection;
}
return $this->_productCollection;
}
}

4- Les produits pour lesquels vous sélectionnez Oui (dans le back-office) seront affichés sur le bloc defil qui peuvent être affichés grâce à une mise en page personnalisée.
On affiche le résultat avec la ligne suivante placée dans un layout :

<block type=”catalog/product_list_defil” name=”product_defil” template=”catalog/product/list.phtml”/>

Ou dans le contenu d’une page ou d’un bloc CMS

{{block type='catalog/product_list_defil' template='catalog/product/list.phtml'}}

5- Il est possible de modifier sa mise en page en dupliquant le fichier app/design/frontend/default/mon-theme/template/catalog/product/list.phtml par ma-liste.phtml
Alors on utilisera :

<block type=”catalog/product_list_defil” name=”product_defil” template=”catalog/product/ma-liste.phtml”/>

ou

{{block type='catalog/product_list_promotion' template='catalog/product/ma-liste.phtml'}}

Pour insérer ces articles dans un slideshow, rendez-vous à l'article :

Afficher des articles dans un slideshow