Quelques articles de la catégorie: Virtuemart

Personnalisation du mini panier

Appréciation moyenne:  / 20

Virtuemart: personnaliser le mini panier

La page par défaut gérant l'affichage du mini panier est:

/www/components/com_virtuemart/themes/default/templates/common/minicart.tpl.php

Premier objectif:

essayer de faire en sorte que virtuemart n'utilise plus pour le mini panier ce template default mais le mien.

Pour ce faire, on utilise la technique de duplication de template, comme expliquée ici:

Création, modification et gestion de templates personnalisés avec Virtuemart

Donc, il s'agit maintenant d'aller modifier la page:

/www/components/com_virtuemart/themes/custom/templates/common/minicart.tpl.php
si custom est le nom de notre nouveau template virtuemart.

Enlever le lien et l'image Virtuemart en cas de panier vide:

Dans minicart.tpl.php donc, repérer dès les premières lignes le code php qui insère le lien et l'image:

if($empty_cart) { ?>
  <div style="margin: 0 auto;">
    <?php if(!$vmMinicart) { ?>
        <a href="http://virtuemart.net/" target="_blank">
          <img src="<?php echo $mm_action_url ?>components/com_virtuemart/shop_image/ps_image/menu_logo.gif" alt="VirtueMart" width="80" border="0" /></a>
        <br />
    <?php }
    echo $VM_LANG->_('PHPSHOP_EMPTY_CART') ?>
  </div>
<?php } 

ligne 4: c'est le lien

ligne 5: c'est l'image

On peut donc changer ici le lien de l'image, et l'image évidemment.

Si on souhaite que le mini-panier ne s'affiche pas lorsqu'il est vide, le plus simple est de remplacer le code ci-dessus par celui-ci

if($empty_cart) { ?>
    <div style="margin: 0 auto;">
    </div>
<?php } 

Je souhaite modifier maintenant les messages qui vont s'afficher à l'écran, par exemple lorsque le panier est vide.
A la place de 'votre panier est actuellement vide' je vais mettre 'Votre panier est vide'

Petite modif mais intéressante dans l'étude pour les suivantes.

Repérons dans notre page 'PHPSHOP_EMPTY_CART' qui semble être (si mon anglais est correct) la variable que l'on cherche.
  Remplaçons-là par notre texte directement pour voir l'impact:

echo 'Votre panier est actuellement vide';//$VM_LANG->_('PHPSHOP_EMPTY_CART')

C'est ok, mon message s'affiche.

Pour modifier les messages de façon propre et sans craindre une mise à jour de virtuemart, se reporter à cet article:

Virtuemart et la personnalisation des messages

On va ensuite essayer de modifier le div conteneur du mini-panier pour pouvoir le piloter via css.

Cette partie fera l'objet d'un développement ultérieur:

Au départ il est créé comme ça:

il faut encadrer ce div avec le mien:

id="conteneur_panier_gauche"

Mauvaise catégorie en début de chemin, itemid identique sur tous les liens

Appréciation moyenne:  / 8

Virtuemart et le problème de l'itemid identique

voici le problème résumé brièvement, que beaucoup rencontrent apparemment:

lorsqu'on utilise des menus virtuemart pour les catégories, on a une mauvaise catégorie qui se place systématiquement au début des url générées.
On voit bien le problème lorsqu'on utilise le composant breadcrumbs.
On voit aussi que le lien de menu actif bascule sur la catégorie rajoutée en début de chemin.
D'autres ont signalé d'autres comportements en rapport avec ce problème.

 

Il semblerait que virtuemart construise ses liens en prenant systématiquement la première catégorie déclarée dans sa liste.

Il fait une requête sql dans la table des menus joomla et extrait la première entrée de menu qui pointe sur le composant virtuemart.
On ne remarque ce problème que lorsqu'on utilise plusieurs entrées de menu joomla pour accéder directement aux catégories virtuemart par menu joomla.
Par exemple, j'ai un menu principal qui contient 4 entrées liées à un composant virtuemart, et je lie chaque entrée de menu à mes catégories virtuemart principales, en entrant dans le paramètre du composant un ID de catégorie.

A force de me prendre la tête avec ce truc et de remonter à la source du problème, j'ai trouvé un truc qui fonctionne bien:

comme beaucoup l'ont vu je crois, ça se passe dans le fichier ps_session.php du dossier:
/administrator/components/com_virtuemart/classes
dans la fonction: 

function getShopItemid()
{
  /** modif: rajout ligne suivante:*/
  global $Itemid;
  /** fin modif */
  if ( empty($_REQUEST['shopItemid']))
  {
    $db = new ps_DB;
    /** modif: commenté ligne suivante:*/
    //$db->query( "SELECT id FROM #__menu WHERE link='index.php?option=com_virtuemart' AND published=1");
    /** fin modif */
    /** modif: rajout ligne suivante:*/
    $db->query("SELECT id FROM #__menu WHERE link='index.php?option=com_virtuemart' AND published=1 AND id=".$Itemid);
    /** fin modif */
    if ($db->next_record())
    {
    $_REQUEST['shopItemid'] = $db->f("id");
    }
    else
    {
      if (! empty($_REQUEST['Itemid']))
      {
        $_REQUEST['shopItemid'] = intval($_REQUEST['Itemid']);
      }
      else
      {
        $_REQUEST['shopItemid'] = 1;
      }
    }
  }
  return intval($_REQUEST['shopItemid']);
}


Si je comprends bien la requête (dur dur au début), on demande de nous sortir une liste d'id tirés de la table joomla menu, ces ids étant finalement les itemid tant désirés...
Comme on ne précise aucun critère, je suppose qu'on sort une liste, et ensuite si on utilise cette liste, on ne récupère que le premier élément, qui correspond, comme par hasard, à la première catégorie virtuemart associée au menu catégorie de virtuemart...

  J'ai donc simplement rajouté ligne 13 un critère sur cette requête pour n'avoir qu'une seule ligne retournée à chaque fois, en fonction de l'itemid cliqué: 

$db->query("SELECT id FROM #__menu WHERE link='index.php?option=com_virtuemart' AND published=1 AND id=".$Itemid);

J'ai aussi rajouté la déclaration de l'itemid en global, comme on peut le voir dans la fonction, ligne surlignée 4.

Une fois mis en place ça fonctionne bien, mais je ne peux pas tout tester.

Virtuemart: création et gestion de template

Appréciation moyenne:  / 26

Comment modifier ou adapter le template par défaut de la boutique Virtuemart?

tout se passe dans:
components/com_virtuemart/themes

Dans ce dossier, on trouve un répertoire nommé default, qui est utilisé par Virtuemart pour gérer l'affichage des différents éléments.

La technique que j'utilise consiste à dupliquer ce répertoire default en nommant cette copie custom, par exemple.
C'est vraiment la première chose à faire lorsqu'on décide de personnaliser un template virtuemart, car ainsi les mises à jour de virtuemart ne viendront pas écraser notre travail, dans cette partie là du moins.

De plus, j'évite au maximum de modifier le moteur Virtuemart, qui se trouve dans /administrator/component/com_virtuemart

Ensuite, une fois le template par défaut de virtuemart dupliqué, il faut aller dans l'interface d'administration de la boutique, option configuration.
On choisit l'onglet Site, puis on regarde dans le cadre affichage, on cherche "Choisir le thème de sa boutique", puis on sélectionne dans la liste le template que l'on vient de dupliquer, custom dans cet exemple.
Un petit click sur le lien 'configuration' afin d'affiner les réglages de ce nouveau template...

Ensuite, il suffit d'aller modifier les fichiers que l'on souhaite adapter, ce qui fera l'objet sans doute d'un autre article...

Virtuemart et la personnalisation des messages

Appréciation moyenne:  / 15

Je souhaite personnaliser les messages virtuemart.

Une technique courante consiste à aller modifier directement les fichiers de langue de Virtuemart, dans la langue concernée.

Tout ça se passe dans:

/www/administrator/components/com_virtuemart/languages/

une arborescence complète assez intuitive par rapport à la localisation des messages que l'on souhaite modifier.

Bon, étudions un cas pratique, c'est plus parlant:

On va modifier le message lié au mini-panier, comme quoi 'votre panier est actuellement vide'

la technique complète de mise en place et d'adaptation d'un template pour vm est expliquée dans cet article:

Personnalisation complète du mini-panier

Repérons dans notre page /www/components/com_virtuemart/themes/default/templates/common/minicart.tpl.php 'PHPSHOP_EMPTY_CART' qui correspond à l'affichage au final d'un message comme celui-ci:
'Votre panier est actuellement vide.'

Dans le dossier /www/administrator/components/com_virtuemart/languages/ , après une petite recherche et un peu de logique, on retrouve dans le dossier common un fichier french.php qui contient la variable.

Je modifie le contenu de cette variable en 'votre panier est presque vide' et lorsque je teste sur le site mon message à moi apparait, bref c'est ok aussi.

Autre solution, en utilisant une nouvelle variable dans le code php du template (PHPSHOP_PANIER_VIDE) :

echo $VM_LANG->_('PHPSHOP_PANIER_VIDE')

puis en la créant aussi dans le bon fichier common/french.php, à la fin de préférence:

//ne pas oublier de rajouter une virgule après la dernière variable présente
 'PHPSHOP_PANIER_VIDE' => 'Votre panier est presque vide.'

ça fonctionne aussi.

Mais encore une fois, à la prochaine mise à jour de Virtuemart, cette modif sera surement écrasée.

L'idéal serait de pouvoir rajouter no(s)tre propre(s) fichier(s) qui contiendraient nos variables, et qui viendraient s'ajouter aux fichiers de langue par défaut de Virtuemart.


Je vais donc créer un nouveau répertoire sous /administrator/components/com_virtuemart/languages/ nommé par exemple 'custom' dans lequel je vais commencer par copier un fichier french.php et dans lequel je mettrai mes propres variables françaises.
Je vire toutes les autres variables pour ne conserver que ceci:
 

<?php
 if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); 
 /**
 *
 * mes chaines de messages
 *
 */
 global $VM_LANG;
 $langvars = array ( 
 'CHARSET' => 'UTF-8',
 'PHPSHOP_PANIER_VIDE' => 'Votre panier est presque vide.'
 ); $VM_LANG->initModule('custom', $langvars );
 ?>

 

Dans l'appel de la fonction initmodule en fin de fichier j'ai bien modifié le nom du 'répertoire' pour mettre le mien.

je teste et ça ne fonctionne pas.

C'était trop simple... j'ai bien cherché mais pour rajouter un dossier de module de langue c'est pas simple.

Il me reste à tester ça:

je crée un fichier.php dans la racine de mon template virtuemart contenant un tableau que je garnirai au fur et à mesure de mes variables messages.

Ensuite, dans le fichier theme.php au même endroit, j'inclus ce fichier.php en global et le tour est joué.

Si je veux gérer plusieurs langues, je crée un fichier par langue (french.php pour le français) et je teste dans le fichier theme.php quelle langue est utilisée par joomla pour la boutique.

Il faut se souvenir que virtuemart s'appuie sur la langue choisie dans joomla pour s'adapter au langage.
En d'autres termes, si on a choisi 'french' comme langue par défaut du site dans joomla, virtuemart va rechercher les fichiers french.php (orthographe exacte attention) dans ses dossiers de languages.

J'utilise donc le même système de sélection de langue, avec orthographe exacte donc...

à suivre pour les tests maintenant.

 En attendant, j'utilise la technique du début, à savoir que je modifie la variable langue appelée par la page pour laquelle je souhaite modifier le message.

Et je note toutes mes modifs en prévision des mises à jour Virtuemart...

Désactiver mootools

Appréciation moyenne:  / 1

Virtuemart: comment désactiver mootools

Virtuemart charge une version mootools-release-1.11 qui peut entrer en conflit avec d'autres mootools.

on peut avoir envie de désactiver mootools juste pour le thème virtuemart choisi en frontend de boutique.

pour ce faire, aller dans le dossier:

/components/com_virtuemart/themes/nomdutheme

(souvent, on laisse le theme default avec lequel ensuite on va travailler, mais c'est pas une bonne idée)

et modifier le fichier theme.php, dans cette fonction

function vmTheme()
 {
   parent::vmTemplate();
   //vmCommonHTML::loadMooTools();
 }

la ligne 4 est mise en commentaire

 

 

Récupérer les url des différents éléments

Appréciation moyenne:  / 3

Virtuemart: récupérer les url des différents composants

 

URL du template

Lorsqu'on développe un thème virtuemart en php, on a besoin d'avoir accès au chemin du template en cours de façon dynamique, afin de ne pas avoir à renseigner en dure celui-ci, et de ne pas avoir de problème si le nom du template est amené à changer.

Utilisons donc la variable globale VirtueMart nommée: VM_THEMEURL, comme ci par exemple:

<?php echo 'thème vm: '.VM_THEMEURL ?>

et voilà un chemin complet sur le thème en cours.

Attention, on récupère ainsi l'adresse totale y compris le http://nomsite.toto.

 

URL du dossier images:

<?php echo 'dossier images vm: '.IMAGEURL ?>

Attention, on récupère ainsi l'adresse totale y compris le http://nomsite.toto.