Comment créer des liens avec Calendar Block (ne pas confondre avec Calendar tout court)

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.

Suite au dernier POST de lektum ici : http://drupalfr.org/node/6713, je dépose une demande sur le forum développement car une chose m'intéresse fortement : Pouvoir lier des pages au module Calendar Block en fonction d'une date précise(http://drupal.org/project/calendar_block)

Au même titre que lektum, je en comprends pas le fonctionnement du module, y-a-t-il du dév à prévoir ?

Maxime.

Forum : 
Version de Drupal : 

J'ai travaillé sur ce que je voulais réaliser car la réponse était trop longue à chercher. L'objectif est d'adapter le module Calendar Block pour qu'il attaque une vue (ou autre) en fonction de sa présence ou non en BDD. Ci-dessous la fonction améliorée :

/**
* Theme the calendar.
*/
function theme_calendar_block($calendar) {
  $row_counter = 0;
  $num_rows = (count($calendar->dates) / 7);
  $weekdays = array_values($calendar->weekdays);

  $output[] = '  <div id="calendar">';

  // Create the month and year row
  $output[] = '    <div id="calendar_row'. $row_counter .'" class="clear-block">';
  $output[] = '      <div id="nav" class="clear-block">';
  $output[] = '        <div id="calendar_prev" class="'. ($calendar->month > 1 ? ($calendar->month - 1) ."-$calendar->year" : "12-". ($calendar->year - 1)) .'"><span>&lt;</span></div>';
  $output[] = '        <div id="calendar_month">'. t($calendar->month_str) .' '. $calendar->year .'</div>';
  $output[] = '        <div id="calendar_next" class="'. ($calendar->month < 12 ? ($calendar->month + 1) ."-$calendar->year" : "01-". ($calendar->year + 1)) .'"><span>&gt;</span></div>';
  $output[] = '      </div>';

  // Create the weekdays row
  foreach ($weekdays as $key => $day) {
    $class = (isset($class)) ? ($key == 6 ? ' last' : '') : ' first';
    $output[] = "      <div class="hok top $class"><span>". t($day) ."</span></div>";
  }
  $output[] = "    </div>";
  $row_counter++;

  $day_counter = 0;

  // Create the days rows
  $output[] = "    <div class="week" id="calendar_row$row_counter">";
  foreach ($calendar->dates as $date) {
    // Create an easy readable date for modules which use hook_calendar_block().
    $date->date = (drupal_strlen($date->month) == 1 ? "0$date->month" : $date->month) ."-$date->day-$date->year";

    $class = ($day_counter == 0) ? ' first' : ($day_counter == 6 ? ' last' : '');
    if ($date->month !== intval($calendar->month)) {
      $class .= ' disabled';
    }
    if ($calendar->day && $date->day == $calendar->day) {
      $class .= ' today';
    }
    // Create a variable for day, so other modules can't interfere in hook_calendar_block
    $current_day = $date->day;

    // Create a variable for the weekday as a reference for ather modules
    $date->weekday = $weekdays[$day_counter];

    // Give other modules the opportunity to change the content for each date
    foreach (module_implements('calendar_block') as $module) {
      $function = $module .'_calendar_block';
      $function($calendar, $date, 'alter');
    }

    $day_counter = ($day_counter < 6) ? $day_counter + 1: 0;
    $output[] = "      <div class="hok $class $date->date">";
   
    # MODIFICATION POUR CREER UN LIEN EN FONCTION DE LA PRESENCE D'UNE PAGE D'UNE VUE
    $ok = 0;
    $display_title_view = $current_day."_".$calendar->month."_".$calendar->year;
    $result = db_query("select display_title from drupviews_display where display_title = '$display_title_view'");
    while ($field = db_fetch_object($result)) {     
   $ok = 1;
   if ($class != ' first disabled' && $class != ' disabled' && $class != ' last disabled') {
      $output[] = "        <span><a href="?q=node/".$display_title_view."/evt">". ($date->content ? $date->content : $current_day) ."</a></span>";
   } else {
     $output[] = "        <span>". ($date->content ? $date->content : $current_day) ."</span>";
     }
    }
   
    if ($ok == 0) {
      $output[] = "        <span>". ($date->content ? $date->content : $current_day) ."</span>";  # ligne conservée par Maxime
    }
    # FIN MODIFICATION

    if ($day_counter > 0) {
      $output[] = "        <div class="border_right"></div>";
    }
    if ($row_counter < $num_rows) {
      $output[] = "        <div class="border_bottom"></div>";
    }
    $output[] = "      </div>";

    if ($row_counter < $num_rows && $day_counter == 0) {
      $row_counter++;
      $output[] = "    </div>";
      $output[] = "    <div class="week" id="calendar_row$row_counter">";
    };
  }
  $output[] = "      <div class="clear-block"></div>";
  $output[] = "    </div>";
  $output[] = "  </div>";
  return join("\n", $output);
}

C'est ce pavé que j'ai ajouté :

    # MODIFICATION POUR CREER UN LIEN EN FONCTION DE LA PRESENCE D'UNE PAGE D'UNE VUE
    $ok = 0;
    $display_title_view = $current_day."".$calendar->month."".$calendar->year;
    $result = db_query("select display_title from drupviews_display where display_title = '$display_title_view'");
    while ($field = db_fetch_object($result)) {    
$ok = 1;
if ($class != ' first disabled' && $class != ' disabled' && $class != ' last disabled') {
   $output[] = "        <span><a href="?q=node/".$display_title_view."/evt">". ($date->content ? $date->content : $current_day) ."</a></span>";
} else {
   $output[] = "        <span>". ($date->content ? $date->content : $current_day) ."</span>";
}
    }
  
    if ($ok == 0) {
      $output[] = "        <span>". ($date->content ? $date->content : $current_day) ."</span>";  # ligne conservée par Maxime
    }
    # FIN MODIFICATION

Je cherche maintenant à récupérer le rôle par exemple d'un utilisateur ou encore son groupe d'appartenance (OG) pour filtrer la vue à la volée.
Je ne suis pas certain que mon code soit bien implémenter car lors d'une future maj...perdu...Si quelqu'un peut m'aider dans ce sens, c'est avec plaisir que j'accepte.

Maxime.

Comme c'est une fonction theme que tu cherches à modifier, tu as la possibilité de faire un override de la fonction plutôt que de la changer dans le module; ainsi tu ne perdras rien lors de la mise à jour (sauf si c'est bien sûr le code de la fonction originelle à trop changé).

Donc il faut copier coller ta fonction dans le fichier template.php de ton theme, la renommer phptemplate_calendar_block et insérer tes changements.

C'est ta fonction qui sera alors appelée pour afficher les informations et non plus la fonction présente dans le module originel.

Une solution un peu plus propre à mon sens c'est de carrément créer un module et d'insérer dedans le même code; parce que j'aime pas trop avoir le php dispersé à droite et à gauche mais la solution template.php fonctionne ;-)

Salut,

Tout d'abord merci pour cette information que je vais appliquer à la lettre.
Pour ce qui est de la création d'un module, je n'ai pas encore trouvé de documentation en français suffisamment claire pour le moment, en fait j'ai peu cherché dans ce sens pour le moment. J'ai déployé drupal il n'y a qu'une petite semaine.

Pour la récupération du rôle aurais-tu une info complémentaire à me fournir ?

Bonne soirée.

Dans drupal 5, de mémoire je faisais un truc du genre :

<?php
// $user->roles contient un tableau avec pour clef les identifiants de role
// et pour valeur leur nom.
// ici je controle si l'utilisateur dispose du role numéro 2. Je préfère tester les numéro que les noms...
global $user;
if(
array_key_exists( 2, $user->roles)){
 
// blablabla
}
?>

je ne connais pas drupal 6 encore. En tous cas c'est dans l'objet utilisateur que tu peux le voir en écrivant ceci : - à moins que cela aussi ait changé dans D6 :-/

<?php
global $user;
echo
'<pre>';
print_r($user);
echo
'</pre>';
?>

As the beautiful appearance and good design are PUMA Sandals jordan shoes popular with women. A fabulous full-grain sandal with distinctive Motorsport elements is the perfect product for those who enjoy puma shoes their special way of life. There are many types of styles and colours of the PUMA sandals cheap jordan shoes with top quality all over the world. The upper guess outlet is overlaid with ornamental and a tonal form stripe for a vintage-inspired look. The outsole is very flexible for additional mobility and wearing comfort.

As the beautiful appearance and good design are PUMA Sandals jordan shoes popular with women. A fabulous full-grain sandal with distinctive Motorsport elements is the perfect product for those who enjoy puma shoes their special way of life. There are many types of styles and colours of the PUMA sandals cheap jordan shoes with top quality all over the world. The upper guess outlet is overlaid with ornamental and a tonal form stripe for a vintage-inspired look. The outsole is very flexible for additional mobility and wearing comfort.