Vegan Frontend developer at
@pakmanlh in the internets
Hola! soy el marcado de Drupal
Otro div más, porque no...
El valor relevante
...o casi.
…es historia!
…están siendo convertidas a plantillas…
(y en otros formatos).
Solamente quedan 12! http://dgo.to/2348381
$variables['list'] = theme('item_list', array(
'items' => $items,
));
Drupal 8:
$variables['list'] = [
'#theme' => 'item_list',
'#items' => $items,
];
/**
* Implements hook_preprocess_HOOK() for node templates.
*/
function MYTHEME_preprocess_node(&$variables) {
$variables['theme_hook_suggestions'][] = 'node__' . 'my_first_suggestion';
$variables['theme_hook_suggestions'][] = 'node__' . 'my_second_more_specific_suggestion';
}
Drupal 8:
/**
* Implements hook_theme_suggestions_HOOK_alter() for node templates.
*/
function MYTHEME_theme_suggestions_node_alter(array &$suggestions, array $variables) {
$suggestions[] = 'node__' . 'my_first_suggestion';
$suggestions[] = 'node__' . 'my_second_suggestion';
}
<div{{ attributes }}>
<div {{ attributes }}>
<div✖{{ attributes }}>
<div class="myclass {{ attributes.class }}"{{ attributes|without('class') }}>
<div{{ attributes.addClass('hola').removeClass('adiós') }}>
{% if attributes.hasClass('field-label-inline') %}
{# Realizar algún código personalizado para la etiqueta inline. #}
{% endif %}
<div{{ attributes.setAttribute('id', 'eye-d') }}>
<div{{ attributes.removeAttribute('id') }}>
// Ocultamos los comentarios y los links
// para imprimirlos después.
hide($content['comments']);
hide($content['links']);
print render($content);
// Render llama a show() en el elemento.
print render($content['links']);
// Para devolver los enlaces con el contenido.
show($content['links']);
// Imprime el contenido con enlaces pero todavía
// sin comentarios :(
print render($content);
{# Imprime el contenido sin comentarios ni enlaces #}
{{ content|without('comments', 'links') }}
{# Imprime solamente los enlaces #}
{{ content.links }}
{# Imprime todo sin los comentarios! #}
{{ content|without('comments') }}
{# Imprime todo YUJU :) #}
{{ content }}
Creo que lo habréis notado… 😉
parameters:
twig.config:
debug: true
Ejemplo de código:
<!-- THEME DEBUG -->
<!-- THEME HOOK: 'block' -->
<!-- FILE NAME SUGGESTIONS:
* block--bartik-powered.html.twig
* block--system-powered-by-block.html.twig
* block--system.html.twig
x block.html.twig
-->
<!-- BEGIN OUTPUT from 'core/modules/block/templates/block.html.twig' -->
<div class="block block-system contextual-region" id="block-bartik-powered" role="complementary">
<div data-contextual-id="block:block=bartik_powered:"></div>
<div class="content">
<span>Powered by <a href="http://drupal.org">Drupal</a></span>
</div>
</div>
<!-- END OUTPUT from 'core/modules/block/templates/block.html.twig' -->
$conf['theme_debug'] = TRUE;
Example output:
<!-- THEME DEBUG -->
<!-- CALL: theme('block') -->
<!-- FILE NAME SUGGESTIONS:
* block--system--powered-by.tpl.php
* block--system.tpl.php
* block--footer.tpl.php
x block.tpl.php
-->
<!-- BEGIN OUTPUT from 'modules/block/block.tpl.php' -->
<div id="block-system-powered-by" class="block block-system">
<div class="content">
<span>Powered by <a href="https://www.drupal.org">Drupal</a></span>
</div>
</div>
<!-- END OUTPUT from 'modules/block/block.tpl.php' -->
// Valor de un Array.
$bocadillo['tofu'];
// Propiedad de un objeto.
$bocadillo->tofu;
// También para el método mágico.
$bocadillo->__isset('tofu'); && $bocadillo->__get('tofu');
// Para un método de un objeto.
$bocadillo->tofu();
// Para un objeto obtenido con la convención get.
$bocadillo->getTofu();
// Objeto is convención método.
$bocadillo->isTofu();
// Método dinámico.
$bocadillo->__call('tofu');
{{ bocadillo.tofu }}
$user->field_first_name = "<script>alert('XSS')</script>";
MAL <?php print $user->field_first_name; ?>
BIEN <?php print check_plain($user->field_first_name); ?>
BIEN {{ user.field_first_name }}
MAL {{ user.field_first_name|raw }}
Definimos una «zona variante»
page.html.twig
{% block variante %}
{% endblock %}
Heredamos toda la página,
modificando solamente ese trozo
page--front.html.twig
{% extends "page.html.twig" %}
{% block variante %}
Contenido específico de la página principal.
{% endblock %}
Usando una macro recursivo de Twig en menu.html.twig
Modificando pager.html.twig
{{{ code }}
{{{ code }}
base theme: classy
.notification {
/* Estilos generales para todas las notificaciones. */
}
.notification--info {
/* Ajustes de color concretos. */
}
/* Componente botón */
.button {
/* estilos */
}
/* Clase modificadora del botón */
.button--primary {
/* Modificadores y añadidos. */
}
Herramienta para mejorar la calidad del código.
pako@ymbra.com
@pakmanlh