Crear un tema de Drupal y el principo de Singularidad de S.O.L.I.D.

S.O.L.I.D. es un conjunto de principios que buscan la mejor manera de llevar a cabo la P.O.O., el primero de estos principios, es la S de Principio de responsabilidad única (Single responsibility principle), la Wikipedia nos dice esto de este principio:

El principio de responsabilidad única u SRP (siglas del inglés (Single Responsibility Principle) establece que cada módulo o clase debe tener responsabilidad sobre una sola parte de la funcionalidad proporcionada por el software y esta responsabilidad debe estar encapsulada en su totalidad por la clase. Todos sus servicios deben estar estrechamente alineados con esa responsabilidad. Robert C. Martin expresa el principio de la siguiente forma:

Una clase debe tener solo una razón para cambiar.
En programación orientada a objetos, se suele definir como principio de diseño que cada clase debe tener una única responsabilidad, y que esta debe estar contenida únicamente en la clase. Así:

Una clase debería tener sólo una razón para cambiar
Cada responsabilidad es el eje del cambio
Para contener la propagación del cambio, debemos separar las responsabilidades.
Si una clase asume más de una responsabilidad, será más sensible al cambio.
Si una clase asume más de una responsabilidad, las responsabilidades se acoplan.

Fuente: https://es.wikipedia.org/wiki/Principio_de_responsabilidad_%C3%BAnica

Llevado a la creación de temas de Drupal y más concretamente a los archivos tpl este principio significaría que deberíamos tener un único tpl por cada posible caso que se pueda dar a la hora de pintar una entidad, esto es si tenemos una entidad que en función de una variable se muestra de una manera u otra. Pero lo que me he encontrado muchas veces en Drupal, yo también lo he hecho alguna vez. Lo habitual es crear un conjunto de if/elseif/else para en función de los resultados de las validaciones añadir un código u otro.

Siguiendo el principio de Responsabilidad única deberíamos ser capaces de indicar en función del valor de la variable la forma de visualizar el contenido, veamos que formas tenemos de hacer esto:
La forma más conocida para hacer esto es el módulo panels, que nos permite crear diferentes visualizaciones en función del valor de la variable correspondiente, esto lo podemos hacer sin necesidad de programar nada, únicamente mediante el sitebuilding de Drupal.
La segunda opción es crear un "View mode" por cada uno de los posibles valores que tendrá la $variable, y luego usaremos el módulo Display Suit para configurar como se visualizará cada uno de los "View mode" creados.

Adicionalmente a Display Suit existe el módulo Views modes en Drupal 7, que también permite crear diferentes View modes desde la configuración de Drupal, en Drupal 8 tenemos el módulo Display modes en el core, que nos permite crear los View modes necesarios.

El sistema de nombre de los tpls de drupal permite usar un tpl para cada View mode, usando la siguiente nomenclatura: "node"-"tipo-de-nodo-"-"View-mode".tpl.php, tendríamos este por ejemplo: node-noticicias-teaser.tpl.php

Si somos programadores que nos gusta picar código podemos hacerlo también de la siguiente manera:

Drupal 7

Primero tendremos que usar el hook_entity_info_alter() para crear un nuevo View mode.

<?php
/**
 * Implements hook_entity_info_alter().
 */
function MYMODULE_entity_info_alter(&$entity_info) {
 
$entity_info['node']['view modes']['alternate'] = array(
   
'label' => t('Alternate'),
   
'custom settings' => TRUE,
  );
}
?>

Y luego indicar en que momento cambiaremos el tpl que vamos a usar, existen dos opciones, usar hook_entity_view_mode_alter

<?php
function hook_entity_view_mode_alter(&$view_mode, $context) {
 
 
// For nodes, change the view mode when it is teaser.
 
if ($context['entity_type'] == 'node' && $view_mode == 'teaser') {
   
$view_mode = 'my_custom_view_mode';
  }
}
?>

O usar el hook preprocess para cambiar el tpl que vamos a usar.

<?php
/**
 * Implements template_preprocess_node()
 */
function THEME_preprocess_node(&$variables) {
 
$node = $variables['node'];
 
$view_mode = $variables['view_mode'];
 
 
// Set up template suggestions for non-standard view modes
 
if ($view_mode !== 'full') {
   
$variables['theme_hook_suggestions'][] = 'node__' . $node->type . '__' . $view_mode;
  }
}
?>

Drupal 8

Para crear un View mode en drupal 8 tenemos dos opciones, en ambos casos tenemos que crear un módulo.
En la opción 1:

  • Creamos un módulo
  • Creamos un directorio config/install
  • Dentro de config/install creamos un archivo llamado core.entity_view_mode.node.my_module.yml

El contenido del archivo creado será el siguiente:

langcode: en
status: true
dependencies:
  module:
    - node
    - my_module
id: node.my_module
label: 'My Module'
targetEntityType: node
cache: true

La segunda opción, usando php sería:

<?php
$entity_type
="node"; //The entity for which you want to create the view mode
$view_mode="example"; //The name of the new view mode
$settings=Array();
$settings["id"]=$entity_type.".".$view_mode;
$settings["targetEntityType"]=$entity_type;
$evm=Drupal\Core\Entity\Entity\EntityViewMode::create($settings);
$evm->save();
?>

Y una vez creados los View modes, y definidos los nombres de los tpls, podemos crear el código dentro de estos archivos, para pintar como necesitamos la información. Así que ya sabéis, uséis el método que uséis siempre siempre tenemos que respetar el principio de Singularidad y un tpl que resuelva un único View mode.

Si somos totalmente estrictos en este planteamiento, no deberíamos hacer tampoco este tipo de cosas en los tpls:

<button type="submit"
    id="edit-submit--2"
    name=" "
    value=" "
    class="btn btn-primary form-submit"
    action="<?php print $node->field_herramienta_boton['und'][0]['url']; ?>">
    <?php print $node->field_herramienta_boton['und'][0]['title']; ?>
</button>

Sino que deberíamos crear un field formatter de nuestros campos para indicar las nuevas formas en las que queremos que estos se pinten, en Drupal 8 se hace mediante el nuevo sistema de plugins.