Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Les blocs Drupal de drop.org à Drupal 8

4,422 views

Published on

Le système de blocs a été présent depuis les origines de Drupal sur drop.org jusqu'à aujourd'hui dans Drupal 8.

Cette présentation retrace l'historique de son développement, et plus largement celui de Drupal dans son ensemble.

  • Be the first to comment

Les blocs Drupal de drop.org à Drupal 8

  1. 1. Le système de blocs de drop.org à Drupal 8 Par Frédéric G. MARAND (fgm)
  2. 2. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Il était une fois ... « First we start making a slashdot.org alike site: a  community weblog that offers all you need to know » docs/mission.php, circa 2000-03
  3. 3. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal LoC vs time– 24/07/98 19/04/01 14/01/04 10/10/06 06/07/09 01/04/12 27/12/14 100 1000 10000 100000 1000000 100 1000 10000 100000 1000000 PHP Code JS Code CSS Code Shell, perl Code data, conf
  4. 4. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France drop.org Drupal 1 Drupal 2 Drupal 3 Drupal 4 Drupal 4.1 Drupal 4.2 Drupal 4.3 Drupal 4.4 Drupal 4.5 Drupal 4.6 Drupal 4.7 Drupal 5 Drupal 6 Drupal 7 Drupal 8 10 100 1000 10000 100000 1000000 PHP Files PHP Com PHP Code PHP dans Drupal
  5. 5. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France drop.org Drupal 1 Drupal 2 Drupal 3 Drupal 4 Drupal 4.1 Drupal 4.2 Drupal 4.3 Drupal 4.4 Drupal 4.5 Drupal 4.6 Drupal 4.7 Drupal 5 Drupal 6 Drupal 7 Drupal 8 1 10 100 1000 10000 100000 CSS File CSS Comment CSS Code CSS dans Drupal
  6. 6. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France drop.org Drupal 1 Drupal 2 Drupal 3 Drupal 4 Drupal 4.1 Drupal 4.2 Drupal 4.3 Drupal 4.4 Drupal 4.5 Drupal 4.6 Drupal 4.7 Drupal 5 Drupal 6 Drupal 7 Drupal 8 1 10 100 1000 10000 100000 JS Files JS Com JS Code JavaScript dans Drupal
  7. 7. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France drop.org qu'est-ce qu'un bloc ?– ● Every single 'box' on the website can be themed: not only  the colors but the entire look-and-feel and position. ● Boxes: ● Box for latest headlines. ● Box for older headlines. ● Box for related links. ● Box with login form. ● User-defined box. ● Theme support: ● Not only can you change the colors, you can also change  the position of most boxes and such. docs/features.php, circa 2000-03
  8. 8. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France drop.org cycle de page– ● pas de front controller, contrôleur = fichier PHP ● index.php, faq.php, article.php, ... ● paramètres GET, notamment op pour les variantes ● register_globals = on nécessaire ● back-office dédié : admin.php ● le contrôleur ● charge les fonctions communes, la configuration ● $theme->header() ● s'il a des variantes, switch ($op) – ajoute son contenu en fonction de $op, – par exemple $theme->article(), d'autres font du HTML inline – article(), box() , comment(), abstract(), footer(), header(), preview() ● $theme->footer()
  9. 9. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France drop.org - positionnement ● Pas d'interface utilisateur de positionnement ● Les méthodes de thème décident des blocs à afficher dans leurs éléments prédéfinis header et footer. ● themes/Dries/theme.class function footer() { /* ..snip.. */ global $PHP_SELF; if (strstr($PHP_SELF, "index.php")) { global $user; displayAccount($this); ● les fonctions prédéfinies invoquent $theme->box($subject, $content) ● functions.inc function displayAccount($theme) { global $user, $cookie; if ($user) { ### Display userblock if any: displayUserblock(); } else { $content = "<CENTER><FORM METHOD="post" ACTION="account.php">n <P>Username:<BR><INPUT TYPE="text" NAME="uname" MAXLENGTH="50" SIZE="12"></P>n<P>Password:<BR> <INPUT TYPE="password" NAME="pass" MAXLENGTH="25" SIZE="12"></P>n<INPUT TYPE="submit" NAME="op" VALUE="Login">n</FORM>n<P><A HREF="account.php">Register</A> as new user.<BR><A HREF="account.php">Forgot</A> your password?</P></CENTER>"; $theme->box("Login", $content); } }
  10. 10. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France drop.org : thème de box ● themes/Natrak/theme.class ###### # Syntax.......: box($title, $body); # Description..: a function to draw a box/block. function box($subject, $content) { include "config.inc"; print "<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="3" WIDTH="100%">"; print " <TR><TD ALIGN="center" BGCOLOR="$this->bgcolor1" WIDTH="100%"><FONT COLOR="$this->fgcolor1"><B>$subject</B></FONT></TD></TR>"; print " <TR><TD BGCOLOR="$this->bgcolor2">$content</TD></TR>"; print "</TABLE><BR>"; } ● themes/Natrak/theme.php function themebox($subject, $content) { global $bgcolor1, $bgcolor2, $bgcolor3; include "config.inc"; print "<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="3" WIDTH="100%">"; print " <TR><TD ALIGN="center" BGCOLOR="$bgcolor1"><FONT COLOR="$bgcolor2"><B>$subject</B></FONT></TD></TR>"; print " <TR><TD BGCOLOR="$bgcolor2">$content</TD></TR>"; print "</TABLE><BR>"; } ● webboard.php appelle la fonction, les autres la méthode Les thèmes sont des classes PHP Mais pas seulement...
  11. 11. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France drop.org - Page d'article
  12. 12. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France drop.org ab -n10000 -c10 (home)–Server Software: Apache/2.2.22 Server Hostname: drop1 Server Port: 80 Document Path: / Document Length: 9088 bytes Concurrency Level: 10 Time taken for tests: 9.821 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 93350000 bytes HTML transferred: 90880000 bytes Requests per second: 1018.24 [#/sec] (mean) Time per request: 9.821 [ms] (mean) Time per request: 0.982 [ms] (mean, across all concurrent requests) Transfer rate: 9282.49 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 2 Processing: 2 10 4.0 9 62 Waiting: 1 9 3.8 9 61 Total: 2 10 4.0 9 62 Percentage of the requests served within a certain time (ms) 50% 9 66% 11 75% 12 80% 12 90% 15 95% 17 98% 20 99% 23 100% 62 (longest request)
  13. 13. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France drop.org thème par défaut–
  14. 14. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 1.0 15/01/2001– ● Naissance des concepts de module, hook et weight ● Nommage explicite des hooks $module = array("help" => "box_help", "block" => "box_block", "admin" => "box_admin"); ● Apparition d'un registre de fonctions, le repository ● 7 hooks : admin block cron export help page user ● Apparition du module block ● Séparation block vs custom block vs box ● Apparition des régions, header et footer sont à part. ● Sélection des blocs optionnels par l'utilisateur ● Passage au layout de fichiers « classique » : ● includes/, modules/, scripts/, themes/ ● apparition d'un .htaccess et d'un robots.txt
  15. 15. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 1 block_help()– ● Blocks are the boxes visible in the side bars on the left and the right- hand side of the website. ● They are either exported by the engine or by any of the available modules.  […]  ● The placement of blocks is delegated to the administrator but for most  blocks, i.e. those called "custom blocks", the sole force behind enabling  and disabling them is the user itself. ● An administrator can lay out and arrange the available blocks to fit in two  regions: "left" and "right". Regions simply contain blocks. In addition, an  administrator can assign each block (within a region) a weight to sort  them vertically. [...] ● As mentioned above, blocks can be arranged to fit in two regions: left and  right. For theme builders, each region is identified by a corresponding  constant: "left" and "right". admin.php?mod=block&op=help
  16. 16. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 1 - box_help() ● […] Simply put, boxes are small bits of text, HTML or PHP  code which will get plugged into the site just like any  other block. Boxes are typically used to add custom  blocks to the site. ● Each box consists of a subject and an associated block of  text, HTML or PHP code which can be as long as you want  it to be and that will 'render' the content of the box. ● … mais Theme::box() existe toujours ! admin.php?mod=box&op=help
  17. 17. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 1 cycle de page– ● pas de front controller, mais module.php?mod=.. ● le contrôleur ● charge les fonctions communes de common.inc – la configuration : getenv("HTTP_HOST") .".conf"; – le thème : $theme = load_theme(); ● définit ses fonctions ● s'il a des variantes, switch ($op) – invoque ses fonction d'action en fonction de $op ● l'action – prépare ses données – demande au thème de construire sa vue : ● $theme->header(); ● $theme->box() multiples des données préparées (account.php) – ou formatage moins propre... (search.php) ● $theme->footer();
  18. 18. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 1 - positionnement ● L'interface d'administration permet de choisir entre 3 layouts : ● Left + Content ● Left + Content + Right ● Content + Right ● L'administrateur décide des blocs custom à afficher dans left et right. ● Theme::header() et Theme::footer() décident des blocs à afficher dans leurs éléments prédéfinis header et footer, qui ne sont pas des régions. ● Les layouts sont indépendants du thème, la table blocks ne stocke pas de variation de positionnement par thème
  19. 19. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 1 block overview– Affichage des titres de blocs actifs et non seulement des régions
  20. 20. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 1 : hook de bloc ● Un seul hook : hook_block() renvoie un hash de : ● subject : titre affiché ● content : contenu brut, HTML, ou PHP à exécuter ● info : titre administratif ● link : URL, affiché uniquement dans l'administration ● Il sert à la fois pour l'administration et l'affichage ● Exemple de box.module function box_block() { $result = db_query("SELECT * FROM boxes"); $i = 0; while ($block = db_fetch_object($result)) { $blocks[$i]["subject"] = check_output($block->subject); $blocks[$i]["content"] = ($block->type == 2) ? eval($block->content) : check_output($block->content, ($block->type == 1) ? 0 : 1); $blocks[$i]["info"] = check_output($block->info); $blocks[$i]["link"] = check_output($block->link); $i++; } return $blocks; }
  21. 21. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 1 : thème de box ● themes/marvin/marvin.theme function box($subject, $content) { ?> <TABLE BORDER="0" CELLPADDING="0" CELLSPACING="0" BGCOLOR="<? echo $this->brcolor1; ?>" WIDTH="100%"> <TR><TD><? print "<TABLE BORDER="0" CELLPADDING="3" CELLSPACING="1" WIDTH="100%">"; print " <TR><TD ALIGN="center" BGCOLOR="$this->bgcolor1" NOWRAP><FONT COLOR="$this- >fgcolor1"><B>$subject</B></FONT></TD></TR>"; print " <TR><TD BGCOLOR="$this->bgcolor2">$content</TD></TR>"; print "</TABLE>"; ?> </TD></TR> </TABLE><BR><? } ● Plus de fichiers de thèmes hors classes Les thèmes sont toujours des classes PHP, mais dans <theme>.theme
  22. 22. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 1 ab -n10000 -c10 (home)–Server Software: Apache/2.2.22 Server Hostname: drop1 Server Port: 80 Document Path: / Document Length: 4553 bytes Concurrency Level: 10 Time taken for tests: 6.388 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 49950000 bytes HTML transferred: 45530000 bytes Requests per second: 1565.36 [#/sec] (mean) Time per request: 6.388 [ms] (mean) Time per request: 0.639 [ms] (mean, across all concurrent requests) Transfer rate: 7635.70 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 4 Processing: 2 6 2.8 6 33 Waiting: 2 6 2.8 6 33 Total: 2 6 2.8 6 33 Percentage of the requests served within a certain time (ms) 50% 6 66% 7 75% 8 80% 8 90% 10 95% 11 98% 14 99% 16 100% 33 (longest request)
  23. 23. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 1 thème UnConeD–
  24. 24. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 2.0 15/03/2001 (2 mois)– ● Le filtrage de box remonte du modèle au contrôleur ● Celui de block reste sur le modèle ● Le subject de block devient traduisible ● Pas de changements majeurs côté block/box ● Layout : apparition de misc/ ● Abandon des « short tags » PHP ● Premier bleu : la « goutte » pre-Druplicon dans le thème UnConeD ● Theme::abstract() devient Theme::story() ● class Story extends Node { … } ● Apparitions : – locale – premier script d'update, en SQL – CHANGELOG, CREDITS ● Evolutions : comment, section, user ratings, permissions ● Premier module optionnel : submission
  25. 25. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 2 ab -n10000 -c10 (home)–Server Software: Apache/2.2.22 Server Hostname: drop2 Server Port: 80 Document Path: / Document Length: 5919 bytes Concurrency Level: 10 Time taken for tests: 8.921 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 63570000 bytes HTML transferred: 59190000 bytes Requests per second: 1120.93 [#/sec] (mean) Time per request: 8.921 [ms] (mean) Time per request: 0.892 [ms] (mean, across all concurrent requests) Transfer rate: 6958.77 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 4 Processing: 2 9 3.5 8 32 Waiting: 2 9 3.5 8 32 Total: 2 9 3.5 8 32 Percentage of the requests served within a certain time (ms) 50% 8 66% 10 75% 11 80% 12 90% 14 95% 15 98% 18 99% 20 100% 32 (longest request)
  26. 26. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 2 thème UnConeD–
  27. 27. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 3.0.2 26/11/2001 (8 mois)– ● Les blocs fournis par les modules... ● peuvent être désactivés, optionnels ou obligatoires ● … comme les boxes ● apparaissent dans la prévisualisation des régions ● Pas de changements majeurs côté block/box ● Apparitions : – node, file, cache (de pages), form_*() – Front : thèmes fluides : Goofy, Jeroen, Yaroon, nu : Stone Age ● Evolutions – hooks : global $repository → function_exists() – Druplicon de face remplace la goutte – section meta et introduit une hiérarchie→ – faq book et introduit une hiérarchie→ – Element <font> : 74 14.→
  28. 28. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 3 configuration des blocs–
  29. 29. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 3.0.2 thème de box– ● Thème par défaut : ● class Theme extends BaseTheme { /* ..snip.. */ function box($subject, $content, $region = "main") { ?> <TABLE> <TR> <TD> <DIV ALIGN="center"> <BIG><? echo $subject; ?></BIG> </DIV> <HR> </TD> </TR> <TR> <TD> <?php echo $content; ?> </TD> </TR> </TABLE> <BR><?php } // close box function } Pour les curieux... class BaseTheme { function links(…) {…} function image($name) {} function comment_controls(…) {} }
  30. 30. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 3 ab -n10000 -c10 (home)–Server Software: Apache/2.2.22 Server Hostname: drop3 Server Port: 80 Document Path: / Document Length: 4338 bytes Concurrency Level: 10 Time taken for tests: 13.971 seconds Complete requests: 10000 Failed requests: 15 (Connect: 0, Receive: 0, Length: 15, Exceptions: 0) Write errors: 0 Total transferred: 47793825 bytes HTML transferred: 43413825 bytes Requests per second: 715.75 [#/sec] (mean) Time per request: 13.971 [ms] (mean) Time per request: 1.397 [ms] (mean, across all concurrent requests) Transfer rate: 3340.65 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 5 Processing: 4 14 4.6 13 44 Waiting: 4 14 4.6 13 44 Total: 4 14 4.6 13 44 Percentage of the requests served within a certain time (ms) 50% 13 66% 15 75% 16 80% 17 90% 20 95% 23 98% 25 99% 28 100% 44 (longest request)
  31. 31. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 3 nouveaux thèmes–
  32. 32. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.0 08/12/2002 (12 mois)– ● Plus d'admin séparée bloc/box, plus de module box ● Position définie par block, colonnes region/weight ● configuré par l'administrateur ● fallback automatique d'une régions sur l'autre ● Visibilité définie par block, colonne path (regex) ● Contenu défini par box, y compris format ASCII / HTML / PHP ● BaseTheme::box() fournit un thème de box par défaut ● Et par ailleurs... ● Apparitions : – Thème default == Basic. – Formulaire de node bi-colonne, différent entre FO / BO – XML-RPC, version Useful Inc. ● Evolutions – meta/section/category taxonomy/vocabulary/term→ – Formats de saisie par node, dans la table additionnelle du CT – Home personnalisable en PHP eval. – généralisation du contrôleur module.php, mais pas intégrale – DB API basée sur PEAR:DB, support de PostgreSQL, dump inclut MAJ – Retrait thèmes: Dries, Jeroen, Stone Age example→
  33. 33. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.0 admin des blocs–
  34. 34. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.0 node form FO Basic–
  35. 35. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.0 node form BO–
  36. 36. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4 ab -n10000 -c10 (home)–Server Software: Apache/2.2.22 Server Hostname: drop4 Server Port: 80 Document Path: / Document Length: 8714 bytes Concurrency Level: 10 Time taken for tests: 32.101 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 91560000 bytes HTML transferred: 87140000 bytes Requests per second: 311.52 [#/sec] (mean) Time per request: 32.101 [ms] (mean) Time per request: 3.210 [ms] (mean, across all concurrent requests) Transfer rate: 2785.42 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 3 Processing: 9 32 11.6 31 225 Waiting: 9 32 11.5 30 222 Total: 9 32 11.6 31 225 Percentage of the requests served within a certain time (ms) 50% 31 66% 34 75% 37 80% 40 90% 46 95% 51 98% 59 99% 64 100% 225 (longest request)
  37. 37. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.1 25/06/2003 (6 mois)– ● Les blocs ne sont construits que s'ils sont affichés ● La sélection des blocs disponibles par utilisateur est triée par module/delta et plus par nom ● Le name de block (alias $block->info) est retiré, donc... ● La table blocks n'a plus de PK, ni même d'index ● Et par ailleurs... ● Apparitions : – profile ● Evolutions – refactoring du markup dans les thèmes : plus de flexibilité réutilisable : ● theme_mark, ● theme_head, ● theme_item_list, ● theme_error ... CHANGELOG indique 15/02/2003, mais les commits 25/06/2003
  38. 38. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.1 tri utilisateur des blocs–
  39. 39. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.1 construction paresseuse– ● La construction des blocs à l'affichage dans theme_blocks n'a plus lieu que lorsqu'ils doivent être affichés : obligatoires, ou par défaut et utilisateur anonyme, ou sélectionnés, mais uniquement sans chemin ou si le chemin correspond. ● function theme_blocks($region, &$theme) { global $user, $PHP_SELF; $result = db_query("SELECT * FROM blocks WHERE (status = '1' OR custom = '1') ". ($region != "all" ? "AND region = '%s' " : "") ."ORDER BY weight, module", $region == "left" ? 0 : 1); while ($result && ($block = db_fetch_object($result))) { if ( ( ($block->status && (!$user->uid || !$block->custom)) || ($block->custom && $user->block[$block->module][$block->delta])) && (!$block->path || preg_match("|$block->path|", $PHP_SELF)) ) { $block_data = module_invoke($block->module, "block", "view", $block->delta); if ($block_data["content"]) { $theme->box($block_data["subject"], $block_data["content"], $region); } } } }
  40. 40. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.1 ab -n10000 -c10 (home)–Server Software: Apache/2.2.22 Server Hostname: drop4 Server Port: 80 Document Path: / Document Length: 1517 bytes Concurrency Level: 10 Time taken for tests: 15.174 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 19590000 bytes HTML transferred: 15170000 bytes Requests per second: 659.03 [#/sec] (mean) Time per request: 15.174 [ms] (mean) Time per request: 1.517 [ms] (mean, across all concurrent requests) Transfer rate: 1260.79 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 5 Processing: 5 15 4.9 14 70 Waiting: 5 15 4.9 14 70 Total: 5 15 4.9 14 70 Percentage of the requests served within a certain time (ms) 50% 14 66% 16 75% 18 80% 19 90% 22 95% 24 98% 27 99% 29 100% 70 (longest request)
  41. 41. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.2 04/10/2003 (4.5 mois)– ● hook_block($op) $op = list|view ● Block delta : int varchar(32)→ ● Block preview : « Themes with (right|left)-sidebar only... » ● t('messages du code de block.module') ● BaseTheme::box() reçoit des données filtrées ● BaseTheme::block($subject, $content, $region = 'main') ● Simple wrapper de BaseTheme::box() ● Mais séparée dans Xtemplate, et appelée par theme_blocks() au lieu de theme('box'). ● Et par ailleurs... ● Apparitions : – Support Microsoft SQL Server – index.php devient le contrôleur frontal pour tous les chemins « normaux » – Xtemplate, moteur et thème. theme() remplace theme_invoke() : – seul system.module utilise $theme->foo(), les autres utilisent theme('foo') ● Evolutions – clean URLs – support WYSIWYG (!) – intégration du BO dans l'espace unifié – Thèmes : retrait de Goofy ● le bleu commence à dominer ● premiers fichiers CSS – plus de register_globals = On
  42. 42. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.2 block admin–
  43. 43. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.2 BaseTheme::box()– ● Drupal 4.1 : function box($subject, $content, $region = "main") { $output = "<b>" . check_output($subject) ."</b><br />" . check_output($content) ."<p />"; print $output; } ● Drupal 4.2 function box($subject, $content, $region = "main") { $output = "<p><b>$subject</b><br />$content</p>"; print $output; } function block($subject, $content, $region = "main") { global $theme; $theme->box($subject, $content, $region); }
  44. 44. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.2 - XTemplate
  45. 45. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.2 ab -n10000 -c10 (home)–Server Software: Apache/2.2.22 Server Hostname: drop4 Server Port: 80 Document Path: / Document Length: 3651 bytes Concurrency Level: 10 Time taken for tests: 22.128 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 41080000 bytes HTML transferred: 36510000 bytes Requests per second: 451.92 [#/sec] (mean) Time per request: 22.128 [ms] (mean) Time per request: 2.213 [ms] (mean, across all concurrent requests) Transfer rate: 1812.97 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 6 Processing: 6 22 7.6 21 154 Waiting: 6 22 7.6 21 154 Total: 6 22 7.6 21 154 Percentage of the requests served within a certain time (ms) 50% 21 66% 24 75% 26 80% 27 90% 31 95% 35 98% 39 99% 42 100% 154 (longest request)
  46. 46. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.3.x 01/11/2003 (0.75 mois)– ● UX : admin/block → admin/system/block ● Et par ailleurs... ● Versions mineures 4.3.0, 4.3.1, 4.3.2, 4.3.x HEAD non releasée jusqu'à 02/2004 ● Apparitions : – Alias – Préfixes de base de données avec {} ● Evolutions – Simplification de l'objet User – Certaines actions de contrôleur font return au lieu de print.
  47. 47. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.3.x R.A.S– Et c'est tout pour 4.3 !
  48. 48. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.3 ab -n10000 -c10 (home)–Server Software: Apache/2.2.22 Server Hostname: drop4 Server Port: 80 Document Path: / Document Length: 3460 bytes Concurrency Level: 10 Time taken for tests: 15.036 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 39170000 bytes HTML transferred: 34600000 bytes Requests per second: 665.06 [#/sec] (mean) Time per request: 15.036 [ms] (mean) Time per request: 1.504 [ms] (mean, across all concurrent requests) Transfer rate: 2543.97 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 3 Processing: 5 15 4.5 14 44 Waiting: 5 15 4.5 14 44 Total: 5 15 4.5 14 44 Percentage of the requests served within a certain time (ms) 50% 14 66% 16 75% 18 80% 18 90% 21 95% 23 98% 26 99% 28 100% 44 (longest request)
  49. 49. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.4.x 01/04/2004 (2 mois)– ● theme_blocks() délègue ● la liste des blocs à block_list() au lieu de requêter elle-même ● le rendu à theme_block('view') au lieu d'invoquer hook_block('view') ● theme('box') plus défini sauf theme.inc et Xtemplate ● L'absence de PK sur blocks est identifiée come « (bad) ! » ● Et par ailleurs... ● Performance – Contrôle de charge générique avec throttle.module : désactivation de modules ou fonctions – Chargement de modules limité sur les pages cachées – Locale limite la taille des données cachées ● Apparitions : – Pushbutton ● Evolutions – Uniformisation de theme() et des fonctions theme_* et de return – Retrait des classes de thème – Retrait du support Microsoft SQL Server – Thèmes : ● Marvin Chameleon + sous-thème→ ● Retrait de Goofy
  50. 50. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.4 - theme_blocks() ● Drupal 4.3 : ● cf Drupal 4.1 : db_query() + test compliqué ● Drupal 4.4 ● délégation à block_list pour la liste, theme_block pour le rendu function theme_blocks($region) { $output = ''; if ($list = module_invoke('block', 'list', $region)){ foreach ($list as $key => $block) { // $key == <i>module</i>_<i>delta</i> $output .= theme('block', $block); } } return $output; }
  51. 51. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.4 - theme_block() function theme_block($block) { $output = "<div class="block block-$block->module" id="block-$block->module-$block->delta">n"; $output .= " <h2 class="title">$block->subject</h2>n"; $output .= " <div class="content">$block- >content</div>n"; $output .= "</div>n"; return $output; }
  52. 52. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.4 Thème Chameleon–
  53. 53. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.4 ab -n10000 -c10 (home)–Server Software: Apache/2.2.22 Server Hostname: drop4 Server Port: 80 Document Path: / Document Length: 2951 bytes Concurrency Level: 10 Time taken for tests: 20.207 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 34080000 bytes HTML transferred: 29510000 bytes Requests per second: 494.87 [#/sec] (mean) Time per request: 20.207 [ms] (mean) Time per request: 2.021 [ms] (mean, across all concurrent requests) Transfer rate: 1646.99 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 13 Processing: 7 20 11.5 19 445 Waiting: 7 20 11.4 19 434 Total: 7 20 11.5 19 446 Percentage of the requests served within a certain time (ms) 50% 19 66% 21 75% 23 80% 24 90% 26 95% 29 98% 33 99% 37 100% 446 (longest request)
  54. 54. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.5 18/10/2004 (6 mois)– ● Nouveaux blocs dans comment, taxonomy ● theme_(block|blocks|box) : pas de changement ● Et par ailleurs... ● nouveau système de menu avec cache, hook_menu($may_cache) ● rôles multiples par utilisateur ● Apparitions : – Thèmes : bluemarine ● Evolutions – SQL : connections multiples. PostgreSQL : abandon PEAR:DB – Thème : réorganisation, ● moteurs, templates, styles, ● settings ● screenshots ● retrait de XTemplate (le thème) et Pure – i18n : 100 % UI
  55. 55. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.5 - Marvin
  56. 56. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.5 ab -n10000 -c10 (home)–Server Software: Apache/2.2.22 Server Hostname: drop4 Server Port: 80 Document Path: / Document Length: 5462 bytes Concurrency Level: 10 Time taken for tests: 28.487 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 60070000 bytes HTML transferred: 54620000 bytes Requests per second: 351.03 [#/sec] (mean) Time per request: 28.487 [ms] (mean) Time per request: 2.849 [ms] (mean, across all concurrent requests) Transfer rate: 2059.24 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 3 Processing: 8 28 7.5 27 195 Waiting: 8 28 7.5 27 195 Total: 8 28 7.5 28 195 Percentage of the requests served within a certain time (ms) 50% 28 66% 30 75% 32 80% 34 90% 38 95% 41 98% 46 99% 50 100% 195 (longest request
  57. 57. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.6 15/04/2005 (6 mois)– ● Nouveaux paramètres de block : ● visibility – Précédemment : partout ou sur une regex – 4.6 : sur.. ou sauf.. (mais pas encore ou PHP) – les chemins décodent les alias ● types – Partout ou sur ces types de contenu ● Nouveaux $op de hook_block() : configure, save ● theme_(block|blocks|box) inchangé ● Et par ailleurs... ● Support PHP 5, UTF-8 généralisé ● Home : 92ms sans cache de page, 19ms avec... ● Disparition du contrôleur admin.php ● Retrait de Pear:DB ● Apparitions : – Contact, ImageAPI ● Evolutions – Premiers refactorings d'utilisabilité
  58. 58. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.6 Configuration de bloc–
  59. 59. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.6 ab -n10000 -c10 (home)– Server Software: Apache/2.2.22 Server Hostname: drop4 Server Port: 80 Document Path: / Document Length: 8763 bytes Concurrency Level: 10 Time taken for tests: 18.530 seconds Complete requests: 10000 Failed requests: 9999 (Connect: 0, Receive: 0, Length: 9999, Exceptions: 0) Write errors: 0 Total transferred: 920361989 bytes HTML transferred: 916920711 bytes Requests per second: 539.67 [#/sec] (mean) Time per request: 18.530 [ms] (mean) Time per request: 1.853 [ms] (mean, across all concurrent requests) Transfer rate: 48505.27 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 11 Processing: 5 18 8.3 17 199 Waiting: 4 13 6.4 12 160 Total: 5 18 8.3 17 199 Percentage of the requests served within a certain time (ms) 50% 17 66% 19 75% 21 80% 22 90% 25 95% 28 98% 33 99% 42 100% 199 (longest request)
  60. 60. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.7 01/05/2006 (11 mois)– ● Positionnement des block dans les régions custom par thème ● Les régions sont identifiées par nom, plus par numéro ● Visibilité des blocs en PHP en plus des chemins ● Formats de saisie sur les box. ● theme_(block|blocks|box) inchangé ● Et par ailleurs... ● Apparitions : – PHPTemplate, et retrait de Xtemplate – mode offline – JS : AJAX, effet de collapse, resize.. – Form API : émergence des tableaux de tableaux de tableaux... ● Evolutions – « loose caching » de page, cache de variables, cache dans les modules (archive) – Taxonomy : free tagging, contact global – Bluemarine et Pushbutton en PHPTemplate – Retrait de la modération, des révisions de nodes – Upgrade extensible par les modules – XML-RPC en propre – SQL : retrait des procédures stockées PostgreSQL – Retrait de queue
  61. 61. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.7 01/05/2006 (11 mois)– ● Positionnement des block dans les régions custom par thème ● Les régions sont identifiées par nom, plus par numéro ● Visibilité des blocs en PHP en plus des chemins ● Formats de saisie sur les box. ● Et par ailleurs... ● Apparitions : – PHPTemplate, et retrait de Xtemplate – mode offline – JS : AJAX, effet de collapse, resize.. – Form API : émergence des tableaux de tableaux de tableaux... ● Evolutions – « loose caching » de page, cache de variables, cache dans les modules (archive) – Taxonomy : free tagging, contact global – Bluemarine et Pushbutton en PHPTemplate – Retrait de la modération, des révisions de nodes – Upgrade extensible par les modules – XML-RPC en propre – SQL : retrait des procédures stockées PostgreSQL – Retrait de queue
  62. 62. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.7 templates de blocs– ● Bluemarine 4.6 <!-- BEGIN: block --> <div class="block block-{module}" id="block-{module}-{delta}"> <h2 class="title">{title}</h2> <div class="content">{content}</div> </div> <!-- END: block --> ● Bluemarine 4.7 <div class="<?php print "block block-$block->module" ?>" id="<?php print "block-$block->module-$block->delta"; ?>"> <h2><?php print $block->subject ?></h2> <div class="content"><?php print $block->content ?></div> </div>
  63. 63. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.7 custom blocks–
  64. 64. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.7 ab -n10000 -c10 (home)– Server Software: Apache/2.2.22 Server Hostname: drop4 Server Port: 80 Document Path: / Document Length: 4863 bytes Concurrency Level: 10 Time taken for tests: 10.249 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 53820228 bytes HTML transferred: 48630000 bytes Requests per second: 975.74 [#/sec] (mean) Time per request: 10.249 [ms] (mean) Time per request: 1.025 [ms] (mean, across all concurrent requests) Transfer rate: 5128.37 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 3 Processing: 3 10 3.6 10 82 Waiting: 3 10 3.6 10 82 Total: 3 10 3.6 10 84 Percentage of the requests served within a certain time (ms) 50% 10 66% 11 75% 12 80% 13 90% 14 95% 16 98% 18 99% 19 100% 84 (longest request)
  65. 65. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 5.0 15/01/2007 (8 mois)– ● Filtrage de visibilité de block par rôle ● hook_block('view') ne renvoie plus forcément le titre, il vient alors de block_list() qui le passe à check_plain() ● theme_(block|blocks|box) inchangé ● La prévisualisation des blocs est intégrée à leur admin ● Et par ailleurs... ● Apparitions : – Installateur en ligne, plus de chargement de dump, localisé ● Profils d'installation – Fichiers .info pour les modules, dépendances – jQuery 1.0.4 – Thèmes : Garland, Minelli, color.module, thème d'admin, CSS de modules ● Evolutions – Performance : sessions, node_access, fast404, cache agressif ● Sessions dans Memcached – 52 ms hors cache, 7 ms cache normal, 5 ms cache agressif – Layout de fichiers : 1 répertoire par module core, sites/all – Plugins de cache, bins de cache multiples – Page d'état, mail altérables, modules désinstallables, bulk ops – PHPTemplate override
  66. 66. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 5 block admin + preview– Pushbutton
  67. 67. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 5 visibilité par rôle– Bluemarine
  68. 68. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 5.0 ab -n10000 -c10 (home)– Server Software: Apache/2.2.22 Server Hostname: drop5 Server Port: 80 Document Path: / Document Length: 4172 bytes Concurrency Level: 10 Time taken for tests: 5.523 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 47180102 bytes HTML transferred: 41720000 bytes Requests per second: 1810.69 [#/sec] (mean) Time per request: 5.523 [ms] (mean) Time per request: 0.552 [ms] (mean, across all concurrent requests) Transfer rate: 8342.63 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.0 0 1 Processing: 2 5 3.6 5 110 Waiting: 2 5 3.6 5 110 Total: 2 5 3.6 5 111 Percentage of the requests served within a certain time (ms) 50% 5 66% 6 75% 6 80% 7 90% 8 95% 9 98% 10 99% 12 100% 111 (longest request)
  69. 69. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 6.0 13/02/2008 (13 mois)– ● block cache ● theme_block() → modules/system/block.tpl.php ● theme_(box|blocks) inchangés, box.tpl.php existe ● visibilité block par page externalisée dans drupal_match_path() ● {blocks} PK subrogéesur bid et clef sur module/delta/theme ● Et par ailleurs... ● Apparitions : – hook_watchdog, syslog ● Evolutions – 47ms no cache, 46ms cache blocks, 6.5ms cache normal, 5.9ms cache agressif – Performance : ● hook_menu() sans $may_cache ● SQL : Schema API, réduction des privilèges: temporary, lock tables ● split fichiers, .admin.inc, JS aggregator, support reverse proxy – Qualité : E_ALL, UX, core = 6.x, batch API, HTML Corrector – Industrialisation : scripts/drupal.sh – Sécurité : php.module, test mots de passe, OpenID, update – Thèmes : ● .info, templates sans fonction, preprocess hooks ● jQuery 1.2.3 – i18n : RTL, détection, traduction de contenus, alias, JS UI
  70. 70. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 6.0 cache de blocs– Normal Avec node_access
  71. 71. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 6 cache + throttle de blocs– if ($block->enabled && $block->page_match) { // Check the current throttle status and see if block should be displayed // based on server load. if (!($block->throttle && (module_invoke('throttle', 'status') > 0))) { // Try fetching the block from cache. Block caching is not compatible with // node_access modules. We also preserve the submission of forms in blocks, // by fetching from cache only if the request method is 'GET'. if (!count(module_implements('node_grants')) && $_SERVER['REQUEST_METHOD'] == 'GET' && ($cid = _block_get_cache_id($block)) && ($cache = cache_get($cid, 'cache_block'))) { $array = $cache->data; } else { $array = module_invoke($block->module, 'block', 'view', $block->delta); if (isset($cid)) { cache_set($cid, $array, 'cache_block', CACHE_TEMPORARY); } } } /* … snip … */ } Q1 : pourquoi ? Q2 : composants du cid ?
  72. 72. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France * The block cache is cleared in cache_clear_all(), and uses the same clearing * policy than page cache (node, comment, user, taxonomy added or updated...). * Blocks requiring more fine-grained clearing might consider disabling the * built-in block cache (BLOCK_NO_CACHE) and roll their own. * * user 1 is excluded from block caching. */ /* This setting should be used: * - for simple blocks (notably those that do not perform any db query), where querying the db cache would be more expensive than directly generating the content. * - for blocks that change too frequently. */ define('BLOCK_NO_CACHE', -1); Drupal 6.0 règles de cache– /* This is the default setting, used when the block does not specify anything. */ define('BLOCK_CACHE_PER_ROLE', 0x0001); /* The block can change depending on the user viewing the page. Can be resource-consuming for sites with many users */ define('BLOCK_CACHE_PER_USER', 0x0002); /* The block can change depending on the page being viewed. */ define('BLOCK_CACHE_PER_PAGE', 0x0004); /* The block is the same for every user on every page where it is visible. */ define('BLOCK_CACHE_GLOBAL', 0x0008); Quiz : quel conseil manque ?
  73. 73. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 6.0 ab -n10000 -c10 (home)– Server Software: Apache/2.2.22 Server Hostname: drop6 Server Port: 80 Document Path: / Document Length: 0 bytes Concurrency Level: 10 Time taken for tests: 4.690 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Non-2xx responses: 10000 Total transferred: 3230000 bytes HTML transferred: 0 bytes Requests per second: 2132.20 [#/sec] (mean) Time per request: 4.690 [ms] (mean) Time per request: 0.469 [ms] (mean, across all concurrent requests) Transfer rate: 672.56 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.0 0 1 Processing: 1 5 2.3 4 50 Waiting: 1 5 2.3 4 50 Total: 1 5 2.3 4 51 Percentage of the requests served within a certain time (ms) 50% 4 66% 5 75% 5 80% 6 90% 7 95% 9 98% 11 99% 12 100% 51 (longest request)
  74. 74. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 7.0 05/01/2011 (35 mois)–● hook_block($op) → hook_block_(info|configure|save|view) ● hook_block_(info|list|view[_MODULE_DELTA])_alter ● block['content'] render array => cache cid n'inclut plus theme/language ● block_custom.body traduisible ● block_custom.format int varchar(255)→ ● block.api.php, block.test, block.js (vertical tabs, d'n'd) ● block_theme() déclare block et plus seulement block_admin_display_form ● BLOCK_CACHE_* → DRUPAL_CACHE_* ● {blocks} → {block}, {boxes} → {block_custom} ● Permissions : ● - use PHP for block visibility ● + administer blocks ● UI : ● block intègre contextual, vertical tabs, local actions, ● Régions généralisées : placement de block dans content, help... ● main content block dans→ content, site mission block dans→ highlighted, footer → block dans footer ● Thème ● theme_box() RIP fin de la notion de– box. ● block template suggestions ● process ● (block).throttle RIP ● block_list() remplace le join et le db_rewrite_sql par _block_load_blocks() + block_block_list_alter() ● Visibilité : ● Invalidation si aucune page n'est autorisée (positif / négatif) ● PHP : module_exists('php') ● Nettoyage des blocs des modules désinstallés par hook_modules_uninstalled ● Alternative : drupal_set_content → drupal_add_region_content ● Et par ailleurs... – Entity API, Field API, EFQ, DBTNG, render arrays – encore plus de caches et de plugins one-off – i18n : field translation
  75. 75. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 7.0 nouveautés, suite– ● UI : ● block intègre contextual, vertical tabs, local actions, ● Régions généralisées : placement de block dans content, help... ● main content block dans→ content, site mission block dans→ highlighted, footer → block dans footer ● Prévisualisation de nouveau séparée de l'admin, sans les blocs ● Thème ● theme_box() RIP fin de la notion de– box. ● block template suggestions ● process ● (block).throttle RIP ● block_list() remplace le join et le db_rewrite_sql par _block_load_blocks() + block_block_list_alter() ● Visibilité : ● Invalidation si aucune page n'est autorisée (positif / négatif) ● PHP : module_exists('php') ● Nettoyage des blocs des modules désinstallés par hook_modules_uninstalled ● Alternative : drupal_set_content → drupal_add_region_content ● Et par ailleurs... – Entity API, Field API, EFQ, DBTNG, render arrays – encore plus de caches et de plugins one-off – i18n : field translation – Thème : Bartik, Corolla, Seven, retour du thème nu : Stark
  76. 76. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 7 block preview–
  77. 77. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 7.0 ab -n10000 -c10 (home)– Server Software: Apache/2.2.22 Server Hostname: drop7 Server Port: 80 Document Path: / Document Length: 5826 bytes Concurrency Level: 10 Time taken for tests: 6.223 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 63250000 bytes HTML transferred: 58260000 bytes Requests per second: 1606.99 [#/sec] (mean) Time per request: 6.223 [ms] (mean) Time per request: 0.622 [ms] (mean, across all concurrent requests) Transfer rate: 9926.00 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 4 Processing: 2 6 2.3 6 29 Waiting: 2 6 2.3 6 29 Total: 2 6 2.3 6 29 Percentage of the requests served within a certain time (ms) 50% 6 66% 7 75% 7 80% 8 90% 9 95% 10 98% 12 99% 13 100% 29 (longest request)
  78. 78. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 8.0 02/2014 ? (37 mois)– ● Assetic ● Composer ● Doctrine : annotations ● EasyRDF ● Guzzle ● PHPUnit ● PSR/3 ● Symfony 2, ● Symfony CMF : routing (chain router) ● Twig ● Zend Framework 2 : escaper, feed, stdlib ● Et un peu de Drupal autour de tout ça...
  79. 79. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 8 en bref...– ● hook_block_info() annotation Doctrine sur la classe de bloc→ ● hook_block_view() BlockPluginInterface::build()→ ● hook_block_configure() → BlockPluginInterface::blockForm() ● hook_block_save() → BlockPluginInterface::blockSubmit() ● Nouveautés ● BlockPluginInterface::access() : visibilité du bloc ● BlockPluginInterface::settings() : configuration par défaut (à la Views option_definition) ● BlockPluginInterface::validate() : validation avant submit.
  80. 80. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 8 block « online users »–<?php /** * @file * Contains DrupaluserPluginBlockUserOnlineBlock. */ namespace DrupaluserPluginBlock; use DrupalblockBlockBase; use DrupalComponentAnnotationPlugin; use DrupalCoreAnnotationTranslation; /** * Provides a "Who's online" block. * * @Plugin( * id = "user_online_block", * admin_label = @Translation("Who's online"), * module = "user" * ) */ class UserOnlineBlock extends BlockBase { //** Overrides DrupalblockBlockBase::settings(). public function settings() { /* ... */ } //** Overrides DrupalblockBlockBase::access(). public function access() { /* ... */ } //** Overrides DrupalblockBlockBase::blockForm(). public function blockForm($form, &$form_state) { /* ... */ } //** Overrides DrupalblockBlockBase::blockSubmit(). public function blockSubmit($form, &$form_state) { /* ... */ } /** * {@inheritdoc} */ public function build() { } }
  81. 81. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 8.0 statistiques Block– ● Drupal 6 : ● PHP – 3 fichiers – 329 lignes commentaire – 651 lignes code ● JavaScript – 1 fichier – 20 lignes commentaire – 65 lignes code ● Drupal 7 : ● PHP – 8 fichiers – 1148 lignes commentaire – 1746 lignes code ● JavaScript – 1 fichier – 31 lignes commentaire – 105 lignes code ● Drupal 8 : ● PHP – 74 fichiers – 3016 lignes commentaire – 3943 lignes code ● YAML – 16 fichiers – 2 lignes commentaire – 353 lignes données ● JavaScript – 2 fichiers – 38 lignes commentaire – 120 lignes code Drupal 1.0 : 4092 lignes de PHP
  82. 82. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 8 - UI ● Nouvelle interface d'administration : adieu la liste kilométrique des blocs inutilisés ● Interface avec les blocs actifs uniquement ● page de placement des nouveaux blocs – filtrable par module – ou visible en pour tous les modules – avec formulaire de recherche ● Simplification du formulaire de configuration ● Intégration de l'admin contextuelle avec Edit inline
  83. 83. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 8 block admin–
  84. 84. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 8 block add–
  85. 85. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 8.0 ab -n10000 -c10 (home)–Server Software: Apache/2.2.22 Server Hostname: drop8 Server Port: 80 Document Path: / Document Length: 7479 bytes Concurrency Level: 10 Time taken for tests: 46.318 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 80110000 bytes HTML transferred: 74790000 bytes Requests per second: 215.90 [#/sec] (mean) Time per request: 46.318 [ms] (mean) Time per request: 4.632 [ms] (mean, across all concurrent requests) Transfer rate: 1689.04 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 4 Processing: 13 46 19.1 44 361 Waiting: 13 46 19.0 44 361 Total: 13 46 19.1 44 361 Percentage of the requests served within a certain time (ms) 50% 44 66% 50 75% 54 80% 57 90% 66 95% 74 98% 85 99% 94 100% 361 (longest request Server Software: Apache/2.2.22 Server Hostname: drop8 Server Port: 80 Document Path: / Document Length: 7479 bytes Concurrency Level: 10 Time taken for tests: 32.602 seconds Complete requests: 10000 Failed requests: 0 Write errors: 0 Total transferred: 80110000 bytes HTML transferred: 74790000 bytes Requests per second: 306.73 [#/sec] (mean) Time per request: 32.602 [ms] (mean) Time per request: 3.260 [ms] (mean, across all concurrent requests) Transfer rate: 2399.61 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 0 0.1 0 2 Processing: 10 33 10.0 32 190 Waiting: 10 32 10.0 31 190 Total: 10 33 10.0 32 190 Percentage of the requests served within a certain time (ms) 50% 32 66% 35 75% 38 80% 40 90% 44 95% 49 98% 54 99% 58 100% 190 (longest request) Default classloader APC classloader
  86. 86. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France ms/<home anonyme> drop.org D1 D2 D3 D4.0 D4.1 D4.2 D4.3 D4.4 D4.5 D4.6 D4.7 D5 D6 D7 D8 0 5 10 15 20 25 30 35 PHP 5.3.10, MySQL 5.5, APC 3.1.9, Cache agressif, D8 APC Classloader
  87. 87. Suivez-nous, sur Facebook, Google+, Twitter... http://formation.osinet.fr/formation/drupal
  88. 88. Le système de blocs de drop.org à Drupal 8 Par Frédéric G. MARAND (fgm)

×