Forum CMS Made Simple FR

Version complète : Module news
Vous consultez actuellement la version basse qualité d’un document. Voir la version complète avec le bon formatage.

bebopweb

Citation :#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~
#~ Version du CMS : 1.7.1
#~ Version du MLE si existante :
#~ Informations Système :
#~~~~~ NE PAS SUPPRIMER CE BLOC ~~~~~
Bonjour,
Dans mon menu horizontal je souhaite afficher un onglet "actualités" et en sous-menu récupérer le titre des différentes catégories créées. De ce fait je souhaite créer un lien sur chaque titre pour pointer sur la catégorie dans laquelle j'afficherai la liste des articles.
Chaque article pointant sur sa page détail.
Pensez-vous que cela soit possible ? Si une personne a déjà effectué cette opération je l'en remercie d'avance pour son aide et ses conseils.
Cordialement,
Bebopweb
Ca va être possible mais va falloir mettre la main à la pâte.

Dans les grande lignes :
- Faire une balise utilisateur qui liste la liste des catégories de news et retournant un tableau d'éléments (par exemple la combinaison Libelle / URL reconstituée de chaque catégorie)

- Modifier la gabarit de menu (panneau d'admin > menu manager > modifier le gabarit) et te positionner dans la boucle au bon endroit (bon courage, test un max afin de t'assurer de modifier au bon endroit). Une fois le bon endroit trouvé dans la boucle du code, tu appel ta balise utilisateur et il te restera à composer toi même la série des <ul></ul> et <li></li> afin de constituer les sous menu de ton menu "Actualités"

ca va te demander beaucoup de connaissance smarty / php mais le résultat devrait être entièrement dynamique Smile

bebopweb

Merci beaucoup Bess pour ta réponse.
Je me doutais bien que la tâche serait un peu rude mais bon...
Je viens de me mettre à ce CMS qui visiblement va me rendre de grands services (depuis le temps que je l'avais en ligne de mire ! Enfin je l'ai installé).
De ce fait si je souhaite avancer, il va me falloir, comme tu le soulignes, "mettre la main à la pâte". Mais au final ce ne sera que du positif je pense.
De plus le projet que je souhaite mener à bien avec CMSMS est à rendre fin juin. Donc d'ici là j'espère arriver à mes fins.
Encore merci.

Yvan

Hey, ça m'intéresse ça !

J'ai aussi besoin d'une balise utilisateur qui liste les catégories (ou en tout cas une partie d'entre elles) et d'une autre qui liste les champs personnalisés d'un certain type (en l'occurrence les case à cocher). Sauf que je ne comprends pas au travers de quelles variables les atteindre... J'imagine qu'il faut fouiller dans le code du module news et trouver le tableau dans lequel les noms de catégories et des champs personnalisés sont, c'est juste ? Quelqu'un aurait un petit indice pour m'aider à les localiser ?
yep et très facilement en + : requête SQL

Yvan

Merci ! Mais je rencontre un problème: le nom de mes champs contiennent un 'è' qui apparaît 'mal codé' (ce carré avec FFFD écrit sur 2 lignes) quand je fais un echo depuis la balise. Résultat, la liste que je construis ne se remplit pas !

Voilà ce que j'ai fait:
Balise utilisateur:
$i = 0;
$liste_themes = array();
try
{
$bdd = new PDO('mysql:host=mysql.patati.lo;dbname=patati', 'pseudo', 'password');
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
$info = $bdd->query('SELECT name FROM cms_module_news_fielddefs WHERE type=\'checkbox\'');

while ($donnees = $info->fetch()) {
$liste_themes[i] = $donnees[name];
$i++;
}
$info->closeCursor();

Et dans mon gabarit de sommaire d'article:
{liste_themes}
{if empty($liste_themes)} rien <br/> {/if}
{foreach from=$liste_themes item=theme}
{eval var=$theme} <br/>
{/foreach}

Et elle m'écrit 'rien'... Comment faire avec ces accents ? J'ai regardé dans la BDD et le champ 'name' de la table concernée a un interclassement 'utf8_general_ci'. Je sais pas trop ce que ça veut dire, mais ça a l'air juste...

Autrement, je me demandais: à partir du moment où je vais chercher les noms des champs dans la base de données, est-ce que j'ai meilleur temps de chercher les articles correspondant depuis la balise ou de les chercher depuis le template du menu ? Y a-t-il une différence en efficacité/clarté ? Y a-t-il une convention ?

Par ailleurs, les remarques sur ma balise sont les bienvenues. Merci !
commence par corriger ton script avec ceci

http://www.cmsmadesimple.fr/forum/viewtopic.php?id=1375

ca t'évitera de devoir laisser trainer des login/pass dans tes scripts Smile

Yvan

Super, ça m'est effectivement très utile !

Maintenant, j'ai ça:
//Retourne une liste des champs qui sont de type checkbox
//Normalement, ce sont des thèmes

$liste_themes = array();

//pour pouvoir travailler avec les objets, classes et méthodes du cms
global $gCms;

//connection à la bd cms
$db = &$gCms->GetDb();

$query = "SELECT name FROM cms_module_news_fielddefs WHERE type='checkbox' ORDER BY item_order";

//exécution de la requête
$dbresult = &$db->Execute($query);

while ($dbresult && !$dbresult->EOF) {
$liste_themes[] = $dbresult->fields['name'];

//enregistrement suivant
$dbresult->MoveNext();
}

//on ferme la connection
if ($dbresult) $dbresult->Close();

Je comptais faire un foreach sur ma liste de thèmes et, à l'intérieur, faire un foreach sur mes articles. Mais n'ai-je pas meilleur temps de faire une liste des articles dans une requête à la base de donnée plutôt que d'itérer X fois sur tous les articles ? (X étant fixe et compris en 5 et 10, donc pas énorme de toute façon) Il me semble que ça reviendrait au même... Bref, mes dernières questions tiennent tjs.
concernant les perf : une double itération sur moins de 1000 élements vaudra toujours mieux que faire de nombreuses requêtes ou des requêtes lourdes.

seulement j'ai pas compris comment tu comptais récupérer tes checkbox avec je cite : "une liste des articles dans une requête à la base de donnée"

en gros tes deux algo seraient quoi ?

Yvan

Il me semblait qu'il était possible de faire une requête un peu plus complexe pour récupérer tous les thèmes et tous articles (ou juste leurs titres par exemple) auxquels chacun d'entre eux est associé. Mais c'est un peu foireux, je crois. Je vais essayer de me contenter de la balise que j'ai déjà faite.

Sauf que...

1. Comment on fait pour se servir d'une variable créée dans une balise ? Si je termine ma balise par 'return $liste_themes;', comment faut-il que je récupère ce tableau dans mon gabarit ??? J'ai regardé à gauche, à droite et j'ai essayé plusieurs trucs, mais pas moyen de trouver comment récupérer une valeur retournée par une balise utilisateur !

2. Dans le gabarit du sommaire, j'aimerais tester si le champ $theme de l'objet $entry n'est pas vide. Alors je sais que $entry->fields existe. Je sais que fields est un tableau de champs et que l'un d'eux s'appelle $theme (contenu dans la propriété 'name'). Y a-t-il moyen d'atteindre la valeur de cette propriété name sans avoir à itérer sur l'ensemble des entrées de $entry->fields ?
En gros, je veux faire ça:

{foreach from=$themes item=theme}
<h1>{eval var=$theme}</h1>

{foreach from=$items item=entry}

{foreach from=$entry->fields item='field'}
{if $field->name=$theme}
{if $field->value==1}
<div>{eval var=$entry->title} ... ... </div>
{/if}
{/if}
{/foreach}

{/foreach}

{/foreach}

Mais le foreach du milieu me semble plutôt dispensable. Une idée ?
pour ta première question : http://www.smarty.net/manual/fr/language...ctions.php assign remplira ce rôle

pour ta seconde question ca me semble pas bizarre. reste ainsi et concatène tes 2 if du milieu plutôt

{if $field->name=$theme && $field->value==1}

Yvan

Ok, merci ! Mais je connais déjà la fonction assign... Et dans la doc Smarty, il n'y a rien qui me rapporte à la gestion de valeur retournée par une balise utilisateur. J'ai une balise appelée liste_themes et j'aimerai mettre la valeur qu'elle retourne dans une variable $themes {assign var="themes" value=liste_themes}, mais ça ne marche pas évidemment... Et si je fais simplement {liste_themes}, ça m'affiche Array.
Je comprends pas !
How to provide variables from a UDT to your page/template

Sometimes you need to provide calculated or processed information via PHP variables from a UDT to a page or template. To do this add a new UDT and call it e.g. "Var" and fill in the code below

global $gCms;
$smarty = &$gCms->GetSmarty();
$foo= "test"; // Variable you want to provide
$smarty->assign('foo', $foo); // make variable "foo" visible for CMSms

Now you are able to use the variable in pages or templates via Smarty:

{Var} {* Call the UDT "Var" before using its variable(s) *}
<p>The content of the variable "foo" is {$foo}.</p>

Output:

The content of the variable "foo" is test.

[source]

Yvan

Merci ! J'étais persuadé que ça se faisait grâce à return et que l'assign était à mettre dans le gabarit.
Les variables $gCMS et $smarty, elles sont pas définies de base ? Sans mettre leurs définitions, ça marche parfaitement...
définie le tout de même, si demain ils changent le nom des variable ton code continuera a fonctionner Wink

Yvan

Yes ! Je suis content que bebopweb n'ait pas mis le sujet en résolu Wink

Bon, trier les articles par catégories, ça c'est fait ! Même par champ, c'est cool. Mais j'ai alors deux questions:

1. par défaut, les articles sont triés par date. ça me va très bien, mais ça pose problème au moment où il y a plus d'articles que la limite par page, parce que ça va séparer les articles de même catégorie ou de même thème, par exemple.

Imaginons que l'article le plus récent et l'article le plus vieux sont de même catégorie, la catégorie (qu'elle commence par A ou par Z) se retrouvera sur la dernière et la première page avec seulement une partie des articles concernés !

Est-ce que je peux faire qqchose ? Bidouiller les fichiers du module News et créer mon propre critère d'ordre en réutilisant le code de ma balise ? Créer dans le template de liste d'articles mon propre système de page ? Dans ce cas, une idée ?

2. J'aimerais personnaliser la page de création d'articles pour, par exemple, ne laisser le choix que de cocher une seule case des huit champs de genre 'case à cocher', ou encore ajouter une directive du genre 'Vous ne pouvez cocher qu'une des huit cases suivantes'. Est-ce que c'est imaginable ? Comment est-ce que je ferais ça ???

Merci pour vos idées !

Yvan

Up !!! Smile

Personne n'a de suggestion ?