Region sans bloc pour le module story

Bonjour,
Je voudrais savoir comment mettre un region sans bloc dans ma page d'accueil pour le module story, je veux mettre les 2 dernières articles publié sur une region sans bloc, j'ai déjà fait le truc dans http://drupal.org/node/29139 mais çà ne marche toujours pas.

Merci d'avance

Version de Drupal : 

Salut Drugasy,

Pas sûr de comprendre ta question : tu veux créer une région dans laquelle tu affiches les 2 derniers articles publiés, c'est bien ça ?

Pourquoi tu veux que cette région soit "sans bloc" ? Si le bloc en question affiche les 2 derniers articles publiés, on arrive à ce que tu veux non ?

Vincent

Formations Drupal pour WEBMASTERS, DESIGNERS et DÉVELOPPEURS.

Donc, si tu affiches un bloc dans ta région, le bloc apparaît comme fractionné ? (désolé de répéter tout ce que tu dis, mais j'essaie de comprendre)

Si par "fractionné", tu veux dire qu'il y a trop d'espaces blancs, tu pourrais probablement résoudre ça avec CSS.

Mais tu dis que tu as utilisé la solution de la page http://drupal.org/node/29139, en principe ça devrait marcher. Peux-tu reproduire ici exactement le code que tu as utilisé (encadré par les balises <php ... ?> et nous dire surtout dans quel fichier/fonction tu as mis ce code ?

Vincent

Formations Drupal pour WEBMASTERS, DESIGNERS et DÉVELOPPEURS.

j'ai fait copier-coller du code dans http://drupal.org/node/29139 étape 1 dans region without block et je l'avais mis juste en bas de mon story.module (pas de fonction).

puis dans mon template j'ai fait (j'ai remplacé theme par le nom de mon theme)

function theme_regions() {
return array(
'right' => t('right sidebar'),
'left' => t('left sidebar'),
'content' => t('content'),
'header' => t('header'),
'footer' => t('footer'),
'region1' => t('region1')
         );
}

function _phptemplate_variables($hook, $variables) {
// Load region content assigned via drupal_set_content().
if ($hook == 'story' && !$vars['teaser']) {
foreach (array('region1', 'region2') as $region)
{
$variables[$region] = drupal_get_content($region);
}
}
return $variables;
}

puis j'ai mis
<?php print $region1 ?>
dans mon page.tpl.php et quand je vais dans administration puis block et que j'affecte une catégorie sur cette bloc, çà affiche un bock!!! grrr! or je veux avoir par exemple les 2 ou 5 dernières articles sur cette région.

Je pense que tu confonds plusieurs choses différentes : tu dis vouloir afficher une région sans bloc, puis tu vas dans l'admin pour affecter un bloc à une région... c'est contradictoire. :-)

Reprenons dans l'ordre. Il y a 2 grandes étapes pour arriver à ce que tu veux :

  • La déclaration d'une nouvelle région
  • L'affectation de contenu à cette région

La déclaration d'une nouvelle région

Visiblement, cette étape ne te pose pas de pb : il faut effectivement déclarer une fonction theme_regions() comme tu l'as indiqué, puis rajouter <?php print $region1 ?> (si la région s'appelle region1 bien sûr) dans page.tpl.php.

L'affectation de contenu à une région

C'est là que tu dois faire attention :

  • SOIT tu vas dans admin > blocs, et tu affectes un (ou plusieurs) bloc(s) à la région
  • SOIT tu affectes "programmatiquement" du contenu à une région avec la fonction drupal_set_content()

(En l'occurrence, ton code ne fait ni l'un ni l'autre, tu as dû regarder au mauvais endroit sur la page de drupal.org.)

Voici le code pour mettre en oeuvre la 2e option :

<?php
function _phptemplate_variables($hook, $variables) {
 
// Si je suis sur le point d'afficher une page...
 
if ($hook == 'page') {
   
// récupère le contenu du node 80
   
$content = node_view(node_load(80));
   
// récupère le contenu du node 148
   
$content .= node_view(node_load(148));
   
// affecte le contenu récupéré à la région "region1"
   
drupal_set_region('region1', $content);
  }
  return
$variables;
}
?>

Dans cet exemple, j'ai indiqué en dur l'ID des nodes que je voulais récupérer mais tu pourrais remplacer ça par une requête SQL qui récupère les X derniers.

Pour conclure, je te conseille de mettre tout ton code dans un fichier template.php, à créer dans le répertoire de ton thème (sinon, le jour où tu mettras à jour ton site, le code que tu as mis dans story.module sera écrasé).

Et puis, j'avais écrit un petit tutoriel sur le sujet qui t'aidera ptêtre à y voir plus clair : Créer de nouvelles régions (comme "en-tête", "barre de gauche"...) dans une page.

Vincent

Formations Drupal pour WEBMASTERS, DESIGNERS et DÉVELOPPEURS.

Bonjour,

<?php
function _phptemplate_variables($hook, $variables) {
 
// Si je suis sur le point d'afficher une page...
 
if ($hook == 'page') {
   
// récupère le contenu du node 80
   
$content = node_view(node_load(80));
   
// récupère le contenu du node 148
   
$content .= node_view(node_load(148));
   
// affecte le contenu récupéré à la région "region1"
   
drupal_set_region('region1', $content);
  }
  return
$variables;
}
?>

je met çà dans mon template.php ou dans le bloc?
Désolé mais je suis un peu perdu

Qu'est ce que je suis bête!!!! j'ai pas bien lu le topic dans drupal.org! je me suis tout de suite rendu sur region without block sans compendre le principe! pourtant çà m'a pris 2 mois de réfléxion!
bon, je vais l'essayer et vous donnez le compte rendu.

Salut Drugasy,

Je suis un peu perdu en lisant tes questions : tu me demandes d'abord si tu dois mettre le code que je t'ai indiqué dans template.php ou dans le bloc, mais est-ce que cette conversation n'a pas démarré en disant que tu ne voulais PAS de bloc ?

Eh oui, il n'y a PAS de bloc. Le code va donc dans template.php.

Pour la requête SQL qui ramène les nodes, ça va ressembler à quelque chose comme (j'écris ça de mémoire, ce code est à tester) :

<?php
// Récupère les 2 derniers nodes de type "story"
$result = db_query_range(db_rewrite_sql(
                        
"SELECT n.nid FROM {node} n
                         WHERE n.type = 'story' AND n.status = 1
                         ORDER BY n.created DESC"
), 0, 2);
                         
// Charge le contenu de ces nodes dans la variable $output
$output = '';
while (
$o = db_fetch_object($result)) {
 
$output .= node_view(node_load($o->nid));
}
   
// Affecte la variable $output à la région "region1"
drupal_set_content('region1', $output);
?>

Il faut mettre ce code à la place de $content = node_view(node_load(80)); dans l'exemple précédent.

Il faudra peut-être adapter le code à tes propres besoins : si tu veux plus que 2 nodes, remplace le "2" par le chiffre souhaité. Si tu veux autre chose que les nodes de type "story", remplace "story" dans la requête...

Voilà, tiens-nous au courant.

Vincent

Formations Drupal pour WEBMASTERS, DESIGNERS et DÉVELOPPEURS.