Forum CMS Made Simple FR

Version complète : [Résolu] Balise utilisateur
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.
Citation :#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~
#~ Version du CMS: ?
#~ Nom de l'hébergeur : OVH
#~ Informations Système :
#~ ----------------------------------------------
#~ Cms Version: 1.9.2
#~ Installed Modules:
#~ * CMSMailer: 2.0
#~ * FileManager: 1.0.3
#~ * MenuManager: 1.7.4
#~ * Search: 1.6.8
#~ * News: 2.11
#~ * nuSOAP: 1.0.2
#~ * Printing: 1.1.1
#~ * ThemeManager: 1.1.3
#~ * TinyMCE: 2.8.2
#~ * CGExtensions: 1.22.1
#~ * TreeManager: 0.6.0
#~ * ModuleManager: 1.4
#~ * Captcha: 0.4.3
#~ * FrontEndUsers: 1.12.8
#~ * CGCalendar: 1.5.6
#~ * SelfRegistration: 1.6.7
#~ * Forum: 0.9.4
#~ * Archiver: 0.2.3
#~ * CustomContent: 1.7.3
#~ Config Information:
#~ * php_memory_limit:
#~ * process_whole_template: false
#~ * output_compression: false
#~ * max_upload_size: 35000000
#~ * default_upload_permission: 664
#~ * url_rewriting: none
#~ * page_extension:
#~ * query_var: page
#~ * use_hierarchy: true
#~ * image_manipulation_prog: GD
#~ * auto_alias_content: true
#~ * locale:
#~ * default_encoding: utf-8
#~ * admin_encoding: utf-8
#~ * set_names: true
#~ Php Information:
#~ * phpversion: 5.2.9
#~ * md5_function: On (Vrai)
#~ * gd_version: 2
#~ * tempnam_function: On (Vrai)
#~ * magic_quotes_runtime: Off (Faux)
#~ * E_STRICT: 0
#~ * memory_limit: 128M
#~ * max_execution_time: 60
#~ * output_buffering: On
#~ * safe_mode: Off (Faux)
#~ * file_uploads: On (Vrai)
#~ * post_max_size: 15M
#~ * upload_max_filesize: 35M
#~ * session_save_path: /tmp (1777)
#~ * session_use_cookies: On (Vrai)
#~ * xml_function: On (Vrai)
#~ Server Information:
#~ * Server Api: cgi
#~ * Server Db Type: MySQL (mysql)
#~ * Server Db Version: 5.0.91
#~ ----------------------------------------------
#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~


Bonjour,

Je cherche a mettre une balise dans une autre balise.

J'ai tenté : echo "Le nombre d'enregistrement(s) est de {rr_somme_enreg_table table=ma_table}";
Bonsoir,
première remarque, si tu ne mets pas à jour CMSMS, tu vas te faire houspiller par les mods!
Pour ta question, c'est du smarty.
Je ne comprends pas trop ton exemple mais pour appeler une balise dans une autre tu peux utiliser {assign var='name' value='balise1'} et ensuite {balise2 param=$name}... je n'ai pas d'exemple concret en tête mais j'ai déjà utilisé cette méthode.
Vois si ça s'applique à ton cas.
Je sais que je ne suis pas très à jour mais a chaque mise à jour j'ai des soucis. De plus la mise à jour entre la 1.8.2 et la 1.9.x et plus délicate donc je prends mon temps de bien tous tester avant.

Je ne suis pas sur de m'être bien exprimé. Je suis dans une balise utilisateur avec mon code PHP et au lieu de recopier un bout de code je l'ai mis dans une autre balise utilisateur. Je cherche seulement à l'appeler. Ca me semble très bête mais je suis coincé donc j'ai recopié mon code. Mais je préfèrerais coder plus propre.
Je crois comprendre...
peut-être ici la réponse http://wiki.cmsmadesimple.org/index.php/..._.28UDT.29

Mais si ton code devient trop complexe, il vaut peut-être mieux créer un module.
Citation :De plus la mise à jour entre la 1.8.2 et la 1.9.x et plus délicate

ô_O'

je sais pas ou tu tires une telle information mais non, si l'on suit scrupuleusement les guides mis à dispo, la mise à jour se fait toujours sans soucis...
Bonjour,

Du fait qu'il n'y a pas de mise à jour par différence mais complète.

jissey : Avant que mon code devienne complexe je serais devenue "bon" Smile Blague a part je n'ai pas réussi à comprendre le bout de code que j'avais déjà vue en french. Faut dire que mon ami Google fonctionne pas mal en se moment. Je post rarement car très souvent la solution existe. Le problème est de la comprendre quand on la trouve.

Dans une page {balise_utilisateur1} marche nikel et dans une balise utilisateur balise_utilisateur2 l'appel du code {balise_utilisateur1} met une erreur. Pourtant le tout se retrouve sur une page au final.
Bonsoir,
donc, il y a un message d'erreur et pourtant ça fonctionne.
Je ferai des essais lundi car ce cas de figure m'intéresse et j'y serai confronté un jour ou l'autre.
Est-ce que tu peux "dévoiler" ton exemple pour que je puisse tenter de t'aider.
Bon week-end.
Je me suis décidé à mettre à jour le site pour voir si le problème persiste avec la dernière version. Mais mon 1er redémarrage me marque des erreurs. J'ai suivi à la lettre le tuto de JCE.
Pour l'instant j'en suis a :
Fatal error: Call to undefined method Content::URL() in /home/users/xtra/cmsms/admin/listcontent.php on line 723
Dans l'admin quand je cherche mes pages. J'essai de remettre tous en place est je reviens avec mes codes

Merci de t'intéresser a mon problème.
Ouf j'ai fini la mise à jour sans trop en baver. Je commence a mieux saisir les arcanes de CMSMS.

Revenons a mon problème :

Dans ma page j'ai mis {rr_ak_rech_multi}


rr_somme_enreg_table <--- nom de ma balise utilisateur 1

Code :
// Requête SQL
$sql = "SELECT * FROM ".$params['table'] ;

// Execution de la requête
$res = mysql_query($sql) or die ("Exécution de la requête impossible");

// Compte le nombre de ligne de résultat.
$nb_enregistrement = mysql_num_rows($res);

// Affichage du résultat
echo $nb_enregistrement;



rr_ak_rech_multi <--- nom de ma balise utilisateur 2

Code :
//Vérifie si on a choisit une valeur ici Nom
if(!empty($_POST['nom']))
{
// Attribue à la variable $nom, le nom du militaire
$nom = $_POST['nom'];
// Attribue à la variable $periode, la période de la recherche du militaire
$periode = $_POST['periode'];

// Requête SQL
$sql = "SELECT * FROM ak_matricules WHERE nom LIKE '".$nom."' AND periode='".$periode."' ORDER BY nom DESC LIMIT 0 , 100";

// Execution de la requête
$res = mysql_query($sql) or die ("Exécution de la requête impossible");

// Compte le nombre de ligne de résultat.
$nb_enregistrement = mysql_num_rows($res);

echo "<div align=center>";
echo "<table border=1 rules=all  bordercolor='#000000'";
echo "<tr><td colspan=9 align=center valign=middle height=40>".$nb_enregistrement." soldat(s) trouvé(s)/{rr_somme_enreg_table table=ak_matricules} soldat(s)</td></tr>"; <---- LIGNE QUI NE FONCTIONNE PAS CORRECTEMENT
echo "<tr>";
echo "<td width=100 height=40 align=center><strong>Noms</strong><br></td>";
echo "<td width=100 height=40 align=center><strong>Prénoms</strong><br></td>";
echo "<td width=40 height=40 align=center><strong>Pages</strong><br></td>";
echo "<td width=60 height=40 align=center><strong>Matricule</strong><br></td>";
echo "<td width=100 height=40 align=center><strong>Lieu</strong><br></td>";
echo "<td width=100 height=40 align=center><strong>Département</strong><br></td>";
echo "<td width=100 height=40 align=center><strong>Pays</strong><br></td>";
echo "<td width=240 height=40 align=center><strong>Régiments</strong><br></td>";
echo "<td width=60 height=40 align=center><strong>Réf.</strong><br></td>";
echo "</tr>";

while ($donnees=mysql_fetch_array($res))

    {
        echo "<tr height= 20 align=center>";
            echo "<td align=center>$donnees[nom]</td>";
            echo "<td align=center>$donnees[prenoms]</td>";
            echo "<td align=center>$donnees[page]</td>";
            echo "<td align=center>$donnees[matricule]</td>";
            echo "<td align=center>$donnees[lieu_origine]</td>";
            echo "<td align=center>$donnees[dep_origine]</td>";
            echo "<td align=center>$donnees[pays_origine]</td>";
            echo "<td align=center>$donnees[regiments]</td>";
            echo "<td align=center>$donnees[references]</td>";
        echo "</tr>";
    }    
    echo "</table>";

echo "</div>";
}
Bonsoir,
je comprends mieux la problématique...
Rapidement, première remarque, il faudrait utiliser les outils de CMSMS pour requêter la base.
CMSMS utilise la librairie ADODB pour dialoguer avec MySQL. Pour faire ta requête tu devrais faire:
Code :
$db =& $this->GetDb();
     $sql = 'SELECT * FROM ".$params['table'];
     $dbresult =& $db->Execute($sql);
echo $dbresult -> RecordCount()
Un tuto ADODB en french:
http://phplens.com/phpeverywhere/adodb_french

Je teste la compilation de la balise2 dans la balise1 demain matin.
Comme ceci peut-être ?
Oui, merci JLC, c'est mieux en français.
Donc pour résumer, dans ton UDT rr_somme_enreg_table tu mets:
Code :
global $gCms;
$db = &$gCms->GetDb();
     $sql = "SELECT * FROM ".$params['table'];
     $dbresult =& $db->Execute($sql);
echo $dbresult -> RecordCount();
et dans rr_ak_rech_multi (là, je ne refais pas le SQL):
Code :
//appel de la balise rr_somme_enreg_table
global $gCms;
$smarty = &$gCms->GetSmarty();
           $smarty_data = "{rr_somme_enreg_table table=ak_matricules}"; //UDT précédente.
           $smarty->_compile_source('temporary template', $smarty_data, $_compiled ); //compilation/interprétation de la balise. Le résultat est rangé dans $_compiled
@ob_start(); //on ouvre un tampon: ce qui suit sera executé en mémoire sans affichage.
           $smarty->_eval('?>' . $_compiled); //evaluation/exécution du résultat de la compile.
           $final_compiled = @ob_get_contents();//récupération du contenu du tampon dans une variable.
@ob_end_clean(); //fin tampon
//Vérifie si on a choisit une valeur ici Nom
if(!empty($_POST['nom']))
{
// Attribue à la variable $nom, le nom du militaire
$nom = $_POST['nom'];
// Attribue à la variable $periode, la période de la recherche du militaire
$periode = $_POST['periode'];

// Requête SQL
$sql = "SELECT * FROM ak_matricules WHERE nom LIKE '".$nom."' AND periode='".$periode."' ORDER BY nom DESC LIMIT 0 , 100";

// Execution de la requête
$res = mysql_query($sql) or die ("Exécution de la requête impossible");

// Compte le nombre de ligne de résultat.
$nb_enregistrement = mysql_num_rows($res);

echo "<div align=center>";
echo "<table border=1 rules=all  bordercolor='#000000'";
echo "<tr><td colspan=9 align=center valign=middle height=40>".$nb_enregistrement." soldat(s) trouvé(s)/."$final_compiled." soldat(s)</td></tr>"; <---- appel de la variable résultante de ta balise rr_somme_enreg_table
echo "<tr>";
echo "<td width=100 height=40 align=center><strong>Noms</strong><br></td>";
echo "<td width=100 height=40 align=center><strong>Prénoms</strong><br></td>";
echo "<td width=40 height=40 align=center><strong>Pages</strong><br></td>";
echo "<td width=60 height=40 align=center><strong>Matricule</strong><br></td>";
echo "<td width=100 height=40 align=center><strong>Lieu</strong><br></td>";
echo "<td width=100 height=40 align=center><strong>Département</strong><br></td>";
echo "<td width=100 height=40 align=center><strong>Pays</strong><br></td>";
echo "<td width=240 height=40 align=center><strong>Régiments</strong><br></td>";
echo "<td width=60 height=40 align=center><strong>Réf.</strong><br></td>";
echo "</tr>";

while ($donnees=mysql_fetch_array($res))

    {
        echo "<tr height= 20 align=center>";
            echo "<td align=center>$donnees[nom]</td>";
            echo "<td align=center>$donnees[prenoms]</td>";
            echo "<td align=center>$donnees[page]</td>";
            echo "<td align=center>$donnees[matricule]</td>";
            echo "<td align=center>$donnees[lieu_origine]</td>";
            echo "<td align=center>$donnees[dep_origine]</td>";
            echo "<td align=center>$donnees[pays_origine]</td>";
            echo "<td align=center>$donnees[regiments]</td>";
            echo "<td align=center>$donnees[references]</td>";
        echo "</tr>";
    }    
    echo "</table>";

echo "</div>";
}

Voilà, ceci devrait marcher, je ne peux pas tester sans ta bdd.
J'ai fait 2 balises qui fonctionnent pour tester.
comptage:

Code :
global $gCms;
$db = &$gCms->GetDb();
     $sql = "SELECT * FROM ".cms_db_prefix()."content";
     $dbresult =& $db->Execute($sql);
echo $dbresult -> RecordCount();

et display_comptage

Code :
global $gCms;
$smarty = &$gCms->GetSmarty();
           $smarty_data = "{comptage}";
           $smarty->_compile_source('temporary template', $smarty_data, $_compiled );
@ob_start();
           $smarty->_eval('?>' . $_compiled);
           $final_compiled = @ob_get_contents();
@ob_end_clean();
echo "Il y a ".$final_compiled." pages dans le site.";
Bonsoir,

Merci beaucoup pour cette réponse bien détaillée. J'ai fait fonctionner mon code et en plus je l'ai compris.
J'ai modifié mes 2 UDT pour avoir des connections ADODB. Le code via ADODB me semble bien plus compliqué.

Pour partir sur de bonne base j'ai deux questions qui me viennent à l'esprit suite au changement que tu me fais apporter à mon code.

1 - Est-ce que mon code PHP avec la connexion via ADODB est un standard ? Je veux dire par la, si je change de CMS ou si soyons fou je code sans CMS mon code sera obsolète.
2 - Est-ce que le code via ADODB est plus, moins optimisé que la méthode que j'avais utilisée ?

JLC : Effectivement j'avais trouvé la version française du 1er lien que jissey m'avais mis en lien. J'avais bien fait quelques tests en trifouillant. Le code était tellement barbare pour moi et je m'attendais aussi pas, a autant de ligne de code pour si peu (dans ma vision de débutant). Merci quand même.
Citation :Est-ce que mon code PHP avec la connexion via ADODB est un standard ? Je veux dire par la, si je change de CMS ou si soyons fou je code sans CMS mon code sera obsolète.

Ne t'y méprend pas, coder avec ADODB n'ajoute pas de performance, il ne rend pas plus standard et ce code ne fonctionnera pas sur un autre CMS si celui ci ne fonctionne pas sur ADODB également

ADODB c'est ce qu'on appel un "best practice", c'est une manière de concevoir les choses plus qu'une nouvelle technologie. C'est avoir la possibilité de faire abstraction du type de base de donnée (Oracle ? mysql ? postgresql ? nosql ?) par rapport à ton code.

Ainsi techniquement ton installation CMSMS sous mysql fonctionnera exactement de la même manière que sous oracle car c'est ADODB qui se charge de cacher les petites différences de fonctionnement. Et dieu sait qu'il y en a des différences !

Coder en SQL pure pour attaquer une base Mysql c'est risquer demain de tout recoder par ce que ton nouvel environnement n'est pas sous Mysql, avec ADODB c'est plus un soucis.

Second point : les fonctionnalités de ADODB sont extrêmement puissante, pour exemple la façon de récupérer les données de ta requête dans un tableau de donnée et de le parcourir de manière sécurisé dans un simple "while()"

bref, un best-practice Smile
J'avais peur ce cette réponse qui me confirme mes doutes. merci bess.
C'est un best-practice, oui car il a été choisi par les dev, mais ça facilite quand même pas mal le code pour les fainéants comme moi.
Quant à la performance, de ce que j'ai pu lire, c'est la librairie d'abstraction la plus rapide.
Lu aussi que depuis PHP5 ADODB MySQL soustraite avec PDO...