Forum CMS Made Simple FR

Version complète : [Résolu] Question sur les balises "Smarty"
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Pages : 1 2

Cr4sH

Citation :#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~
#~ Version du CMS: 1.9.2
#~ Nom de l'hébergeur : 1and1.fr
#~ Informations Système :
#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~



Ecrivez votre question ici.

Bonsoir, voici un moment que je n'étais pas passé poser une petite question à propos de CMSMS Smile
Je suis actuellement confronté à un petit problème, et n'étant pas très familiarisé avec le "Smarty", j'aurai voulu vous soumettre ma question.

Je viens de créer un module d'affichage d'objets à vendre grace au module "CTLModuleMaker", et tout s'est très bien passé, mon module me convient tout à fait. Il génère des "fiches" de produits à vendre avec les multiples caractéristiques nécessaires, etc... Mon problème donc, c'est que le champs "Description" de mon objet, un textarea WYSIWIG, ne supporte apriori pas le Smarty. D'un autre coté, voulant profiter des bienfaits visuels d'une lightbox agrandissante pour les photos, j'aurai voulu utiliser le module "Gallery" pour choisir une photo de produit comme suit :

{Gallery img=3} ( c'est un exemple. )

d'un autre coté, lors du remplissage des caractéristiques de chaque produit, j'ai créé un champs "ID photo" dans lequel il suffit d'entrer le numéro correspondant à la photo uploadée dans "Gallery". Je suis ensuite allé consulté le gabarit de l'affichage de mes objets, voici la ligne de code qui permet de retourner le numéro de la photo demandée :

{$item->photo_objet}

Il me retourne bien le chiffre 3.
Maintenant, ce dont j'aurai besoin, c'est de mélanger ces deux balises smarty pour que l'ID de la photo soit directement prise en charge. Voici donc mes essais infructueux :

Essai 1 : {Gallery img={$item->photo_objet}}
Essai 2 : {Gallery img=$item->photo_objet}

Rien n'a fonctionné. Pourriez vous me guider ?

En vous remerciant par avance,
Cordialement, Moi Smile
salut Cr4sH

essai avec la balise smarty assign

Code :
{assign var='photo' value=$item->photo_objet}
{Gallery img=$photo}

Cr4sH

Bonsoir Bess, et merci pour cette réponse très rapide !

Je viens à l'instant d'essayer cette technique, mais elle ne fonctionne malheureusement pas...
Je me permet de vous joindre directement le code de mon gabarit si vous le voulez bien, peut-être trouverez vous une piste !

Code :
{foreach from=$itemlist item="item"}
<table width="100%">
<tr>
<td style="background-color:#000; padding:4px; color:#fff">
<strong>{$item->titre_objet}</strong>
</td>
</tr>
<tr>
<td>
{$item->description_objet->Label()}: {$item->description_objet}<br/>
</td>
</tr>
<tr>
<td>
{$item->prix_objet->Label()}: {$item->prix_objet}<br/>
</td>
</tr>
<tr>
<td>
{$item->photo_objet->Label()}: {assign var='photo' value=$item->photo_objet} {Gallery img=$photo}<br/>
</td>
</tr>
</table>
<br><br><br>
{/foreach}

Ne faites pas attention au tableau, ce n'est qu'une première structuration Wink

Encore un grand merci par avance pour votre temps.
tente déjà ceci


XXX => {$item->photo_objet}<br/>
{assign var='photo' value=$item->photo_objet}
XXX => {$photo}<br/>

on va voir à quelle endroit l'affectation déconne.

Cr4sH

Alors, test effectué.
C'est à n'y rien comprendre. Voici un petit bilan :

Code :
{assign var='photo' value=$item->photo_objet}
XXX => {$photo}<br/>
Me retourne bien "3".

Code :
{assign var='photo' value=$item->photo_objet}
XXX => {Gallery img=$photo}<br/>
Ne me retourne rien.

Code :
{Gallery img=3}
Me retourne bien l'image, parfaitement fonctionnelle.


Je perd pied Wink
XXX => {Gallery img='3'}<br/>


est ce que ca fonctionne ou pas ? si ca tombe c'est la conversion en String qui déconne... cela dit ca n'avance pas plus le problème, c'est juste par curiosité ...

je chercherais demain si j'ai d'autre idée de contournement ou si j'ai une piste pour corriger ce point

Cr4sH

Bonjour Bess,

Je viens à l'instant d'essayer votre ligne de code, avec même quelques variantes, mais le problème persiste.
Voici ce que j'ai essayé :

Code :
{Gallery img='3'}
Fonctionne.

Code :
{assign var='photo' value='3'} {Gallery img=$photo}
Fonctionne.

Code :
{assign var='photo' value='$item->photo_objet'} {Gallery img=$photo}
Ne fonctionne pas.


Un cauchemard ! Sad

Toute proposition est la bienvenue.
Encore une fois un grand merci pour votre temps Bess.
je t'en prie.

donc on continue dans les tests

Code :
>>{$item->photo_objet|print_r}
{assign var='photo' value='$item->photo_objet'}
>>{$photo|print_r}

Cr4sH

Eh bien cette fois ci, nouveau problème. J'avoue que je m'y perd un chouilla, je ne connais pas "print_r", en tout cas, voici mon gabarit actuel (de test) :
Code :
{foreach from=$itemlist item="item"}
<table width="100%" style="background-color:#eee; border: 1px solid #000;" border="0" cellspacing="0" cellpadding="0">
<tr>
<td style="background-color:#000; padding:10px; color:#fff;">
<strong>{$item->titre_objet}</strong>
</td>
</tr>
<tr>
<td>
{$item->description_objet->Label()}: {$item->description_objet}<br/>
</td>
</tr>
<tr>
<td>
{$item->prix_objet->Label()}: {$item->prix_objet}<br/>
</td>
</tr>
<tr>
<td>
{$item->photo_objet->Label()}: <br/>
</td>
</tr>
</table>
Test :
{$item->photo_objet|print_r}
{assign var='photo' value='$item->photo_objet'}
{$photo|print_r}
<br>
{/foreach}

Le serveur me retourne cette fois ci une page blanche avec :


Fatal error: Out of memory (allocated 33292288) (tried to allocate 12168836 bytes) in /homepages/xxxxxx/xxxxxxxxxx/xxxxxxxx/modules/TinyMCE/event.Core.ContentPostRender.php on line 4


Une idée ? Smile
>Fatal error: Out of memory (allocated 33292288)
Tu consomme trop de mémoire donc voir si tu peux l'augmenter ou mieux réduire les ressources demandées
c'est mon print_r qui provoque ca....

décidément on tourne en rond... là dans l'instant je n'ai pas d'inspiration :/
Bonjour vous 2,
je viens mettre mon grain de sel...
Cr4sH, est-ce que tu peux mettre le paramètre "dir" dans la balise "Gallery"?
Bonjour,
Ca ne résoudra pas ton problème, mais tu peux ajouter un champ image à ton niveau final avec CTLModuleMaker. De là, tu peux formater tes images comme tu le souhaites avec Fancybox, Lightbox ou autre. Tu pourras aussi ajouter une plusieurs images, le tout avec un seul champ CTLModuleMaker.

Sinon tu peux essayer avec capture :
Code :
{capture assign='numero_photo'}'{$item->photo_objet}'{/capture}
{Gallery img=$numero_photo}
bonne idée le capture d'airelibre tiens ! essaie cette méthode oui !

Cr4sH

Bonjour tout le monde !

Je m'excuse, journée très chargée. Je suis impressionné par le nombre de réponses ! Alors je vais répondre à chacun :

@jissey :
J'ai bien essayé le {Gallery dir='Objets' img='$item->photo_objet'}, mais il ne retourne rien... Toujours le même problème, mais merci pour la contribution Wink

@airelibre :
Alors, le "capture" ne fonctionne pas non plus... cependant, tu as mis le doigt sur quelque chose que j'avais zappé assez vite : l'import d'image par CTLModuleMaker. A la première installation, j'avais faire un essai, créé un module, mais dans le formulaire d'ajout de fiche, aucun bouton parcourir, seulement un simple textfield. Je m'étais finalement vite rabattu sur le le module Gallery. Mais je suis retourné vers ce système depuis que tu me l'a rappelé, j'avais finalement juste oublié d'installer un module nécessaire au bon fonctionnement de l'upload.
Je me permet, pour continuer dans ma lancée, de te demander comment intégrer FancyBox par exemple dans le gabarit. Pour tout te dire, j'ai demandé à mon module la création de thumbs. Cependant, quand l'image est appelée, elle est affichée en taille native ! Alors, logiquement, j'ai commencé à bidouiller avec l'aide de CTLModuleMaker à savoir :

Code :
V Attributs des objets fichier
Pour tous les champs de type fichier/image, un objet fichier est disponible à travers $item->fieldname->fileobject

    * $file->url [url relatif]
    * $file->load_file_info() [attribue une valeur aux variables suivantes]
    * $file->extension
    * $file->size [taille en bytes]
    * $file->size_wformat [taille formattée]
    * $file->imagesize ["widthxheight" - pour images seulement]
    * $file->width [pour images seulement]
    * $file->height [pour images seulement]
    * $file->filemtime [dernière modification, temps unix]
    * $file->modified [dernière modification, temps formattée]
    * $file->thumbnail()
    * $file->get_thumb_url()
    * $file->display("titre ou alt")

Mais je me confronte à une mauvaise utilisation de ces fameux "$file->thumbnail()" par exemple. Concrètement, comment doit-on utiliser les "Attributs des objets fichier" ?
Si par exemple je ne veux que l'adresse de ma thumb, je pense qu'il faudrait utiliser "$file->get_thumb_url()", mais cela ne me retourne rien... j'ai par exemple fait un essai avec <img src="$file->get_thumb_url()" /> pour pouvoir ensuite "LightBoxer" tout ça, mais j'avoue que je m'y perd un petit peu !

Je suis à deux doigts d'ouvrir un nouveau sujet, cependant le problème de fond reste le même, je reste donc ici.

Un grand merci encore à tout le monde !
Alors, pour utiliser correctement les champs images, voici un exemple de gabarit sur l'un de mes sites :
Code :
{* si on a des images dans le champ "photos" *}
{if count($item->photos) > 0}
<div id="photos">
{foreach from=$item->photos item="file"}

{* On a maintenant accès à l'objet "file" qui comprend tous les attributs évoqués par l'aide *}

{* On crée un lien pour la lightbox - dans mon cas j'utilise généralement Fancybox que j'associe aux classes "galerie" *}
{* J'utilise aussi le plugin "Supersizer" pour créer les miniatures et les images agrandies à la volée, d'où le "href" suivant : *}
<a class="galerie" href="{supersizer path=$file->url passThru=true width='800' URL='true'}">

{* La miniature à partir de "$file->url", retaillée en 70 * 100 avec SuperSizer *}
{supersizer path=$file->url height='70' width='100'}

{* Fin du lien pour la lightbox *}
</a>
{/foreach}

</div>
{/if}

Voilà, j'espère que cet exemple pourra t'aider ! Après, il te suffit d'installer les scripts pour la lightbox de ton choix. Je te conseille pour cela le module "JQueryTools" qui inclus Fancybox et JQuery. Mais tu peux aussi les mettre "à la main" bien sûr.

A ta dispo !
Et sans les apostrophes avant et après {$item->photo_objet} du code d'AirLibre, car normalement son code doit marcher ?
Code :
{capture assign='numero_photo'}{$item->photo_objet}{/capture}

Cr4sH

Eh bien ! Quel succès !

Alors, au cas par cas.

@airelibre :
Ton code m'a l'air vraiment au poil pour l'aide que j'ai demandé, merci. Cependant, avant de le tester, j'ai une petite question supplémentaire.
An début de mon gabarit, j'ai :
Code :
{foreach from=$itemlist item="item"}
alors que toi, tu as mis :
Code :
{foreach from=$item->photos item="file"}

Il me vient donc à l'esprit, sachant que j'ai de mon coté aussi d'autre éléments que des images ( prix, description, etc... ), que le item="file" va me poser problème. Ai-je raison ? J'ai l'impression que seuls les fichiers seront pris en charge dans la boucle, mais je me trompe peut-être Smile

Merci encore !

@Jean le Chauve :
Je suis maintenant passé sur une idée plus structurée concernant l'import d'image, mais par curiosité, quand j'aurai trouvé la solution à mon problème, je ferai un essai !
Merci beaucoup donc.
Alors attention, la boucle que je t'ai mis ne concerne que les images ! Il faut l'inclure dans ton
Code :
{foreach from=$itemlist item="item"}

Exemple :
Code :
{foreach from=$itemlist item="item"}

********** infos de ton "item" : nom, info A, B, X, Y... tout ce que tu veux

{foreach from=$item->photos item="file"}
********* traitement des photos
{/foreach}

******** Autres infos de l'item à afficher après la galerie

{/foreach}

Tu vois ? La boucle "foreach" qui est à l'intérieur utilise justement l'objet "item". C'est comme dans Inception, on descend d'un niveau à chaque "foreach" Wink

Cr4sH

airelibre, j'aime tes explications Wink

Bon, alors je continue dans ma lancée, si tu le permets.
J'ai donc "incépté" mes deux boucles. Au niveau de mon gabarit, je pense être ok. Le voici :

Code :
{foreach from=$itemlist item="item"}
<table width="100%" style="background-color:#eee; border: 1px solid #000;" border="0" cellspacing="0" cellpadding="0">
<tr>
<td style="background-color:#000; padding:10px; color:#fff;">
<strong>{$item->titre_objet}</strong>
</td>
</tr>
<tr>
<td>
{$item->description_objet->Label()}: {$item->description_objet}<br/>
</td>
</tr>
<tr>
<td>
{$item->prix_objet->Label()}: {$item->prix_objet}<br/>
</td>
</tr>
<tr>
<td>
{if count($item->photos) > 0}
{foreach from=$item->photos item="file"}

{* On a maintenant accès à l'objet "file" qui comprend tous les attributs évoqués par l'aide *}

{* On crée un lien pour la lightbox - dans mon cas j'utilise généralement Fancybox que j'associe aux classes "galerie" *}
{* J'utilise aussi le plugin "Supersizer" pour créer les miniatures et les images agrandies à la volée, d'où le "href" suivant : *}
<a class="galerie" href="{supersizer path=$file->url passThru=true width='800' URL='true'}">

{* La miniature à partir de "$file->url", retaillée en 70 * 100 avec SuperSizer *}
{supersizer path=$file->url height='70' width='100'}

{* Fin du lien pour la lightbox *}
</a>
{/foreach}
{/if}

</td>
</tr>
</table>
{/foreach}

Mais...aucun affichage Wink
Alors je me demande si j'ai bien installé la fonction SuperSizer. C'est la première fois que je tombe sur un module en php, et non en XML, je me suis donc contenté de l'UL dans le repertoire "functions" de mon module créé avec CTLModuleMaker. Est-ce suffisant ?

Autre petite question, je ne vois nulle part dans ton gabarit la référence à une quelconque lightbox ( dans le code, pas dans les commentaires Smarty Smile )
Comment se fesse ?

Merci !
Alors, tu dois copier le plugin supersizer dans le répertoire "plugins" qui est à la racine de ton installation, et non dans ton répertoire de module Wink C'est un plugin que tu peux utiliser dans n'importe quel module. Tu auras d'ailleurs une nouvelle entrée dans "Extensions" / "Balises".

Pour vérifier déjà que la boucle foreach marche bien, fait un simple affichage :
Code :
{foreach from=$item->photos item="file"}
Url : {$file->url}
{/foreach}
Ca devrait t'afficher les adresses de tes images.

Ensuite, je n'ai effectivement pas mis le code pour Fancybox (ou autre). Tu dois le prévoir ailleurs dans ton gabarit.
Si tu veux utiliser Fancybox, c'est tout simple : http://fancybox.net/howto

Tiens-nous au courant Wink Essaye déjà d'afficher l'url de l'image et vois si c'est ok

Cr4sH

Alors, erreur de ma part, fatigue oblige, j'avais utilisé "$item->photos" plutot que "$item->photo_objet" qui est le mien. Autant pour moi, donc en effet ça change la donne. Nouvelle bizarrerie !

Avec "Url : {$file->url}" voici ce qu'il m'est retourné :
Code :
Url : Url : Url : Url : Url : Url : Url : Url : /homepages/xx/xxxxxxxxxx/htdocs/uploads/photos/photos_objets/Anime_Girl_by_edgarepic.jpg Url :

Répétition du mot "Url :" huit fois avant et une fois après. Pauvre de moi...
Voici dans le doute mon gabarit actuel :
Code :
{foreach from=$itemlist item="item"}
<table width="100%" style="background-color:#eee; border: 1px solid #000;" border="0" cellspacing="0" cellpadding="0">
<tr>
<td style="background-color:#000; padding:10px; color:#fff;">
<strong>{$item->titre_objet}</strong>
</td>
</tr>
<tr>
<td>
{$item->description_objet->Label()}: {$item->description_objet}<br/>
</td>
</tr>
<tr>
<td>
{$item->prix_objet->Label()}: {$item->prix_objet}<br/>
</td>
</tr>
<tr>
<td>
{foreach from=$item->photo_objet item="file"}
Url : {$file->url}
{/foreach}
</td>
</tr>
</table>
{/foreach}

Concernant FancyBox, je regarderai ça après, bien sur...

Voili voilou !
{foreach from=$item->photo_objet item="file"}
Url : {$file->url}
{/foreach}

il boucle 8 fois, seul l'avant dernière contient une image et donc une url, ca me semble logique dès lors cette histoire de répétition
Bien, on avance Wink As-tu plusieurs champs image que tu aurais mis avec CTLModuleMaker ? Parce qu'avec un champ image, tu peux insérer un nombre illimité de fichiers Wink

Voici une version qui évite ce problème :
Code :
{foreach from=$item->photo_objet item="file"}
{if $file->url neq ''}
Url : {$file->url}
{/if}
{/foreach}

Tu ne devrais avoir que "Url :"+ l'url du fichier existant.

Sur le gabarit final, ca donne :
Code :
{if count($item->photos) > 0}
{foreach from=$item->photos item="file"}

{* On teste s'il y a bien un fichier *}
{if $file->url neq ''}

{* On a maintenant accès à l'objet "file" qui comprend tous les attributs évoqués par l'aide *}

{* On crée un lien pour la lightbox - dans mon cas j'utilise généralement Fancybox que j'associe aux classes "galerie" *}
{* J'utilise aussi le plugin "Supersizer" pour créer les miniatures et les images agrandies à la volée, d'où le "href" suivant : *}
<a class="galerie" href="{supersizer path=$file->url passThru=true width='800' URL='true'}">

{* La miniature à partir de "$file->url", retaillée en 70 * 100 avec SuperSizer *}
{supersizer path=$file->url height='70' width='100'}

{* Fin du lien pour la lightbox *}
</a>

{/if}
{* fin du test de l'url *}

{/foreach}
{/if}

Cr4sH

Eh bien airelibre, ça fonctionne parfaitement !
J'ai donc finalement mis ce code :

Code :
{foreach from=$item->photo_objet item="file"}
{if $file->url neq ''}
<a id="icifancybox" href="{$file->url}">{$file->thumbnail()}</a>
{/if}

Ma thumb est bien appelée, bien générée, etc... au top !
Par contre, mon {$file->url} me retourne une url réelle, saurais-tu comment obtenir l'url www.domaine.com/image.jpg ?

Un grand grand merci pour ton temps ! Vraiment !
Pages : 1 2