Salut

Je pense m'acheter un bouquin sur drupal car vu la complexité des modules... Smiley lol

j'ai pigé que c'est du procédural, qu'ils requièrent tous au minimum un .info et un fichier nomdumodule.module.

Mais concernant les templates des dit modules, c'est une autre paire de manches.

Un exemple pratique

le lien :

http://www.yabonlapub.com/blog/fr

En haut, on peut changer de langue

OK ?

Ce module est Block languages qui dépend de locale->I18n

Je voudrais mettre des drapeaux à la place des textes !

Avec firebug, je trouve seulement des dépendances avec les fichiers css

Quand je fais une recherche poussée avec notepad(Dans TOUT les répertoires du blog), impossible de trouver ou le code html est généré !!

Pas de templates, rien !

Pourquoi ?
Modérateur
Oui un livre ce n'est pas de trop pour aller dans le détail. Sinon une fois compris les bases du système de thème de Drupal, le module devel t'aide bien à repérer quoi passe par où.

En gros il y a des templates et pour d'autre cas des fonctions de thème. On écrase un template en le recopiant dans notre thème, ou avec un nom plus précis pour les cas spécifiques. La mèeme systématique est applicable pour les fonctions de thème, en déclarant la bonne fonction dans ton template.php.

En gros tes items ont été générés grâce à theme('links__locale_block', $variables); qui fait appel à theme_links($variables) et peut être redéfinie soit par MY_THEME_links($variables) pour le cas général ou MY_THEME_links_locale_block($variables) pour le cas particulier.
Modérateur
Au passage, tu peux t'épargner, des drapeaux pour des langues, ça n'a aucun sens. Des drapeaux c'est pour des pays. On a des codes iso pour des langues.
Merci, kustolovic

Si j'ai bien compris, je dois déclarer la méthode dans thèmes/bartik(pour moi)/template.php

C'est bien ça ?


function bartik_links_locale_block($variables) {

}


a écrit :
Au passage, tu peux t'épargner, des drapeaux pour des langues, ça n'a aucun sens. Des drapeaux c'est pour des pays. On a des codes iso pour des langues.


Je sais, c'est juste pour faire des tests Smiley lol

En tout cas le tableau variables contient beaucoup de choses. Entre autre les classes css associées au type de contenu.

Ça m'a l'air bien puissant tout ça, mais me faut un p^^^^ de bouquin
bon dans locale.module :


function locale_block_view($type) {
  if (drupal_multilingual()) {
    $path = drupal_is_front_page() ? '<front>' : $_GET['q'];
    $links = language_negotiation_get_switch_links($type, $path);

    if (isset($links->links)) {
      drupal_add_css(drupal_get_path('module', 'locale') . '/locale.css');
      $class = "language-switcher-{$links->provider}";
      $variables = array('links' => $links->links, 'attributes' => array('class' => array($class)));
      $block['content'] = theme('[b]links__locale_block[/b]', $variables);
      $block['subject'] = t('Languages');
      return $block;
    }
  }
}


En gras le contenu du bloc, bon ok ...
Dans le template.php de mon thème :

j'ai déclaré


function bartik_links_locale_block($variables) {
var_dump($variables['links']);
}


rien
Modifié par phpCbien (05 Jun 2012 - 14:57)
Modérateur
Alors lorsque tu déclares un nouveau hook, tu dois vider le cache. (il ne parcours pas tous les fichiers à chaque chargement… ).

pour ce faire :

configuration>performances>vider le cache

ou avec le module devel et le menu devel affiché: vider le cache

ou avec drush en ligne de commande: drush cc all
Si la méthode n'est pas déclarée dans le template du thème, quel est le fichier qui va se charger du rendu concerné ?

Bon si links_locale_block n'existe pas il va taper je n'sais ou :


http://yabonlapub.com/olivier_temp/scrren.jpg

J'aimerai comprendre.
A force de voir des occurrences partout, je vais m'en fumer une

On se croirait sous XOOPS Smiley lol
Modérateur
En gros:

theme ('links__contextual__node', $vars)
Lancera la première de ces fonctions qu'il trouvera:

MYTHEME_links__contextual__node (dans le/les themes actifs)
theme_links__contextual__node (dans le module qui définit links)
MYTHEME_links__contextual (dans le/les themes actifs)
theme_links__contextual (dans le module qui définit links)
MYTHEME_links (dans le/les themes actifs)
theme_links (dans le module qui définit links)
Modifié par kustolovic (05 Jun 2012 - 15:28)
Modérateur
J'ai glissé une erreur:
function bartik_links__locale_block($variables) {
var_dump($variables);
}
garder les double underscore lors de la déclaration… Smiley rolleyes

Sinon tu ne devrait bien entendu pas faire bartik_links__locale_block mais bien montheme_links__locale_block, montheme pouvant être un sous-thème de bartik
Dans le tableau variables j'ai style ceci :


array
  'href' => string '<front>' (length=7)
  'title' => string 'English' (length=7)
  'language' => 
    object(stdClass)[12]
      public 'language' => string 'en' (length=2)
      public 'name' => string 'English' (length=7)
      public 'native' => string 'English' (length=7)
      public 'direction' => string '0' (length=1)
      public 'enabled' => string '1' (length=1)
      public 'plurals' => string '0' (length=1)
      public 'formula' => string '' (length=0)
      public 'domain' => string '' (length=0)
      public 'prefix' => string 'en' (length=2)
      public 'weight' => string '0' (length=1)
      public 'javascript' => string '' (length=0)
  'attributes' => 
    array
      'class' => 
        array
          0 => string 'language-link' (length=13)

array
  'href' => string '<front>' (length=7)
  'title' => string 'Français' (length=9)
  'language' => 
    object(stdClass)[9]
      public 'language' => string 'fr' (length=2)
      public 'name' => string 'French' (length=6)
      public 'native' => string 'Français' (length=9)
      public 'direction' => string '0' (length=1)
      public 'enabled' => string '1' (length=1)
      public 'plurals' => string '2' (length=1)
      public 'formula' => string '($n!=1)' (length=7)
      public 'domain' => string '' (length=0)
      public 'prefix' => string 'fr' (length=2)
      public 'weight' => string '0' (length=1)
      public 'javascript' => string 'zDmQoVs9H2DzOMopB5KnpocqT5tL9Pt3R-cLZu9jlxo' (length=43)
  'attributes' => 
    array
      'class' => 
        array
          0 => string 'language-link' (length=13)


Dans ma méthode, c'est simple de parcourir les liens et les afficher mais je comprends pas trop comment utiliser <front> pour les href des langues !
Voila l'implémentation de base

http://api.drupal.org/api/drupal/includes!theme.inc/function/theme_links/7

mais quand je fais ça :

function bartik_links__locale_block($variables) {
$output="<ul>";

  foreach($variables['links'] as $language => $langInfo) {
	$output.='<li><a href="';
	$output.= $variables['links'][$language]['href'] ;
	$output.='">'.$language['title'].'</a></li>';
  }
$output.="</ul>";
  return $output;


}


Pas moyen de récupérer les liens actuels Smiley biggol

Je commence si il faudrait pas mieux dupliquer le code de la méthode native theme_links($variables) dans le thème concerné et dans la méthode THEME_links__locale_block juste pour modifier le html mais c'est débile, je trouve

Alors que cette méthode est très bien faite, faudrait la dupliquer ou en créer une nouvelle !

Pourquoi ils ont pas séparer davantage le html des méthodes ?????????
kustolovic

Tu ferais comment, toi ??

A titre d'exemple

Sinon je présume que quasi tous les modules en natif ont leurs méthodes de type Render et non pas des templates ??
Modérateur
re-bonjour,
la plupart des modules implémentent des templates. Ceux-ci étant un peu plus lent, ils sont plutôt utilisés lorsqu'il y a de grosses portions de code html. Lorsque il y a au contraire énorment de logique de code pour deux balises qui se courent après, on utilise plutôt des fonctions de thème.
Une recherche *.tpl.php dans modules m'a fournit 42 fichiers. Il y en a quand même pas mal dans les modules du core…

j'ai réouvert le code d'un site pour voir comment j'avais procédé. C'est effectivement un des cas ou on se dit, c'est tout c… mais fastidieux à obtenir… heureusement une grande partie des éléments se thèment plus facilement.

Il y a plusieur manière de réaliser cela:

1) réecrire toute la fonction de thème.

2) Laisser le core faire le gros du sale boulot en changeant juste ce que l'on souhaite: ici je déclare une fonction de thème afin de réecrire les textes des liens (english, français) dans la version courte (en, fr)
Ceci est réalisé en changeant le contenu de $variables et en laissant drupal faire le reste.

function mytheme_links__locale_block($variables) 
  foreach ($variables['links'] as $key => $link) {
    $variables['links'][$key]['title'] = $link['language']->language;
  }
  // j'apelle la fonction de thème originale afin de ne pas tout réecrire ^^.
  return theme('links',$variables);
}


3) Si on souhaite absolument utiliser un template, on peut transformer une fonction de thème en template!
quelques précisions:
* C'est un peu plus de charge pour le serveur, surtout dans le cas du bloc locale qui n'a pas de cache (car son contenu change tout le temps).
* Si on définit aussi la fonction de thème dans template.php, celle-ci aura la priorité.
* Le module implémentant le thème d'origine n'ayant pas prévu de faire un template, les variables ne sont pas préparées pour le template, on devra donc faire ce job nous-même.
* Pour un dev, c'est une excellente façon de draguer la jolie intégratrice-graphiste qui sera toute heureuse de ne pas voir de code.

Voici comment faire (à bien tester bien sûr!):
On déclare une fonction de preprocess qui se chargera de préparer nos variables, dans template.php:

function mytheme_preprocess_links__locale_block(&$variables) {
  $links = array();
  foreach ($variables['links'] as $link) {
    // url() ou l() acceptent $options en paramètre qui se chargent de générer la bonne url, notament selon la langue et nos règlages (en.site.com, site.en, site.com/en etc.) et la structure obtenue ($link) est déjà prête pour correspondre à $options.
    // on aurait pu en code générer le lien grâce à l($text,$href,$options) en définissant $link['html'] = true, et en insérant notre image dans $text, mais du coup, le template aurait été superflu…
    $links[] = array(
      'href' => url($link['href'],$link),
      'attributes' => drupal_attributes($link['attributes']),
      'language' => $link['language']->language,
    );
  }
  $variables['links'] = $links;
}

On crée un fichier links--locale-block.tpl.php dans notre thème. La nomenclature est la même, les _ deviennent des - comme pour tout template.

<ul class="locale-links inline">
  <?php foreach ($links as $link): ?>
    <li class="<?php print $link['language'] ?>">
      <a href="<?php print $link['href'] ?>" <?php print $link['attributes'] ?>>
        <img src="/<?php print $directory ?>/images/flag-<?php print $link['language'] ?>.png" alt="<?php print $link['language'] ?>" />
      </a>
    </li>
  <?php endforeach; ?>
</ul>

J'ai utilisé la variable $directory, que je n'ai pas du préparer, car elle est définie dans template_preprocess() et ainsi disponibles dans tous les fichiers de template.
Et le résultat final:

<ul class="locale-links inline">
    <li class="en">
      <a href="/en/content/openning-hours"  class="language-link" title="Openning hours">
        <img src="/sites/all/themes/mytheme/images/flag-en.png" alt="en" />
      </a>
    </li>
    <li class="fr">
      <a href="/fr/content/horaire-douverture"  class="language-link" title="Horaire d&#039;ouverture">
        <img src="/sites/all/themes/mytheme/images/flag-fr.png" alt="fr" />
      </a>
    </li>
  </ul>