SlideShare une entreprise Scribd logo
1  sur  88
Télécharger pour lire hors ligne
Le système de blocs de drop.org à Drupal 8
Par Frédéric G. MARAND (fgm)
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
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
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
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
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
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
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()
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);
}
}
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...
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
drop.org - Page d'article
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)
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
drop.org thème par défaut–
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
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
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
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();
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
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
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;
}
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
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)
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 1 thème UnConeD–
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
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)
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 2 thème UnConeD–
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.→
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 3 configuration des blocs–
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(…) {}
}
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)
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 3 nouveaux thèmes–
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→
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 4.0 admin des blocs–
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 4.0 node form FO Basic–
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 4.0 node form BO–
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)
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
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 4.1 tri utilisateur des blocs–
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);
}
}
}
}
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)
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
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 4.2 block admin–
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);
}
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 4.2 - XTemplate
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)
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.
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 !
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)
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
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;
}
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;
}
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 4.4 Thème Chameleon–
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)
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
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 4.5 - Marvin
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
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é
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 4.6 Configuration de bloc–
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)
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
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
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>
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 4.7 custom blocks–
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)
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
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 5 block admin + preview–
Pushbutton
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 5 visibilité par rôle–
Bluemarine
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)
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
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
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 ?
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 ?
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)
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
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
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 7 block preview–
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)
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...
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.
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() { }
}
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
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
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 8 block admin–
Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France
Drupal 8 block add–
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
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
Suivez-nous, sur Facebook, Google+, Twitter...
http://formation.osinet.fr/formation/drupal
Le système de blocs de drop.org à Drupal 8
Par Frédéric G. MARAND (fgm)

Contenu connexe

Tendances

Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cacheMeetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cacheAurelien Navarre
 
À La découverte de flow3 - t3con12
À La découverte de flow3 -  t3con12À La découverte de flow3 -  t3con12
À La découverte de flow3 - t3con12mguermazi
 
Cours php & Mysql - 3éme partie
Cours php & Mysql - 3éme partieCours php & Mysql - 3éme partie
Cours php & Mysql - 3éme partiekadzaki
 
Drupal 8-decouverte-modules-du-coeur
Drupal 8-decouverte-modules-du-coeurDrupal 8-decouverte-modules-du-coeur
Drupal 8-decouverte-modules-du-coeurChipway
 
Loucif Redha développement d'applications web - php - my sql
Loucif Redha  développement d'applications web - php - my sqlLoucif Redha  développement d'applications web - php - my sql
Loucif Redha développement d'applications web - php - my sqlRedha LOUCIF
 
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de donnéesMongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de donnéesSOAT
 
Cours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partieCours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partiekadzaki
 
Tout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pasTout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pasPierre-Alban DEWITTE
 
Document Object Model ( DOM)
Document Object Model ( DOM)Document Object Model ( DOM)
Document Object Model ( DOM)Abdelouahed Abdou
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLDamien Seguy
 

Tendances (20)

Introduction à HTML 5
Introduction à HTML 5Introduction à HTML 5
Introduction à HTML 5
 
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cacheMeetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
Meetup Drupal Lyon mars 2013 - Optimiser les performances Drupal par le cache
 
Initiation à Bootstrap
Initiation à BootstrapInitiation à Bootstrap
Initiation à Bootstrap
 
À La découverte de flow3 - t3con12
À La découverte de flow3 -  t3con12À La découverte de flow3 -  t3con12
À La découverte de flow3 - t3con12
 
Html 5
Html 5Html 5
Html 5
 
Cours php & Mysql - 3éme partie
Cours php & Mysql - 3éme partieCours php & Mysql - 3éme partie
Cours php & Mysql - 3éme partie
 
Php & My Sql
Php & My SqlPhp & My Sql
Php & My Sql
 
Drupal 8-decouverte-modules-du-coeur
Drupal 8-decouverte-modules-du-coeurDrupal 8-decouverte-modules-du-coeur
Drupal 8-decouverte-modules-du-coeur
 
Loucif Redha développement d'applications web - php - my sql
Loucif Redha  développement d'applications web - php - my sqlLoucif Redha  développement d'applications web - php - my sql
Loucif Redha développement d'applications web - php - my sql
 
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de donnéesMongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
 
Cours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partieCours php & Mysql - 1ére partie
Cours php & Mysql - 1ére partie
 
Bootstrap 3
Bootstrap 3Bootstrap 3
Bootstrap 3
 
Tout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pasTout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pas
 
Document Object Model ( DOM)
Document Object Model ( DOM)Document Object Model ( DOM)
Document Object Model ( DOM)
 
Outils front-end
Outils front-endOutils front-end
Outils front-end
 
Apprenez le jQuery
Apprenez le jQueryApprenez le jQuery
Apprenez le jQuery
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQL
 
Introduction a jQuery
Introduction a jQueryIntroduction a jQuery
Introduction a jQuery
 
Les base du Html5
Les base du Html5Les base du Html5
Les base du Html5
 
SPIP
SPIPSPIP
SPIP
 

En vedette

Energy.gov Case Study - BADcamp 2011
Energy.gov Case Study - BADcamp 2011Energy.gov Case Study - BADcamp 2011
Energy.gov Case Study - BADcamp 2011zroger
 
Markup Ain't Easy or: How I Learned to love An Object-Oriented RenderAPI
Markup Ain't Easy or: How I Learned to love An Object-Oriented RenderAPIMarkup Ain't Easy or: How I Learned to love An Object-Oriented RenderAPI
Markup Ain't Easy or: How I Learned to love An Object-Oriented RenderAPIc4rl
 
DruplCampNYC 10 - Energy.gov Case Study
DruplCampNYC 10 - Energy.gov Case StudyDruplCampNYC 10 - Energy.gov Case Study
DruplCampNYC 10 - Energy.gov Case Studyzroger
 
Drupal biz case tomohuynh
Drupal biz case tomohuynhDrupal biz case tomohuynh
Drupal biz case tomohuynhphanquang144
 
Drupal distributions - how to build them
Drupal distributions - how to build themDrupal distributions - how to build them
Drupal distributions - how to build themDick Olsson
 
Consistent hashing
Consistent hashingConsistent hashing
Consistent hashingzroger
 

En vedette (6)

Energy.gov Case Study - BADcamp 2011
Energy.gov Case Study - BADcamp 2011Energy.gov Case Study - BADcamp 2011
Energy.gov Case Study - BADcamp 2011
 
Markup Ain't Easy or: How I Learned to love An Object-Oriented RenderAPI
Markup Ain't Easy or: How I Learned to love An Object-Oriented RenderAPIMarkup Ain't Easy or: How I Learned to love An Object-Oriented RenderAPI
Markup Ain't Easy or: How I Learned to love An Object-Oriented RenderAPI
 
DruplCampNYC 10 - Energy.gov Case Study
DruplCampNYC 10 - Energy.gov Case StudyDruplCampNYC 10 - Energy.gov Case Study
DruplCampNYC 10 - Energy.gov Case Study
 
Drupal biz case tomohuynh
Drupal biz case tomohuynhDrupal biz case tomohuynh
Drupal biz case tomohuynh
 
Drupal distributions - how to build them
Drupal distributions - how to build themDrupal distributions - how to build them
Drupal distributions - how to build them
 
Consistent hashing
Consistent hashingConsistent hashing
Consistent hashing
 

Similaire à Les blocs Drupal de drop.org à Drupal 8

DrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - ThemingDrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - ThemingRomain Jarraud
 
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...Pierre Ternon
 
Theming drupal8 - Meetup Paris - 26-mars-2015
Theming drupal8 - Meetup Paris - 26-mars-2015Theming drupal8 - Meetup Paris - 26-mars-2015
Theming drupal8 - Meetup Paris - 26-mars-2015Romain Jarraud
 
"Un module Prestashop, comment ca marche?"
"Un module Prestashop, comment ca marche?""Un module Prestashop, comment ca marche?"
"Un module Prestashop, comment ca marche?"o2sources
 
Joomla! Platform - Pourquoi l’API Joomla!
Joomla! Platform - Pourquoi l’API Joomla!Joomla! Platform - Pourquoi l’API Joomla!
Joomla! Platform - Pourquoi l’API Joomla!Bilel McSam
 
Rmll2010 admin sys-panelgzw-fr
Rmll2010 admin sys-panelgzw-frRmll2010 admin sys-panelgzw-fr
Rmll2010 admin sys-panelgzw-frGaëtan Trellu
 
Drupal 7 - Fondamentaux et ateliers
Drupal 7 - Fondamentaux et ateliersDrupal 7 - Fondamentaux et ateliers
Drupal 7 - Fondamentaux et ateliersFrédéric Simonet
 
Réussir son projet Drupal
Réussir son projet DrupalRéussir son projet Drupal
Réussir son projet DrupalAdyax
 
Tout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pasTout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pasBruno Bonnin
 
Découvrir Drupal, le CMS Open Source de référence
Découvrir Drupal, le CMS Open Source de référenceDécouvrir Drupal, le CMS Open Source de référence
Découvrir Drupal, le CMS Open Source de référenceLINAGORA
 
Comment traduire ses bases de données sans douleur
Comment traduire ses bases de données sans douleurComment traduire ses bases de données sans douleur
Comment traduire ses bases de données sans douleurDavid Paccoud
 
Creation de template_joomla_2.5_-_v_1.0
Creation de template_joomla_2.5_-_v_1.0Creation de template_joomla_2.5_-_v_1.0
Creation de template_joomla_2.5_-_v_1.0Faiz Morchid
 

Similaire à Les blocs Drupal de drop.org à Drupal 8 (20)

Drupal 8
Drupal 8Drupal 8
Drupal 8
 
DrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - ThemingDrupalCamp Paris 2013 - Theming
DrupalCamp Paris 2013 - Theming
 
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
Gestion de projet Drupal : quelques outils indispensables - OWS - Drupalcamp ...
 
Créer un template pour Joomla 2.5
Créer un template pour Joomla 2.5Créer un template pour Joomla 2.5
Créer un template pour Joomla 2.5
 
iTunes Stats
iTunes StatsiTunes Stats
iTunes Stats
 
Theming drupal8 - Meetup Paris - 26-mars-2015
Theming drupal8 - Meetup Paris - 26-mars-2015Theming drupal8 - Meetup Paris - 26-mars-2015
Theming drupal8 - Meetup Paris - 26-mars-2015
 
BDW-ProgWEB_P1.pdf
BDW-ProgWEB_P1.pdfBDW-ProgWEB_P1.pdf
BDW-ProgWEB_P1.pdf
 
Atelier template
Atelier templateAtelier template
Atelier template
 
"Un module Prestashop, comment ca marche?"
"Un module Prestashop, comment ca marche?""Un module Prestashop, comment ca marche?"
"Un module Prestashop, comment ca marche?"
 
J platform
J platformJ platform
J platform
 
Joomla! Platform - Pourquoi l’API Joomla!
Joomla! Platform - Pourquoi l’API Joomla!Joomla! Platform - Pourquoi l’API Joomla!
Joomla! Platform - Pourquoi l’API Joomla!
 
Rmll2010 admin sys-panelgzw-fr
Rmll2010 admin sys-panelgzw-frRmll2010 admin sys-panelgzw-fr
Rmll2010 admin sys-panelgzw-fr
 
Drupal 7 - Fondamentaux et ateliers
Drupal 7 - Fondamentaux et ateliersDrupal 7 - Fondamentaux et ateliers
Drupal 7 - Fondamentaux et ateliers
 
Réussir son projet Drupal
Réussir son projet DrupalRéussir son projet Drupal
Réussir son projet Drupal
 
Aeris web components
Aeris web componentsAeris web components
Aeris web components
 
Versioning avec Git
Versioning avec GitVersioning avec Git
Versioning avec Git
 
Tout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pasTout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pas
 
Découvrir Drupal, le CMS Open Source de référence
Découvrir Drupal, le CMS Open Source de référenceDécouvrir Drupal, le CMS Open Source de référence
Découvrir Drupal, le CMS Open Source de référence
 
Comment traduire ses bases de données sans douleur
Comment traduire ses bases de données sans douleurComment traduire ses bases de données sans douleur
Comment traduire ses bases de données sans douleur
 
Creation de template_joomla_2.5_-_v_1.0
Creation de template_joomla_2.5_-_v_1.0Creation de template_joomla_2.5_-_v_1.0
Creation de template_joomla_2.5_-_v_1.0
 

Plus de OSInet

Interface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TViewInterface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TViewOSInet
 
Scaling up and accelerating Drupal 8 with NoSQL
Scaling up and accelerating Drupal 8 with NoSQLScaling up and accelerating Drupal 8 with NoSQL
Scaling up and accelerating Drupal 8 with NoSQLOSInet
 
Mon site web est hacké ! Que faire ?
Mon site web est hacké ! Que faire ?Mon site web est hacké ! Que faire ?
Mon site web est hacké ! Que faire ?OSInet
 
Faster Drupal sites using Queue API
Faster Drupal sites using Queue APIFaster Drupal sites using Queue API
Faster Drupal sites using Queue APIOSInet
 
Life after the hack
Life after the hackLife after the hack
Life after the hackOSInet
 
Delayed operations with queues for website performance
Delayed operations with queues for website performanceDelayed operations with queues for website performance
Delayed operations with queues for website performanceOSInet
 
Drupal 8 : regards croisés
Drupal 8 : regards croisésDrupal 8 : regards croisés
Drupal 8 : regards croisésOSInet
 
Cache speedup with Heisencache for Drupal 7 and Drupal 8
Cache speedup with Heisencache for Drupal 7 and Drupal 8Cache speedup with Heisencache for Drupal 7 and Drupal 8
Cache speedup with Heisencache for Drupal 7 and Drupal 8OSInet
 
Recueil des mauvaises pratiques constatées lors de l'audit de sites Drupal 7
Recueil des mauvaises pratiques constatées lors de l'audit de sites Drupal 7Recueil des mauvaises pratiques constatées lors de l'audit de sites Drupal 7
Recueil des mauvaises pratiques constatées lors de l'audit de sites Drupal 7OSInet
 
Le groupe PHP-FIG et les standards PSR
Le groupe  PHP-FIG et les standards PSRLe groupe  PHP-FIG et les standards PSR
Le groupe PHP-FIG et les standards PSROSInet
 
Utiliser drupal
Utiliser drupalUtiliser drupal
Utiliser drupalOSInet
 
Equipe drupal
Equipe drupalEquipe drupal
Equipe drupalOSInet
 
Pourquoi choisir un CMS Open Source ?
Pourquoi choisir un CMS Open Source ?Pourquoi choisir un CMS Open Source ?
Pourquoi choisir un CMS Open Source ?OSInet
 
Drupal et le NoSQL - drupagora 2011
Drupal et le NoSQL - drupagora 2011Drupal et le NoSQL - drupagora 2011
Drupal et le NoSQL - drupagora 2011OSInet
 
Drupal Views development
Drupal Views developmentDrupal Views development
Drupal Views developmentOSInet
 

Plus de OSInet (15)

Interface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TViewInterface texte plein écran en Go avec TView
Interface texte plein écran en Go avec TView
 
Scaling up and accelerating Drupal 8 with NoSQL
Scaling up and accelerating Drupal 8 with NoSQLScaling up and accelerating Drupal 8 with NoSQL
Scaling up and accelerating Drupal 8 with NoSQL
 
Mon site web est hacké ! Que faire ?
Mon site web est hacké ! Que faire ?Mon site web est hacké ! Que faire ?
Mon site web est hacké ! Que faire ?
 
Faster Drupal sites using Queue API
Faster Drupal sites using Queue APIFaster Drupal sites using Queue API
Faster Drupal sites using Queue API
 
Life after the hack
Life after the hackLife after the hack
Life after the hack
 
Delayed operations with queues for website performance
Delayed operations with queues for website performanceDelayed operations with queues for website performance
Delayed operations with queues for website performance
 
Drupal 8 : regards croisés
Drupal 8 : regards croisésDrupal 8 : regards croisés
Drupal 8 : regards croisés
 
Cache speedup with Heisencache for Drupal 7 and Drupal 8
Cache speedup with Heisencache for Drupal 7 and Drupal 8Cache speedup with Heisencache for Drupal 7 and Drupal 8
Cache speedup with Heisencache for Drupal 7 and Drupal 8
 
Recueil des mauvaises pratiques constatées lors de l'audit de sites Drupal 7
Recueil des mauvaises pratiques constatées lors de l'audit de sites Drupal 7Recueil des mauvaises pratiques constatées lors de l'audit de sites Drupal 7
Recueil des mauvaises pratiques constatées lors de l'audit de sites Drupal 7
 
Le groupe PHP-FIG et les standards PSR
Le groupe  PHP-FIG et les standards PSRLe groupe  PHP-FIG et les standards PSR
Le groupe PHP-FIG et les standards PSR
 
Utiliser drupal
Utiliser drupalUtiliser drupal
Utiliser drupal
 
Equipe drupal
Equipe drupalEquipe drupal
Equipe drupal
 
Pourquoi choisir un CMS Open Source ?
Pourquoi choisir un CMS Open Source ?Pourquoi choisir un CMS Open Source ?
Pourquoi choisir un CMS Open Source ?
 
Drupal et le NoSQL - drupagora 2011
Drupal et le NoSQL - drupagora 2011Drupal et le NoSQL - drupagora 2011
Drupal et le NoSQL - drupagora 2011
 
Drupal Views development
Drupal Views developmentDrupal Views development
Drupal Views development
 

Les blocs Drupal de drop.org à Drupal 8

  • 1. Le système de blocs de drop.org à Drupal 8 Par Frédéric G. MARAND (fgm)
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France drop.org - Page d'article
  • 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France drop.org thème par défaut–
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 1 thème UnConeD–
  • 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. 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 2 thème UnConeD–
  • 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 3 configuration des blocs–
  • 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. 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 3 nouveaux thèmes–
  • 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.0 admin des blocs–
  • 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.0 node form BO–
  • 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. 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.1 tri utilisateur des blocs–
  • 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. 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. 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.2 block admin–
  • 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.2 - XTemplate
  • 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. 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. 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. 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. 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. 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. 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.4 Thème Chameleon–
  • 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. 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.5 - Marvin
  • 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. 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.6 Configuration de bloc–
  • 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. 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. 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. 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 4.7 custom blocks–
  • 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. 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 5 block admin + preview– Pushbutton
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 7 block preview–
  • 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. 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. 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. 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. 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. 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. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 8 block admin–
  • 84. Les blocs de Drupal 1 à Drupal 8 / © 2013 OSInet / Licence CC-BY-SA 2.0 France Drupal 8 block add–
  • 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. 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. Suivez-nous, sur Facebook, Google+, Twitter... http://formation.osinet.fr/formation/drupal
  • 88. Le système de blocs de drop.org à Drupal 8 Par Frédéric G. MARAND (fgm)