Est ce la bonne méthode pour remplir un contenu particulier

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour,

Je n'ai trouvé ni de réponses sur les forums ni de modules ou autre pour répondre à mon problème suivant.

Lister les document en workflow selon le rôle du user connecté.

En gros, si je suis un utilisateur du service commercial, j'ai la liste des workflows en cours de mon service commercial.

Comme je n'ai rien trouvé sur ce sujet et que view ne permet manifestement pas ce genre de choses. J'ai donc inséré le code php suivant dans un contenu.

Ma question est la suivante : Est ce la bonne méthode ?
Surtout au niveau de la sortie du résultat car la série de "print" ça me parait un peu cracra.

Voici le code.

$args1 = array();

global $user;

$sql = "SELECT node.title as title, node.nid as nid,workflow_access.rid,workflow_states.weight,users_roles.uid,workflow_access.grant_view FROM node INNER JOIN ";
$sql .= "workflow_node ON workflow_node.nid = node.nid ";
$sql .= "INNER JOIN workflow_access ON workflow_access.sid = workflow_node.sid ";
$sql .= "INNER JOIN users_roles ON users_roles.rid = workflow_access.rid ";
$sql .= "INNER JOIN workflow_states ON workflow_states.sid = workflow_access.sid ";
$sql .= "WHERE workflow_access.grant_view=1 AND workflow_states.weight<10 ";
$sql .= "AND users_roles.uid =".$user->uid;

// $sql = db_rewrite_sql($sql);
$r = db_query($sql, 0);
$resultats = array();

print "";
print "";
print "";
print "";

print "";
$v_num_01 = 0;
while ($item= db_fetch_object($r)) {
if ($v_num_01%2 ==0){
$v_str_01 = "";
} else {
$v_str_01 = "";
}
$v_str_01 .= "nid.">".$item->title." ".$item->nid."";
print $v_str_01;
$v_num_01 +=1;
}
print "";
print "";

Version de Drupal : 

Il y a plusieurs façon de mettre en place un workflow dans Drupal, donc ce serait sympa de préciser quel module tu utilises dans ta question ;)

Ceci dit vu les requêtes SQL j'en déduit que tu utilises le module Workflow :P

Ma réponse sera d'abord : est-il pertinent d'écrire un module custom alors que tu peux faire ce que tu souhaites avec Views ?

D'ailleurs le module Workflow créé deux vues par défaut workflow_summary et workflow_pending. Après, il est assez facile d'ajouter un filtre (ou un argument, en fonction de ce que tu veux faire) par rôle...

(*) Ok Yoran et certains codeurs ne seront pas forcémment - non sans raison - d'accord avec moi ici et il te donnera probablement une méthode fondée sur l'API, sans être codeur je pense que ton code ne tire pas parti de l'API de Drupal (cf http://api.drupal.org/).

Merci pour cette rapide réponse.

Oui, j'utilise le module workflow.

"D'ailleurs le module Workflow créé deux vues par défaut workflow_summary et workflow_pending. Après, il est assez facile d'ajouter un filtre (ou un argument, en fonction de ce que tu veux faire) par rôle..."

Je suis preneur.
Comment récupérer le rôle du user connecté et comment le passer en argument de la vue workflow_summary ?

Car je n'ai vraiment pas réussi avec views en partant des views de workflow déjà présents.

En revanche, ma question est surtout axée sur l'affichage et la mise en format des données sorties. Le fait de faire un print....

Car j'aurai d'autres besoin que views semble ne pas pouvoir m'aider.
En effet, la liste des tâches en cours du user connecté.

La problématique semble du côté arguments ou filtre incompréhensible pour un newbie comme moi.

@David ROFL Bon ok je dis plus rien moi :)))) Tu sais je crois que j'ai jamais fait un seul site qui utilise views, et personne n'est mort ;-)

Mais chacun son truc, moi ce qui m'agace en revanche, c'est ceux qui vendent à leur prospect un views qui 'fiabilise leur investissement' et toi tu repasses derrière, et tu te fais "jeter" car tu proposes de bosser "proprement"...

D'ailleurs faudra qu'on m'explique la rentabilisation de l'investissement de Views1 sur Views2... ;-)

@tff

Ton code est juste, et devrait fonctionner, juste quelques remarques :
1/ Tu serais pas javaiste toi dés foi ? ;-) En php tu peux utiliser les multi-line strings, c'est bien pratique.
2/ Penses à utiliser les %d ou %s pour passer des paramètres à tes requêtes. C'est plus joli et en plus cela prend en charge un peu de sécurité (échappement des chaînes par ex. )
3/ Le db_rewrite_sql ne fonctionnera (il me semble) que si tu aliases ta table node avec n (node as n). Et du coup tu ne devrait pas être obligé d'ajouter dans ta requête la partie "access".
4/ Pour être certain que ta requete est bonne, david à raison, tu peux utilisre Views2... pour générer la requête et tu jetes le reste ;-p.

Sinon, seule remarque

<?php
$args1
= array();
global
$user;
$sql = "
 SELECT
        node.title,
       node.nid,
      workflow_access.rid,
       workflow_states.
       weight,
        users_roles.uid,
       workflow_access.grant_view
    FROM node
 INNER JOIN workflow_node ON workflow_node.nid = node.nid
   INNER JOIN workflow_access ON workflow_access.sid = workflow_node.sid
  INNER JOIN users_roles ON users_roles.rid = workflow_access.rid
    INNER JOIN workflow_states ON workflow_states.sid = workflow_access.sid
    WHERE
     workflow_access.grant_view=1 AND
       workflow_states.weight<10 AND
       users_roles.uid = %d"
;

//$sql = db_rewrite_sql($sql);
$cursor = db_query($sql, $user->uid);

....
?>

Merci pour le %d, je la mets de suite.

Tout le code fonctionne bien.

J'aurai préféré également passer par view pour mettre en forme le résultat proprement sans passer par ma série de print.

Mais sauf erreur de ma part, view ne me remonte pas tous les champs nécessaires aux liaisons de table.

A moins de pouvoir forcer directement la requête ? Mais là non plus je ne sais pas.

Ca je ne te dirais pas, j'utilise pas views. Pour moi c'est une usine à gaz qui cherche à faire un truc qui techniquement ne fonctionnera jamais de manière optimum (optimum = aussi propre qu'un travail fait à la main). Autant CCK a, avec le temps réussi à y arriver, autant views, je n'y crois pas. Autant chercher un générateur graphique de requêtes SQL qui fasse aussi bien que la requête elle-même, on peut y arriver, mais à terme cela devient aussi compliqué que la dite requête ;-) Sans compte que le code XHTML produit est un véritable bazaar.

Bref, mis à part les cas où le client veut pouvoir créer ses vues lui-même, je ne vois guère ce que cela apporte. Tu vas au mieux t'économiser quelques "print" mais à la limite, tu peux remplacer cela par des templates, ce sera toujours plus rapide.

@Yoran : Ce n'est pas une critique, bien au contraire, simplement pour dire qu'il y a deux manière de faire, pour celui qui sait coder (et qui va gagner en perf, je ne peux pas argumenter car c'est vrai) et celui qui sait utiliser views (et quand on a un site avec fréquentation moyenne et un bon serveur) qui peut faire la même chose sans coder...

Ceci dit ton code fait appel à l'API (db_query vs query SQL en PHP traditionnelle), quand même :P

Si je savais coder nul doute que j'opterai pour la même solution que toi simplement j'indique qu'il est possible de faire ça avec Views :P

@david
Hey, on commence à se "connaître", je ne prenais pas cela pour une critique, au contraire, ta remarque m'a fait mourir de rire :) Tu sais que j'ai maintenant des clients (potentiels) qui me contactent pour en me demandant direct "il parait que vous êtes anti-views" !! Je vais mettre cela sur ma carte de visite si ça continue ;-)

Plus sérieusement oui, j'utilise le framework drupal, et heureusement, sans quoi cette plate-forme manquerait un peu de sel ;-) Maintenant il n'y a pas d'élitisme dans mon propos, avec le bon d'un côté et les mauvais de l'autre. Je comprend parfaitement l'intérêt de views, mais ce qui me sidère c'est que si tu compares la complexité de ce machin, et celle consistant à apprendre PHP/Drupal/SQL, je ne suis pas certain que la courbe d'apprentissage views soit gagnante.

Cela étant dit, ce constat s'explique peut-être par le fait qu'à chaque fois que je suis confronté à views, je panique littéralement ;-)

Merci pour toutes vos réponses.

Je suis plus d'avis de Yoran.

Partant du principe qu'on n'est jamais mieux servi que par soi même : si je n'arrive pas à faire avec view, je le fait à la mimine.

Post résolu.