Forcontu d8 Back End Development3 Completo
Forcontu d8 Back End Development3 Completo
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
Experto en Drupal 8
Back-End Development III
Fran Gil
Todos los derechos reservados. El contenido de este libro, tanto en su totalidad como parcialmente no
puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier medio ya sea
electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización expresa y escrita
por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o puesta a disposición
como resúmenes, reseñas o revistas de prensa, fines para los que también será necesario contar con la
correspondiente autorización de Forcontu S.L. Para obtener más información, póngase en contacto a
través de info@[Link].
Aunque esta publicación ha sido desarrollada con gran cuidado, ni Forcontu S.L., ni los autores serán
responsables de los posibles errores y las consecuencias que pueda causar, directa o indirectamente, la
información contenida en este trabajo. Por favor, dirija cualquier recomendación o comentario a
info@[Link].
Ayúdenos a mejorar los libros reportando cualquier error que encuentre. Puede hacerlo directamente
completando este formulario: [Link]
Para más información sobre el contenido de este libro o sobre los canales de distribución, escriba
directamente a info@[Link] o visite la página web [Link].
DATOS DE DESCARGA:
Fuente: [Link]
Fecha: 31/07/18 23:08
IP: [Link]
Código de verificación: EBOD8BD300055495000774
EBOD8BD300055495000774
Presentación
Presentación
Estoy seguro de que si has llegado hasta aquí es porque deseas
conocer Drupal a fondo. No importa si sólo has oído hablar de
sus numerosas ventajas con respecto a otros CMS, o si ya lo
conoces y quieres seguir profundizando en su estudio.
Sabrás que te has convertido en un experto en Drupal cuando puedas desarrollar un proyecto
sintiéndote seguro y cómodo, y eso se consigue con la base necesaria para no perder tiempo en lo
cotidiano y focalizar así tus esfuerzos en afrontar los nuevos retos que vayan surgiendo. Porque sí,
Drupal es un entorno en continua evolución y siempre tendrás nuevos retos a los que enfrentarte,
nuevas cosas que aprender y nuevos módulos que probar. Siempre tendrás dudas que consultar, pero
notarás que el nivel de tus consultas va subiendo junto con tu grado de experiencia.
Desde 2009 han sido muchas las personas que han aprendido Drupal con los libros y cursos de Forcontu,
primero de Drupal 6 y luego de Drupal 7, y que después de todo este tiempo han seguido desarrollando
sus proyectos con Drupal y comparten con nosotros su progreso y, como no, su ilusión por dar el salto
a Drupal 8 con nosotros.
Ahora comienza, para todos, una nueva etapa con un Drupal 8 más profesional y más complejo.
Drupal 8 ha dado un importante salto evolutivo con respecto a Drupal 7, por lo que la inversión en
adaptación y reciclaje se hace necesaria incluso si llevas años trabajando con Drupal.
Presentación
En Forcontu estamos desarrollando unos planes formativos para Drupal 8 mucho más completos
que los anteriores, que te permitan aprender tanto Drupal como otras tecnologías que son necesarias
para la implementación de sitios web modernos. De hecho, para esta nueva versión hemos separado
los libros y cursos en tres ramas o perfiles profesionales: Site Building, Back-End Development y
Front-End Development. De esta forma podrás especializarte exclusivamente en uno de los perfiles
y obtener tu certificado de Experto en Drupal 8 (Site Building, Back-End Development o Front-
End Development), o atreverte con las tres disciplinas y obtener el certificado de Máster en Drupal
8, que te certifica como desarrollador Full-Stack, que es el perfil laboral relacionado con Drupal más
demandado.
Desde 2012 nuestros libros y cursos están disponibles en español e inglés, y los certificados también se
emiten en ambos idiomas para que puedas ampliar tus opciones laborales.
Si ya te has comprometido con Drupal, permítenos acompañarte en esta nueva etapa de tu carrera
profesional y guiarte para lograr tu objetivo de convertirte en un Experto en Drupal 8.
Fran Gil
Co-fundador y CEO Forcontu
[Link]@[Link]
@frankgil76
Modalidad de impartición
Los participantes dispondrán, además del aula virtual, de un alojamiento web para realizar las prácticas
propuestas en el curso. El alumno podrá estudiar y practicar en cualquier momento del día, adaptando
el temario y las actividades a sus necesidades profesionales o particulares.
El curso de Experto en Drupal 8 Back-End Development tiene una duración estimada de 5 meses
y 300 horas certificadas, con una dedicación semanal de 15 horas. En este período se incluye la
realización de las actividades (240 horas) y del Proyecto Final (60 horas).
Para que puedas tener más margen y tomarte algunas semanas de descanso, tendrás 6 meses para
completarlo. Ten en cuenta que éste es el tiempo máximo, pero si le dedicas más horas o tienes
experiencia previa en Drupal y/o en programación, seguro que puedes completarlo en menos tiempo.
Además, si al finalizar el período de matrícula no has podido completar el curso, siempre podrás ampliar
la matrícula mes a mes, sin perder todo el trabajo realizado y sin que afecte a tu calificación final.
Ampliación de matrícula
Los alumnos que no hayan podido completar el curso en el tiempo establecido, podrán ampliar la
matrícula por períodos mensuales, hasta finalizar el curso. Consulta en nuestra web el coste adicional
de esta ampliación.
El objetivo principal del curso Experto en Drupal 8 Back-End Development es la capacitación del
alumno como desarrollador Back-End para el desarrollo de módulos personalizados con Drupal 8.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III vii
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
- Crear módulos desde cero y extender módulos existentes. Además de crear módulos
desde cero, también aprenderemos a extender y modificar funcionalidades aportadas por el
núcleo o por cualquier módulo contribuido.
A través de este curso aprenderás a programar módulos personalizados de cualquier tipo para Drupal
8. También aprenderás a utilizar las tecnologías y herramientas necesarias para abordar esta tarea de
forma productiva.
La capacitación adquirida te será de gran ayuda para introducirte en el mercado laboral, mejorar en tu
puesto de trabajo o incluso emprender un proyecto propio basado en tecnologías web.
A quién va dirigido
- Desarrolladores con conocimientos de Drupal 8 a nivel de Site Building que desean profundizar
en la programación de módulos personalizados. Se recomienda cursar primero el curso de
Experto en Drupal 8 Site Building.
- Cualquier persona que, sin conocimientos de programación previos, desea reorientar su carrera
profesional hacia la programación y el desarrollo de sitios web con Drupal 8.
Para acceder al curso de Experto en Drupal 8 Back-End Development no son necesarios conocimientos
de programación. El curso incluye una buena base de programación para personas con ningún o pocos
conocimientos de programación. Aún así, debes entender que, si no tienes conocimientos previos de
programación, se trata de un reto muy importante que requerirá un esfuerzo adicional al de otros
compañeros que sí cuenten con una base de programación.
Aunque no se requiere una titulación académica específica, por su orientación profesionalizadora, es
recomendado para diseñadores, desarrolladores web y programadores con titulaciones técnicas
universitarias o de formación profesional.
Requisitos técnicos
Para realizar el curso es necesario disponer de un ordenador con conexión a internet y navegador web.
Durante el curso te iremos indicando las aplicaciones que debes instalar (cliente FTP, entorno de
desarrollo, etc.).
viii Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
El curso de Experto en Drupal 8 Back-End Development incluye los siguientes servicios y materiales:
- Libros. Existe mucha información sobre Drupal disponible en libros, blogs, foros, etc. En
Forcontu hemos desarrollado unos materiales formativos organizados, en español y
compuestos de diferentes objetos de aprendizaje para asegurar la capacitación profesional en
Drupal. El curso incluye los libros:
La versión en PDF de los libros se irá actualizando periódicamente para ir incorporando los
cambios que se vayan produndiendo en los contenidos abordados.
- Aula virtual. Dentro del aula encontrarás más información sobre los pasos a seguir durante
el curso y las actividades a realizar.
- Alojamiento web para la realización de las actividades propuestas y del Proyecto Final de
experto.
- Carta de recomendación, para los alumnos que hayan superado el curso con una calificación
superior al 95%.
- Incorporación a la bolsa de trabajo, donde recibirás las ofertas que publiquen las
empresas interesadas en desarrolladores con conocimientos de Drupal.
0.2 Contenidos
0.3 Metodología
Metodología
Dispondrás de una guía de trabajo con los pasos a seguir: lectura de cada unidad y prácticas a realizar.
A través de los foros del aula virtual, el tutor te guiará en tu proceso de aprendizaje, resolviendo las
dudas que te vayan surgiendo durante el curso. También podrás consultar las dudas planteadas por el
resto de participantes e incluso intervenir ayudando a tus compañeros.
Se te facilitará un alojamiento web individual para realizar las actividades. Nuestros alojamientos están
preparados especialmente para alojar sitios web en Drupal 8. Al trabajar en un servidor remoto, el tutor
tendrá acceso a tu sitio web y podrá ver tu trabajo y guiarte en el desarrollo de las actividades
propuestas.
Cuando completas y envias una actividad, el sistema intentará corregirla automáticamente. Si detecta
algún error, te guiará para corregirla. De esta forma podrás tener un feedback de tu trabajo en cualquier
momento, sin depender de la intervención del tutor. Aún así, el tutor estará disponible para resolver
cualquier duda y para corregir manualmente aquellas actividades que el autocorrector no haya sido
capaz de evaluar.
Podrás realizar las prácticas en cualquier momento, adaptando el temario y las actividades a tu ritmo
de trabajo, pero siempre teniendo en cuenta la fecha final de finalización del curso.
El curso se completa con un Proyecto Final acorde a cada especialidad. En el curso de Back-End
Development, el Proyecto Final consiste en implementar un módulo, ampliar un módulo existente o
solucionar errores de módulos constribuidos en [Link]. Si ya tienes un proyecto en mente, podrás
aprovechar el Proyecto Final para realizarlo y recibir la ayuda y feedback del tutor.
Plataforma educativa
El estudiante, una vez matriculado en el curso, será dado de alta en la plataforma educativa y el aula
correspondiente al módulo a cursar.
Los tutores y estudiantes podrán comunicarse libremente a través de los foros (de forma pública para
todo el grupo), o del correo interno (de forma privada, sólo para los destinatarios indicados)
habilitados para cada curso. Por defecto se enviará un duplicado de estas comunicaciones al correo
electrónico externo facilitado por el estudiante.
Los estudiantes de un mismo grupo podrán contactar entre sí y compartir sus experiencias y resultados
con las actividades y materiales propuestos.
- Foro Guía (foro del tutor). En este foro sólo pueden publicar los tutores, y servirá para
comunicar a todo el grupo cuestiones generales sobre el curso u otras cuestiones que
consideren de interés.
- Foro Aprende (foro del curso). En este foro podrán publicar tanto tutores como estudiantes,
y se utilizará para discutir cuestiones relacionadas con Drupal y el curso. Los estudiantes
podrán plantear aquí sus dudas sobre las actividades y otras consultas generales sobre Drupal.
- Correo interno. Permite enviar mensajes a otros compañeros del aula, tanto tutores como
estudiantes.
- Participantes. Listado de participantes del curso, incluyendo tutores y estudiantes.
- Usuarios en línea. Muestra un listado con los participantes que están conectados en ese
momento.
- Perfil. Permite administrar el perfil del usuario: modificar la contraseña de acceso, modificar
los datos personales, cambiar la foto, etc.
- Calificaciones. Permite consultar las calificaciones obtenidas.
Evaluación continua
La puntuación máxima que se puede obtener en el curso es de 1000 puntos, y es necesario completar
al menos 800 para superarlo y obtener el certificado.
- Actividades. Cada unidad de estudio tendrá 1 o más actividades. Las actividades pueden
tener una puntuación variable en función del esfuerzo estimado requerido. Máximo: 700 puntos
- Proyecto Final. El trabajo final es un proyecto libre que será previamente validado por el
tutor. Máximo: 200 puntos.
Evaluación: Al término de cada fase, el tutor evaluará el trabajo realizado y emitirá una
calificación. Si el alumno no obtiene la calificación máxima, recibirá el feedback necesario para
xii Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
realizar las correcciones o ampliaciones necesarias. El alumno puede volver a enviar el proyecto
para una nueva evaluación.
Certificación
Para superar el curso será necesario completar al menos 800 puntos de los 1000 puntos disponibles
(80%). Una vez alcanzados los 800 puntos, el alumno puede dar por completado el curso, o continuar
hasta alcanzar la calificación máxima.
Una vez completado el curso, y siempre que se haya alcanzado los 800 puntos, se emitirá el certificado
de Experto Forcontu en Drupal 8 Back-End Development.
El certificado incluye, entre otros datos, el número de horas de trabajo, el contenido detallado del curso
y la calificación final obtenida.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III xiii
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Índice de contenidos
Presentación ........................................................................................................... v
Curso Online Experto en Drupal 8 Back-End Development .................................. vii
Descripción del curso .............................................................................................................. vii
Contenidos ............................................................................................................................. x
Metodología ............................................................................................................................ xi
Evaluación y Certificación ........................................................................................................ xii
Índice de contenidos ............................................................................................ xv
Unidad 25. Plugins I: Introducción a plugins y bloques ........................................ 3
25.1 Introducción a plugins en Drupal 8 .................................................................................... 4
25.2 Implementación de bloques .............................................................................................. 5
25.3 Configuración por defecto de bloques ................................................................................ 8
25.4 Configuración personalizada de bloques ............................................................................. 9
25.5 Inyección de servicios en plugins ..................................................................................... 15
25.6 Control de acceso a bloques ............................................................................................ 18
25.7 Integrar un formulario en un bloque ................................................................................ 19
25.8 Modificación de bloques de otros módulos ........................................................................ 25
25.9 Hazlo desde la consola ................................................................................................... 27
Unidad 26. Usuarios y permisos ........................................................................... 33
26.1 Obteniendo el usuario actual ........................................................................................... 34
26.2 Roles, permisos y control de acceso ................................................................................. 36
26.3 La entidad User ............................................................................................................. 43
26.4 Operaciones CRUD y hooks de Entity API ......................................................................... 46
26.5 Hooks del módulo User ................................................................................................... 49
26.6 Información adicional de usuario ..................................................................................... 50
26.7 Otras clases y servicios relacionados con usuarios ............................................................. 52
26.8 Hazlo desde la consola ................................................................................................... 53
Unidad 27. Theming I: Creación de temas y plantillas ......................................... 57
27.1 Creación de temas ......................................................................................................... 58
27.2 Archivos de plantilla ....................................................................................................... 72
27.3 Twig en Drupal .............................................................................................................. 87
27.4 Funciones de preprocesamiento de plantillas ................................................................... 102
27.5 Formulario de configuración del tema ............................................................................. 106
27.6 Hazlo desde la consola .................................................................................................. 109
Unidad 28. Theming II: Theming en módulos .................................................... 115
28.1 Arrays renderizables ...................................................................................................... 116
28.2 Elementos renderizables ................................................................................................ 123
28.3 Definición de plantillas en módulos ................................................................................. 127
28.4 Crear extensiones de Twig ............................................................................................. 134
28.5 Hazlo desde la consola .................................................................................................. 136
Unidad 29. Plugins II: Tipos de plugins y servicios ........................................... 141
29.1 Crear un tipo de plugin .................................................................................................. 142
29.2 Crear un servicio personalizado ...................................................................................... 149
29.3 Hazlo desde la consola .................................................................................................. 153
Unidad 30. Entidades I: Entidades de configuración ......................................... 161
30.1 Introducción a Entity API y tipos de entidades ................................................................. 162
30.2 Operaciones sobre entidades ......................................................................................... 164
30.3 Entidades de configuración (Configuration entities) .......................................................... 171
30.4 Hazlo desde la consola .................................................................................................. 182
Índice de contenidos
xvi Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Índice de contenidos
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III xvii
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Contenidos de la Unidad
25.1 Introducción a plugins en Drupal 8
25
25.2 Implementación de bloques
25.3 Configuración por defecto de bloques
25.4 Configuración personalizada de bloques
25.5 Inyección de servicios en plugins
25.6 Control de acceso a bloques
25.7 Integrar un formulario en un bloque
25.8 Modificación de bloques de otros módulos
25.9 Hazlo desde la consola
Algunos de los tipos de plugin disponibles en el núcleo de Drupal son los bloques,
los efectos de imagen, los tipos de campo o los controles y formateadores de
campos.
Cada tipo de plugin tiene su propio servicio "plugin manager", que es una clase
que implementa la interfaz PluginManagerInterface y que se encarga de definir qué
método se utilizará para descubrir o localizar los plugins de ese tipo que se hayan
creado en el sistema (annotation, hook, YAML, etc.), y cómo se crearán o
instanciarán plugins de ese tipo.
Generalmente los tipos de plugin incluyen una clase base para facilitar la
instanciación de plugins. Por ejemplo, para crear un plugin de Bloque, crearemos
una clase que extienda a la clase BlockBase.
Nos quedamos inicialmente con estos dos puntos, que nos permiten definir un
bloque básico. En los próximos apartados veremos cómo añadir configuración y
control de acceso.
Block API
[Link]
pi/8
[Link]
BlockBase/8
Es importante tener en cuenta que, para crear un plugin de tipo Block, es necesario
craer una clase que implemente la interfaz BlockPluginInterface.
[Link]
php/interface/BlockPluginInterface/8
Como primer ejemplo, vamos a crear un bloque muy simple, que muestra un texto
fijo. Crearemos el archivo /src/Plugin/Block/[Link], donde
definiremos la clase SimpleBlock que extiende BlockBase.
<?php
namespace Drupal\forcontu_blocks\Plugin\Block;
use Drupal\Core\Block\BlockBase;
/**
* Provides a Simple example block.
*
* @Block(
* id = "forcontu_blocks_simple_block",
* admin_label = @Translation("Forcontu Simple Block")
* )
*/
class SimpleBlock extends BlockBase {
Annotations
[Link]
/class/Block/8
Método build()
F25.2a
Colocar bloque
Bloque implementado
dentro del módulo
Forcontu Blocks.
F25.2b
Bloque programado
Bloque Simple block una
vez colocado en una
región del tema.
Desinstalación de bloques
Las propiedades cuyos valores podemos establecer son aquellas que están
definidas en el formulario de configuración del bloque. Para ver qué propiedades
hay disponibles, consultaremos el método buildConfigurationForm() de la clase
BlockBase. En el próximo apartado veremos cómo ampliar el formulario para
añadir opciones de configuración adicionales.
[Link]
on/BlockBase::buildConfigurationForm/8
use Drupal\block\BlockInterface
F25.3a
Valores por defecto
Valores de configuración
por defecto.
/forcontu_blocks/src/Plugin/Block/[Link]
<?php
namespace Drupal\forcontu_blocks\Plugin\Block;
use Drupal\Core\Block\BlockBase;
/**
* Provides the HighlightedContent block.
*
* @Block(
* id = "forcontu_blocks_highlighted_content_block",
* admin_label = @Translation("Highlighted Content")
* )
*/
class HighlightedContentBlock extends BlockBase {
Por ahora hemos añadido un método build() que devuelve una cadena. Más
adelante modificaremos este método para que imprima el listado de nodos
Destacados.
<?php
use Drupal\Core\Form\FormStateInterface;
//...
$form['forcontu_blocks_block_message'] = array(
'#type' => 'textfield',
'#title' => $this->t('Display message'),
'#default_value' => $this->configuration['block_message'],
);
F25.4a
Formulario de
configuración
Formulario de
configuración del bloque.
$this->configuration['block_message'],
$this->configuration['node_number'],
Nota: Para construir el array de opciones #options del elemento select, hemos
utilizado las funciones de PHP range y array_combine(). Con range() construimos
un array del tipo [1, 2, 3], y con array_combine() construimos un array con formato
clave => valor, que es el formato esperado por #options:
Array
(
[1] => 1
[2] => 2
[3] => 3
)
<?php
//...
Solo tenemos que leer cada uno de los valores enviados en el formulario a través
de $form_state->getValue(), y asignarlos a la variable de configuración
correspondiente.
<?php
//...
Ahora sí podemos modificar los valores del formulario y comprobar que, accediendo
nuevamente a la configuración, los valores han quedado almacenados.
[Link]
uuid: ae4683ba-2e37-4fe5-822c-9122c2f209fe
langcode: es
status: true
dependencies:
module:
- forcontu_blocks
theme:
- bartik
id: highlightedcontent
theme: bartik
region: sidebar_second
weight: 0
provider: null
plugin: forcontu_blocks_highlighted_content_block
settings:
id: forcontu_blocks_highlighted_content_block
label: 'Highlighted Content'
provider: forcontu_blocks
label_display: visible
block_message: 'lorem ipsum'
node_number: '3'
visibility: { }
<?php
//...
public function defaultConfiguration() {
return array(
'block_message' => 'List of highlighted nodes',
'node_number' => 5,
);
}
F25.4b
Valores por defecto
Configuración por defecto
para los elementos
personalizados del
formulario de
configuración.
/forcontu_blocks/config/install/[Link].bartik_highlightedcontent.yml
langcode: es
status: true
dependencies:
module:
- forcontu_blocks
theme:
- bartik
id: highlightedcontent
theme: bartik
region: sidebar_second
weight: 0
provider: null
plugin: forcontu_blocks_highlighted_content_block
settings:
id: forcontu_blocks_highlighted_content_block
label: 'Highlighted Content'
provider: forcontu_blocks
label_display: visible
block_message: 'lorem ipsum'
node_number: '3'
visibility: { }
- El estado del bloque (status: true). Indicamos así que el bloque estará
activado por defecto.
[Link]
[Link]/interface/ContainerFactoryPluginInterface/8
<?php
//...
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Database\Connection;
//...
class HighlightedContentBlock extends BlockBase implements
ContainerFactoryPluginInterface {
protected $database;
protected $currentUser;
Una vez inyectados, los servicios estarán disponibles en cualquiera de los métodos de
la clase, a través de las propiedades $this->currentUser y $this->database.
Contenido del bloque
<?php
//...
public function build() {
$node_number = $this->configuration['node_number'];
$block_message = $this->configuration['block_message'];
// 1
$build[] = [
'#markup' => '<h3>' . $this->t($block_message) . '</h3>',
];
// 2a
$result = $this->database->select('forcontu_node_highlighted', 'f')
->fields('f', ['nid'])
->condition('highlighted', 1)
->orderBy('nid', 'DESC')
->range(0, $node_number)
->execute();
// 2b
$list = [];
$node_storage = \Drupal::entityTypeManager()->getStorage('node');
// 2c
foreach($result as $record) {
$node = $node_storage->load($record->nid);
$list[] = $node->toLink($node->getTitle())->toRenderable();
}
if (empty($list)) {
$build[] = [
'#markup' => '<h3>' . $this->t('No results found') . '</h3>',
];
} else {
// 2d
$build[] = [
'#theme' => 'item_list',
'#items' => $list,
'#cache' => ['max-age' => 0],
];
}
return $build;
}
- 2b. Para trabajar con los nodos (y otras entidades), utilizamos la clase
EntityTypeManager, que estudiaremos con más profundidad en próximas
unidades. En primer lugar se obtiene el almacén de objetos
($node_storage), que nos permitirá obtener nodos.
F25.5a
Presentación del
bloque
Listado de nodos
destacados.
[Link]
ass/AccessResult/8
[Link]
nction/AccessResult::allowedIfHasPermission/8
<?php
//...
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Session\AccountInterface;
//...
protected function blockAccess(AccountInterface $account) {
return AccessResult::allowedIfHasPermission($account, 'access content');
}
1. Crear el formulario.
2. Crear el bloque y renderizar el formulario con FormBuilder.
F25.7a
Bloque de formulario
Este formulario se
mostrará en todas las
páginas de tipo nodo.
/forcontu_blocks/src/Form/[Link]
<?php
namespace Drupal\forcontu_blocks\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Database\Connection;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Routing\RouteMatchInterface;
protected $database;
protected $currentUser;
protected $currentRouteMatch;
Los valores de nid y uid los pasamos ocultos en un campo de tipo 'value', aunque
también se podrían volver a leer en el submit del formulario desde los servicios
correspondientes.
<?php
$node_vote = NULL;
$node = $this->currentRouteMatch->getParameter('node');
$form['node_vote'] = [
'#type' => 'radios',
'#title' => $this->t('Vote this node'),
'#options' => [ 1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5],
'#description' => $this->t('How useful did you find this content?'),
'#required' => TRUE,
'#default_value' => $node_vote,
];
$form['nid'] = [
'#type' => 'value',
'#value' => $nid,
];
$form['uid'] = [
'#type' => 'value',
'#value' => $this->currentUser->id(),
];
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Vote'),
];
return $form;
}
}
<?php
$nid = $form_state->getValue('nid');
$uid = $form_state->getValue('uid');
$node_vote = $form_state->getValue('node_vote');
$upsert = $this->database->upsert('forcontu_node_votes')
->key('nid')
->fields(['nid', 'uid', 'vote'])
->values([
'nid' => $nid,
'uid' => $uid,
'vote' => $node_vote,
])->execute();
Nota: Nuestra tabla tiene una clave primaria compuesta por los campos nid y uid.
Aunque upsert solo permite un valor de campo para indicar la clave primaria,
key('nid'), funcionará correctamente para nuestro caso. Esto es así porque,
internamente, la sentencia generada por Upsert tiene el formato:
[Link]
Lo que hace esta sentencia es realizar el UPDATE siempre que se produzca un error
de clave duplicada tras intentar hacer el INSERT.
Crear la tabla
<?php
/**
* Implements hook_schema().
*/
function forcontu_blocks_schema() {
$schema['forcontu_node_votes'] = [
'description' => 'Stores Node votes',
'fields' => [
'nid' => [
'type' => 'int',
'not null' => TRUE,
'description' => 'Node ID',
],
'uid' => [
'type' => 'int',
'not null' => TRUE,
'description' => 'User ID',
],
'vote' => [
'type' => 'int',
'not null' => TRUE,
'default' => 0,
'size' => 'tiny',
'description' => '1 to 5',
],
],
'primary key' => ['nid', 'uid'],
];
return $schema;
}
$form = \Drupal::formBuilder()->getForm('Drupal\forcontu_blocks\Form\CustomForm');
<?php
namespace Drupal\forcontu_blocks\Plugin\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Access\AccessResult;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Form\FormBuilderInterface;
/**
* Provides the NodeVoting block.
*
* @Block(
* id = "forcontu_blocks_node_voting_block",
* admin_label = @Translation("Node voting")
* )
*/
class NodeVotingBlock extends BlockBase implements
ContainerFactoryPluginInterface {
protected $currentRouteMatch;
protected $formBuilder;
$plugin_definition,
$container->get('current_route_match'),
$container->get('form_builder')
);
}
$node = $this->currentRouteMatch->getParameter('node');
if($node && $account->isAuthenticated()) {
return AccessResult::allowed();
} else {
return AccessResult::forbidden();
}
}
El módulo Block aporta funciones hook que permiten modificar los bloques creados
por otros módulos. Todos estos hooks se implementarán en el archivo .module.
hook_block_view_alter() y hook_block_build_alter()
Ambas funciones permiten modificar la salida del método build() del formulario
($build). La diferencia entre ellas es que hook_block_build_alter() es llamada antes
del ensamblado del bloque, lo que permite modificar, principalmente, opciones de
caché (#cache).
hook_block_view_alter(array &$build,
\Drupal\Core\Block\BlockPluginInterface $block)
[Link]
_block_view_alter/8
hook_block_build_alter(array &$build,
\Drupal\Core\Block\BlockPluginInterface $block)
[Link]
_block_build_alter/8
<?php
use Drupal\block\BlockInterface;
/**
* Implements hook_block_view_alter().
*/
function forcontu_blocks_block_view_alter(array &$build,
\Drupal\Core\Block\BlockPluginInterface $block) {
if($block->getPluginId() == 'system_powered_by_block') {
$build['#configuration']['label_display'] =
BlockInterface::BLOCK_LABEL_VISIBLE;
}
}
Las funciones anteriores se ejecutan para todos los bloques, de ahí que tengamos
que comprobar el ID del bloque antes de realizar modificaciones.
hook_block_view_BASE_BLOCK_ID_alter(array &$build,
\Drupal\Core\Block\BlockPluginInterface $block)
[Link]
_block_view_BASE_BLOCK_ID_alter/8
hook_block_build_BASE_BLOCK_ID_alter(array &$build,
\Drupal\Core\Block\BlockPluginInterface $block)
[Link]
_block_build_BASE_BLOCK_ID_alter/8
/**
* Implements hook_block_view_BASE_BLOCK_ID_alter()
* for 'system_powered_by_block'.
*/
function forcontu_blocks_block_view_system_powered_by_block_alter(
array &$build,
\Drupal\Core\Block\BlockPluginInterface $block) {
$build['#configuration']['label_display'] =
BlockInterface::BLOCK_LABEL_VISIBLE;
}
hook_block_access()
hook_block_access(\Drupal\block\Entity\Block $block,
$operation,
\Drupal\Core\Session\AccountInterface $account)
[Link]
_block_access/8
<?php
/**
* Implements hook_block_access()
*/
function forcontu_blocks_block_access(\Drupal\block\Entity\Block $block,
$operation,
\Drupal\Core\Session\AccountInterface $account) {
// No opinion.
return AccessResult::neutral();
}
drupal generate:plugin:block
$ drupal generate:plugin:block
You can add input fields to create special configurations in the block.
This is optional, press enter to continue
1 -
modules/custom/forcontu_console/src/Plugin/Block/[Link]
[Link]
console/content/es/commands/[Link]
<?php
namespace Drupal\forcontu_console\Plugin\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Database\Driver\mysql\Connection;
use Drupal\webprofiler\Form\FormBuilderWrapper;
/**
* Provides a 'SimpleTestBlock' block.
*
* @Block(
* id = "forcontu_console_simple_test_block",
* admin_label = @Translation("Simple test block"),
* )
*/
class SimpleTestBlock extends BlockBase implements
ContainerFactoryPluginInterface {
/**
* Drupal\Core\Database\Driver\mysql\Connection definition.
*
* @var \Drupal\Core\Database\Driver\mysql\Connection
*/
protected $database;
/**
* Drupal\webprofiler\Form\FormBuilderWrapper definition.
*
* @var \Drupal\webprofiler\Form\FormBuilderWrapper
*/
protected $formBuilder;
/**
* Construct.
*
* @param array $configuration
* A configuration array containing information about the
plugin instance.
* @param string $plugin_id
* The plugin_id for the plugin instance.
* @param string $plugin_definition
* The plugin implementation definition.
*/
public function __construct(
array $configuration,
$plugin_id,
$plugin_definition,
Connection $database,
FormBuilderWrapper $form_builder
) {
parent::__construct($configuration, $plugin_id,
$plugin_definition);
$this->database = $database;
$this->formBuilder = $form_builder;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container,
array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('database'),
$container->get('form_builder')
);
}
/**
* {@inheritdoc}
*/
public function build() {
$build = [];
$build['forcontu_console_simple_test_block']['#markup'] =
'Implement SimpleTestBlock.';
return $build;
}
}
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
26 Usuarios y permisos
El control de acceso en Drupal se basa en roles y permisos. Un
Comparativa D8/D7
módulo puede definir varios permisos, que el administrador podrá
asociar con los roles creados en el sitio. Los usuarios podrán tener Programación de usuarios y permisos
asignados uno o varios roles, lo que implica que, indirectamente, En Drupal 8 se mantienen algunos hooks
tienen asociados una serie de permisos. similares a los empleados en Drupal 7. El resto
se puede considerar totalmente nuevo y
requiere un estudio en profundidad.
Ya hemos visto cómo acceder al usuario actual. En esta unidad
veremos también cómo gestionar entidades de tipo User, crear roles
y permisos, añadir información adicional al usuario, etc.
Contenidos de la Unidad
26.1 Obteniendo el usuario actual
26
26.2 Roles, permisos y control de acceso
26.3 La entidad User
26.4 Operaciones CRUD y hooks de Entity API
26.5 Hooks del módulo User
26.6 Información adicional de usuario
26.7 Otras clases y servicios relacionados con usuarios
26.8 Hazlo desde la consola
Servicio: current_user
Clase: Drupal\Core\Session\AccountProxy
[Link]
class/AccountProxy/8
$account = \Drupal:currentUser();
Esta clase solo nos permite consultar información relacionada con el usuario actual,
pero no modificarla. En los próximos apartados veremos cómo cargar el objeto
User y realizar otras operaciones. También veremos cómo almacenar y recuperar
información adicional relacionada con los usuarios.
Definición de permisos
/admin/people/permissions
F26.2a
Permisos
Permisos definidos para el
módulo Forcontu Users.
<?php
//file: forcontu_pages/src/Controller/[Link]
//...
public function tab1() {
if($this->currentUser->hasPermission('administer nodes')){
$output .= $this->t('This extra text is only displayed if the
current user can administer nodes.') . '</p>';
}
return array(
'#markup' => $output,
);
}
//...
}
En el apartado 18.7 vimos que, para controlar el acceso a una ruta, debemos
especificar el permiso en la definición de la ruta (archivo .[Link]). Por
ejemplo, en el módulo system del núcleo, se definen las siguietes rutas con sus
correspondientes permisos de acceso (archivo /core/modules/[Link]):
[Link]:
path: '/admin'
defaults:
_controller:
'\Drupal\system\Controller\SystemController::systemAdminMenuBlockPage'
_title: 'Administration'
requirements:
_permission: 'access administration pages'
system.admin_structure:
path: '/admin/structure'
defaults:
_controller:
'\Drupal\system\Controller\SystemController::systemAdminMenuBlockPage'
_title: 'Structure'
requirements:
_permission: 'access administration pages'
system.admin_reports:
path: '/admin/reports'
defaults:
_controller:
'\Drupal\system\Controller\SystemController::systemAdminMenuBlockPage'
_title: 'Reports'
requirements:
_permission: 'access site reports'
En este ejemplo hemos utilizado el control de acceso por permiso, que es el más
habitual, pero también se podría realizar por rol:
requirements:
_role: 'gestor'
Cuando una ruta es de acceso público, o vamos a utilizar otro método de validación,
usaremos la directiva _access a TRUE:
requirements:
_access: 'TRUE'
requirements:
_custom_access: '\Drupal\forcontu_forms\Form\Simple::access'
<?php
use Drupal\Core\Access\AccessResult;
//...
AccessResult
Todos los métodos en los que se controle el acceso a algún elemento, deben
devolver un objeto AccessResultInterface. La clase utilizada es AccessResult, que
también implementa la interfaz RefinableCacheableDependencyInterface.
[Link]
ass/AccessResult/8
if ($pid) {
$access = $access->andIf(AccessResult::allowedIfHasPermission($account,
'access comments'));
}
return $access;
if ($some_condition) {
$result = AccessResult::allowed();
} else {
$result = AccessResult::forbidden();
}
// Not cacheable
return $result->setCacheMaxAge(0);
return AccessResult::allowed()->cachePerUser();
<?php
//...
use Drupal\Core\Access\AccessResult;
//...
protected function blockAccess(AccountInterface $account) {
return AccessResult::allowedIfHasPermission($account, 'access content');
}
Clase User
La clase User implementa la intefaz UserInterface para definir una entidad de tipo
usuario.
[Link]
r/8
En el apartado 26.1 vimos cómo acceder al usuario actual. Es objeto devuelto por
el servicio current_user no es la entidad user en sí, así que las operaciones que
podemos realizar sobre él están limitadas.
Para cargar la entidad user utilizaremos el método load(), pasando como parámetro
el id() del usuario actual:
use Drupal\user\Entity\User;
$user = User::load(\Drupal::currentUser()->id());
Veamos ahora algunos de los métodos disponibles para trabajar con el objeto User:
La entidad User implementa las tablas users, que es la tabla base donde se
almacenan los usuarios, y users_field_data, donde se almacena la información
de cada usuario.
o timezone.
o status.
o created.
o changed.
o access.
o login.
o init. Email original, utilizado al crear la cuenta.
o default_langcode.
En este apartado vamos a estudiar las clases, métodos y hooks que nos permiten
realizar operaciones CRUD (crear, leer, actualizar y eliminar) sobre entidades de
tipo User. Puedes leer más sobre estas operaciones en:
[Link]
entity_crud/8
EntityTypeManager
Servicio: entity_type.manager
Clase:
[Link]
hp/class/EntityTypeManager/8
$user_storage = \Drupal::entityTypeManager()->getStorage('user');
Como en otros muchos casos, podemos utilizar el servicio desde la clase global
\Drupal, como en el ejemplo anterior, o inyectando el servicio en la clase en que
estemos trabajando.
[Link]
[Link]/interface/EntityStorageInterface/8
$admin = $user_storage->load(1);
$new_user = $user_storage->create([
'name' => 'test_user',
'mail' => 'foo@[Link]',
'pass' => '123456',
]);
$new_user->save();
Ya hemos visto que podemos crear un usuario con el método create() del almacén,
y guardarlo con el método save(), del objeto usuario.
Cuando son otros módulos los que crean los usuarios, podemos intervenir durante
la creación implementando el hook:
- hook_ENTITY_TYPE_create($entity)
donde ENTITY_TYPE será sustituido por 'user'. Por ejemplo, para nuestro módulo
de ejemplo implementaríamos la función forcontu_users_user_create():
[Link]
n/hook_ENTITY_TYPE_create/8
[Link]
n/hook_ENTITY_TYPE_presave/8
[Link]
n/hook_ENTITY_TYPE_insert/8
[Link]
n/hook_ENTITY_TYPE_update/8
Carga de usuarios
[Link]
n/hook_ENTITY_TYPE_load/8
Eliminar usuarios
[Link]
on/hook_ENTITY_TYPE_predelete/8
[Link]
on/hook_ENTITY_TYPE_delete/8
El módulo User añade los siguientes hooks específicos para trabajar con usuarios:
[Link]
[Link]
ser_cancel/8
[Link]
ancel_methods/8
[Link]
ser_cancel_methods_alter/8
[Link]
ser_format_name_alter/8
[Link]
n/8
[Link]
ser_logout/8
Servicio: [Link]
Clase: Drupal\user\UserData
[Link]
Data/8
[Link]
serData::get/8
[Link]
serData::set/8
[Link]
serData::delete/8
Como ejemplo, vamos a analizar el módulo Contact del núcleo, que añade en el
formulario de edición del usuario el grupo de Opciones de contacto, desde
donde podemos indicar si el usuario activa el Formulario de contacto personal
[F26.6a].
F26.6a
Módulo Contact
Información adicional
añadida al usuario a través
del formulario de edición
de usuario.
<?php
// File: /core/modules/contact/[Link]
/**
* Implements hook_form_FORM_ID_alter().
*
* Add the enable personal contact form to an individual user's account page.
*
* @see \Drupal\user\ProfileForm::form()
*/
function contact_form_user_form_alter(&$form, FormStateInterface $form_state) {
$form['contact'] = array(
'#type' => 'details',
'#title' => t('Contact settings'),
'#open' => TRUE,
'#weight' => 5,
);
$account = $form_state->getFormObject()->getEntity();
if (!\Drupal::currentUser()->isAnonymous() && $account->id()) {
$account_data = \Drupal::service('[Link]')->get('contact', $account->id(),
'enabled');
}
$form['contact']['contact'] = array(
'#type' => 'checkbox',
'#title' => t('Personal contact form'),
'#default_value' => isset($account_data) ? $account_data :
\Drupal::config('[Link]')->get('user_default_enabled'),
'#description' => t('Allow other users to contact you via a personal contact
form which keeps your email address hidden. Note that some privileged users such as
site administrators are still able to contact you even if you choose to disable this
feature.'),
);
$form['actions']['submit']['#submit'][] = 'contact_user_profile_form_submit';
}
Haciendo uso del método get() del servicio [Link], se obtiene el valor de la
variable 'enabled' almacenado para el usuario que se está editando.
<?php
/**
* Submit callback for the user profile form to save the contact page setting.
*/
function contact_user_profile_form_submit($form, FormStateInterface $form_state) {
$account = $form_state->getFormObject()->getEntity();
if ($account->id() && $form_state->hasValue('contact')) {
\Drupal::service('[Link]')->set('contact', $account->id(), 'enabled', (int)
$form_state->getValue('contact'));
}
}
Creación de roles
[Link]
e/8
Para crear un rol de forma programada, podemos utilizar el método create() común
a todas las entidades. En el siguiente ejemplo creamos el rol Client (con ID client).
Cambio de usuario
Servicio: account_switcher
Clase: AccountSwitcher
[Link]
p/class/AccountSwitcher/8
drupal generate:permissions
[Link]
[Link]
$ drupal generate:permissions
Enter the module name [admin_toolbar]:
> forcontu_console
You can use this permission in the routing file like this:
forcontu_console.route:
requirements:
_permission: custom permission:
1 -
modules/custom/forcontu_console/forcontu_console.[Link]
desa1@[Link]:~/public_html/be/be2 $
custom permission:
title: 'Custom permission'
description: 'Allow users to access this module'
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
27
Contenidos de la Unidad
27.1 Creación de temas
27.2 Archivos de plantilla
27.3 Twig en Drupal
27.4 Funciones de preprocesamiento de plantillas
27.5 Formulario de configuración del tema
27.6 Hazlo desde la consola
Estructura de un tema
>themes/
F27.1a >exampletheme/
Estructura de un tema [Link]
Estructura de archivos y [Link]
[Link]
carpetas típica de un tema.
[Link]
[Link]
[Link]
>config/
>install/
[Link]
>schema/
[Link]
>css/
[Link]
>js/
[Link]
>images/
[Link]
>templates/
[Link]
[Link]
[Link]
Comentamos a continuación para qué sirven los distintos archivos del tema:
- css/. Carpeta donde se ubican los archivos CSS del tema (*.css). Estos
archivos se definen en el archivo *.[Link].
- js/. Carpeta donde se ubican los archivos JavaScript del tema (*.js). Estos
archivos se definen en el archivo *.[Link].
El archivo .[Link]
Una vez definido el archivo .[Link], el tema estará visible en el listado de Temas
del sitio:
URL Apariencia
Administración Apariencia
/admin/appearance
[Link]
infoyml-file
libraries:
- foo_theme/global-styling
regions:
header: Header
primary_menu: 'Primary menu'
secondary_menu: 'Secondary menu'
page_top: 'Page top'
page_bottom: 'Page bottom'
highlighted: Highlighted
featured_top: 'Featured top'
breadcrumb: Breadcrumb
content: Content
sidebar_first: 'Sidebar first'
sidebar_second: 'Sidebar second'
featured_bottom_first: 'Featured bottom first'
featured_bottom_second: 'Featured bottom second'
featured_bottom_third: 'Featured bottom third'
footer_first: 'Footer first'
footer_second: 'Footer second'
footer_third: 'Footer third'
footer_fourth: 'Footer fourth'
footer_fifth: 'Footer fifth'
- regions. Las regiones son áreas del tema donde se podrán ubicar los
bloques del sitio. Se incluirá un listado de regiones indicando, para cada
una de ellas, el nombre de sistema y el nombre visible en el área de
administración de bloques. Cuando el nombre de la región tiene varias
palabras, se incluye entre comillas simples.
Regiones
Por compatibilidad entre módulos y plantillas del núcleo, se recomienda utilizar los
mismos nombres de regiones que utilizan los temas del núcleo. De esta forma,
cuando cambiamos el tema del sitio, los bloques se posicionarán correctamente en
la región correspondiente del nuevo tema.
<div id="page-wrapper">
F27.1c
<div id="page">
<header id="header" class="header" role="banner" aria- Regiones
label="{{ 'Site header'|t }}"> Presentación de regiones
<div class="section layout-container clearfix"> desde la plantilla
{{ page.secondary_menu }} [Link].
{{ [Link] }}
{{ page.primary_menu }}
</div>
</header>
{% if [Link] %}
<div class="highlighted">
<aside class="layout-container section clearfix"
role="complementary">
{{ [Link] }}
</aside>
</div>
Hay que tener cuidado con las actualizaciones. El sistema nos avisará
de posibles actualizaciones del tema, pero si lo actualizamos, podemos
sobrescribir los cambios realizados en el tema (por ejemplo, en plantillas
o archivos CSS).
También podemos usar esta estrategia para reutilizar un tema del núcleo
sin que se vea afectado por las actualizaciones de Drupal.
- Bootstrap ([Link]
- Basic ([Link]
- AdaptiveTheme ([Link]
- Omega ([Link]
- Otros temas base clásicos como Zen ([Link]
o Fusion ([Link] aún no tienen una
versión para Drupal 8.
global-styling: F27.1e
css:
theme: Creación de un
css/[Link]: {} subtema
Definición de archivo de
estilos CSS.
#header { F27.1f
background-color: #C7D0D6; Creación de un
background-image: none; subtema
}
Ejemplo de estilos CSS.
Sube a la carpeta raíz los archivos correspondientes al logo por defecto ([Link])
e imagen de vista previa del tema ([Link]). Puedes crear tus propias
imágenes o copiarlas desde el tema bartik (/core/themes/bartik).
>themes/ F27.1g
>b_forcontu/
b_forcontu.[Link] Creación de un
b_forcontu.[Link] subtema
[Link] Estructura de carpetas y
[Link] archivos del tema.
>css/
[Link]
F27.1h
Creación de un
subtema
Presentación de la página
con el nuevo tema.
Cuando realicemos modificaciones en los archivos del tema, para que se apliquen
los cambios realizados, puede que necesitemos limpiar tanto la caché del
navegador (Control + F5), como la caché del sitio, desde:
- Área de administración:
Administración Configuración Desarrollo Rendimiento
[Vaciar todas las cachés]
De esta forma, evitamos tener que vaciar la caché del sitio constantemente.
F27.1i
Caché del sitio
Opción para reconstruir la
caché del tema en cada
carga de página.
Como hemos comentado, los archivos CSS se ubican en la carpeta /css del tema,
y se declaran en el archivo theme_name.[Link]. Para modificar un estilo
en concreto, podemos modificar los archivos existentes o declarar y crear un nuevo
archivo CSS, que registraremos dentro de la librería.
F27.1j foo:
version: 1.x
Librerías css:
Definición de librería para theme:
incluir archivos CSS y JS. css/[Link]: {}
js:
js/[Link]: {}
dependencies:
- core/jquery
En los temas se añade generalmente una librería con nombre global-styling, que
cargará todos los archivos CSS en todas las páginas donde se use el tema
[F27.1k]:
F27.1k global-styling:
version: 1.x
Librerías
css:
Librería global-styling theme:
típica utilizada en los css/[Link]: {}
temas. css/[Link]: {}
css/[Link]: {}
css/[Link]: { media: print }
[Link]
javascript-js-to-a-drupal-8-theme
F27.1l
Inspector de elementos
Inspector de elementos de
Chrome para ver el código
HTML y los estilos CSS
aplicados.
Como ejemplo, si queremos cambiar el color del título de la página y tenemos este
código HTML [F27.1m]:
<div class="site-branding__text">
<div class="site-branding__name"> F27.1m
<a href="/" title="Inicio" rel="home">Experto en Drupal 8</a> Ejemplo de código
</div> HTML
</div>
Podemos cambiar el color del texto aplicando el siguiente estilo CSS [F27.1n]:
.site-branding__text a{
F27.1n
color: #000;
} Ejemplo de estilos CSS
.site-branding__name a{
color: #000;
}
En primer lugar, para poder localizar el archivo CSS correcto, tenemos que
desactivar la caché de archivos CSS, desde Rendimiento (desactivar la opción
Combinar archivos CSS).
.region-header,
F27.1o .region-header a,
Ejemplo de estilos CSS .region-header li [Link]-active,
.site-branding__text,
.site-branding,
.site-branding__text a,
.site-branding a,
.region-secondary-menu .menu-item a,
.region-secondary-menu .menu-item [Link]-active {
color: #fffeff;
}
#header {
F27.1p background-color: #C7D0D6;
Ejemplo de estilos CSS background-image: none;
}
.site-branding__text a{
color: #000;
}
Por último, actualiza la página para ver los cambios (título en negro) [F27.1q]. Si
no se actualiza, prueba lo siguiente, en este orden:
F27.1q
Estilos CSS
Resultado final.
F27.1r
Estilos CSS
Usamos el inspector de
elementos para verificar
los nuevos estilos
aplicados.
Para entender cómo funcionan los temas, es necesario entender primero cómo
funcionan las plantillas o templates.
El código Twig empieza con {{ y termina con }}. En este código se imprime por
pantalla el contenido de la variable title. Esta variable se utiliza para indicar el título
de la página, un valor dinámico que depende de la página que se esté cargando
en cada momento.
Ahora bien, supongamos que hemos creado dos páginas en nuestro sitio, con los
títulos "Aviso legal" y "Quiénes somos". Al aplicar la plantilla, el resultado final será
distinto para cada una de las páginas, en concreto:
<h1>Aviso legal</h1>
<h1>Quiénes somos</h1>
Twig vs PHPtemplate
Una vez entendido el concepto de plantilla, vamos a analizar más a fondo cada uno
de los archivos de plantilla que componen un tema de Drupal: [Link],
[Link], [Link], [Link] y [Link],
entre otros.
Drupal tiene sus propios archivos de plantillas por defecto, que utiliza en el caso
de que el tema activado en el sitio no disponga de ellos. Es decir, si el tema no
incluye un archivo [Link], a la hora de mostrar bloques Drupal utilizará
el archivo [Link] incluido por defecto en el núcleo (este archivo en
particular lo aporta el módulo Block del núcleo, y está disponible en
/core/modules/block/templates/[Link]).
F27.2a
Plantillas de un tema
Cada archivo de plantilla
se encarga de la capa de
presentación de un
elemento del sitio.
- [Link] se
encarga de configurar la
página HTML y de
presentar el contenido de
la plantilla [Link],
que a su vez recibe
contenidos de otras
plantillas interiores, como
[Link], que
genera la salida de
presentación de los
bloques.
Trabajando de forma
anidada se obtiene la
presentación final de la
página que se está
cargando en cada
momento.
La plantilla [Link]
Si el tema activo (o el tema base) no incluye este archivo, Drupal utilizará la plantilla
por defecto, ubicada en:
/core/modules/system/templates/[Link].
{#
F27.2c
/**
* @file [Link]
* Default theme implementation for the basic structure of a single Drupal page.
*
Cabecera con las variables
* Variables: disponibles en la plantilla.
* - logged_in: A flag indicating if user is logged in.
* - root_path: The root path of the current page (e.g., node, admin, user).
* - node_type: The content type for the current node, if the page is a node.
* - head_title: List of text elements that make up the head_title variable.
* May contain one or more of the following:
* - title: The title of the page.
* - name: The name of the site.
* - slogan: The slogan of the site.
* - page_top: Initial rendered markup. This should be printed before 'page'.
* - page: The rendered page markup.
* - page_bottom: Closing rendered markup. This variable should be printed after
* 'page'.
* - db_offline: A flag indicating if the database is offline.
* - placeholder_token: The token for generating head, css, js and js-bottom
* placeholders.
*
* @see template_preprocess_html()
*
* @ingroup themeable
*/
#}
La plantilla [Link]
Esta plantilla genera todo el código contenido en la página, y una vez procesada
se envía a la plantilla [Link] a través de la variable {{ page }}. Algunas
de las variables que se pueden utilizar son [F27.2d]:
muestra un nodo.
o [Link]
o page.primary_menu
o page.secondary_menu
o [Link]
o [Link]
o [Link]
o page.sidebar_first
o page.sidebar_second
o [Link]
o [Link]
Si el tema activado no incluye este archivo, Drupal utiliza el que tiene por defecto,
ubicado en /core/modules/system/templates/[Link].
{{ page.primary_menu }}
{{ page.secondary_menu }}
{{ [Link] }}
{{ [Link] }}
{{ [Link] }}
<main role="main">
<a id="main-content" tabindex="-1"></a>{# link is in
[Link] #}
<div class="layout-content">
{{ [Link] }}
</div>{# /.layout-content #}
{% if page.sidebar_first %}
<aside class="layout-sidebar-first" role="complementary">
{{ page.sidebar_first }}
</aside>
{% endif %}
{% if page.sidebar_second %}
<aside class="layout-sidebar-second" role="complementary">
{{ page.sidebar_second }}
</aside>
{% endif %}
</main>
{% if [Link] %}
<footer role="contentinfo">
{{ [Link] }}
</footer>
{% endif %}
</div>
La plantilla [Link]
Si el tema activado no incluye este archivo, Drupal utiliza el que tiene por defecto,
ubicado en /core/modules/node/templates/[Link].
{% if display_submitted %}
<footer>
{{ author_picture }}
<div{{ author_attributes }}>
{% trans %}Submitted by {{ author_name }} on {{ date }}{%
endtrans %}
{{ metadata }}
</div>
</footer>
{% endif %}
</article>
Atributos HTML.
La plantilla [Link]
Existen muchas más plantillas que se encargan de otras áreas del sitio. Otros
ejemplos de archivos de plantilla son:
Por último, los módulos también pueden tener plantillas propias. Por ejemplo, el
módulo Forum incorpora varias plantillas que sirven para configurar cómo se
visualizan los mensajes del foro ([Link], [Link], etc.).
Cada módulo puede incluir varios archivos de plantillas, que utilizará desde su
propio código para mostrar las nuevas herramientas que añade al sitio. Si
queremos modificar cualquier de estas plantillas nunca debemos hacerlo
directamente en el archivo del módulo. Primero copiaremos el archivo en la carpeta
templates del tema, y ese será el archivo de plantilla que modificaremos, sin
cambiar su nombre original.
Depuración de plantillas
parameters:
[Link]:
debug: true
Cada plantilla comienza con una etiqueta <!-- THEME DEBUG -->, e incluye la
siguiente información de depuración:
Ejemplo 1: Inicio del archivo, con referencia a la plantilla html, que es la plantilla
de mayor nivel. Esta plantilla se cierra justo al final del archivo.
Ejemplo 2: Plantilla que se aplica al título del contenido. En este caso se está
usando la plantilla [Link], que es una plantilla específica
para los títulos de los nodos.
Si queremos modificar la plantilla que presenta el título de los nodos (Ejemplo 2),
tenemos que ver primero dónde se encuentra. En este ejemplo, la plantilla está
localizada en el tema classy del núcleo, así que no podemos modificarla
directamente. Lo que haremos será copiar esa plantilla a la carpeta templates de
nuestro tema.
Una vez que la plantilla está en nuestro tema, recarga la página y comprueba que
la ruta del archivo es la esperada. Vacía caché si no ves el cambio reflejado. El
resto de información mostrada es exactamente igual, ya que el nombre de plantilla
sigue siendo el mismo, pero ubicada en nuestro tema. Ahora ya podemos modificar
la plantilla.
La función dump()
Si has instalado el módulo Devel Kint (incluido en Devel), podrás usar la función
kint(), que mejora la presentación del resultado.
F27.2g
Depuración en Twig
Valores de variables
mostrados con Kint.
Web Profiler
El icono Tema de Web Profiler muestra información del tema cargado, como el
tiempo de renderizado, el número de llamadas a plantillas, bloques cargados, etc.
[F27.2h]
F27.2h
Web Profiler
Icono Tema.
F27.2i
Web Profiler
Información de Tema
ampliada.
Ya hemos comentado que, para modificar una plantilla, primero tenemos que
copiarla a nuestro tema. En muchas ocasiones no nos interesa realizar cambios
para todos los casos en que se usa una plantilla, sino solo para casos específicos.
- core/themes/bartik/templates/[Link]
<h2>Formulario de búsqueda</h2>
[Link]
tion/hook_theme_suggestions_alter/8
<?php
/**
* @file
* Functions to support theming in the Bartik Forcontu theme.
*/
/**
* Implements hook_theme_suggestions_HOOK_alter() for HOOK 'node'.
*/
function b_forcontu_theme_suggestions_node_alter(array &$suggestions,
array $variables) {
if (\Drupal::currentUser()->isAuthenticated()) {
$suggestions[] = 'node__' . 'logged_in';
$node = $variables['elements']['#node'];
if($node->getType()){
$suggestions[] = 'node__' . $node->getType() . '__logged_in';
}
}
}
F27.2j
Sugerencias de
plantillas
Array $suggestions.
Como ya hemos comentado, en las plantillas el código Twig se mezcla entre código
HTML para generar el código HTML final que se envía al navegador. En el apartado
11.5 ya hicimos una breve introducción a Twig, que ahora adaptaremos a su uso
dentro de Drupal.
Comentarios
{#
Comentario de varias líneas
nota: todo este código es un comentario y no se ejecutará.
tampoco las variables que podamos incluir dentro, como {{ title }}
#}
DocBlock
El archivo de plantilla se comenta con una directiva @file y una lista con las
variables disponibles (Available variables), enviadas por las funciones de
preprocesamento, a las que también se hace referencia a través de directivas
@see. Por ejemplo:
{#
/**
* @file
* Default theme implementation to present a feed item in an aggregator page.
*
* Available variables:
* - url: URL to the originating feed item.
* - title: Title of the feed item.
* - content: All field items. Use {{ content }} to print them all,
* or print a subset such as {{ content.field_example }}. Use
* {{ content|without('field_example') }} to temporarily suppress the printing
* of a given element.
* - attributes: HTML attributes for the wrapper.
* - title_prefix: Additional output populated by modules, intended to be
* displayed in front of the main title tag that appears in the template.
* - title_suffix: Additional output populated by modules, intended to be
* displayed after the main title tag that appears in the template.
*
* @see template_preprocess_aggregator_item()
*
* @ingroup themeable
*/
#}
<article{{ attributes }}>
{{ title_prefix }}
<h3>
<a href="{{ url }}">{{ title }}</a>
</h3>
{{ title_suffix }}
{{ content }}
</article>
La directiva @ingroup themeable indica que la plantilla está dentro del grupo
themeable. Esta directiva solo se incluye en las plantillas por defecto, así que no
deberíamos incluirla al sobrescribir una plantilla en nuestro tema.
Variables
Imprimir variables
Para imprimir el valor de una variable, esta se encierra entre llaves dobles
{{ variable }}. Veamos algunos ejemplos:
{{ title }}
{{ [Link] }}
{{ foo['bar'] }}
{{ attribute(foo, 'data-bar') }}
Comprobación de variables
{% if foo %}
<div>{{ foo }}</div>
{% endif %}
Asignar variables
Variables globales
[Link]
p/class/Twig_Template/8
themes/b_forcontu/templates/[Link]
Filtros
Los filtros se utilizan para modificar las variables de alguna forma. Por ejemplo, un
filtro puede servir para pasar una cadena a mayúsculas (upper).
Para usar un filtro sobre una variable, primero se escribe la variable sobre la que
se aplicará el filtro, y luego el nombre del filtro separado por el símbolo pipe |. Se
pueden concatenar varios filtros, separados por |, que se aplicarán a la variable en
orden.
{{ 'welcome'|upper }}
Los filtros también se pueden aplicar a una sección de código, con la siguiente
estructura:
{% filter upper %}
Este texto se convertirá a mayúsculas
{% endfilter %}
{{ 'WELCOME'|lower }}
{# Resultado: welcome #}
{{ 'welcome home'|capitalize }}
{{ 'welcome home'|title }}
{# Resultado: Welcome Home #}
- date. Permite dar formato a una fecha. Funciona como la función date
de PHP.
{{ "now"|date("d/m/Y") }}
{# Resultado: 13/02/2016 #}
- join. Une los elementos de un array en una cadena. Por defecto se utiliza
una cadena vacía como separador (sin separación), pero se puede
especificar cualquier otro caracter.
{{ [1, 2, 3]|join }}
{# Resultado: 123 #}
{{ [1, 2, 3]|join(',') }}
{# Resultado: 1,2,3 #}
[Link]
Además de los filtros que vienen de base con Twig, Drupal incorpora una serie de
filtros adicionales, que se pueden consultar en:
[Link]
templates
[Link]
p/function/TwigExtension::getFilters/8
{% trans %}
Submitted by {{ author_name }} on {{ date }}
{% endtrans %}
{% trans %}
This {{ [Link] }} has a length of: {{ count }}. It contains:
{{ [Link]|placeholder }} and {{ token.bad_text }}.
{% endtrans %}
{{ temp|placeholder }}
Imprime:
Estructuras de control
<h1>Users</h1>
<ul>
{% for user in users %}
<li>{{ [Link] }}</li>
{% endfor %}
</ul>
<h1>Users</h1>
<ul>
<li>frangil</li>
<li>laurafornie</li>
<li>userfoo</li>
</ul>
#}
{% for i in range(0, 3) %}
{{ i }},
{% endfor %}
{# Imprime 0, 1, 2, 3 #}
Estructuras de control: if
{% if title|length > 0 %}
<h1>{{ title }}</h1>
{% endif %}
{# Imprime el valor de título (y las etiquetas h1) sólo si
la variable título no está vacía.
#}
Funciones
{% for i in range(0, 6, 2) %}
{{ i }},
{% endfor %}
{# Imprime 0, 2, 4, 6 #}
{{ max(1, 3, 2) }}
{# Imprime 3 #}
[Link]
Además de las funciones que vienen de base con Twig, Drupal incorpora una serie
de funciones adicionales, que se pueden consultar en:
[Link]
url() y path()
<a href="[Link]
<a href="/">Inicio</a>
link()
La función link() genera el código completo del enlace, pasándole como parámetros
el texto del enlace, la URL y los atributos adicionales que se añadirán a la etiqueta
<a>.
attach_library($library)
{{ attach_library('classy/node') }}
Las ventajas de los argumentos con nombre frente a los argumentos posicionales
son:
Una de las opciones más potentes de Twig es la posibilidad de heredar desde otras
plantillas. En la plantilla "padre", o plantilla base, se pueden definir bloques
mediante la etiqueta block, y esos bloques serán los fragmentos que podrán
modificar las plantillas hijas.
Veamos un ejemplo. En primer lugar definimos una plantilla base con nombre de
archivo [Link] [F27.3a]. Esta plantilla servirá como primer nivel, e incluye
los elementos típicos de una página HTML (etiquetas <html>, <head> y <body>.
- block title. Bloque que a su vez está dentro del bloque head. Sirve para
imprimir el atributo title de la página actual. Este bloque está vacío y serán
las plantillas hijas las que lo rellenen.
{# archivo [Link] #}
Ahora vamos a crear una plantilla que hereda de la plantilla anterior, completando
la información o añadiendo información adicional en los bloques [F27.3b].
{# archivo [Link] #}
{% extends "[Link]" %}
El HTML resultante una vez procesadas las plantillas con sus correspondientes
variables, tendría este aspecto [F27.3c]:
Expresiones
Por último, vamos a ver algunas de las expresiones, tipos de variables y operadores
que podemos utilizar en Twig:
Arrays
Los arrays se expresan entre corchetes [] y con sus elementos separados por
comas.
Los arrays asociativos se definen con llaves {}, y con elementos clave:valor.
Cuando las claves son cadenas, se pueden escribir entre comillas simples o sin
comillas:
{ 2: 'foo', 4: 'bar' }
Operaciones matemáticas
Operadores lógicos
Los operadores lógicos disponibles son and, or y not. Los paréntesis sirven para
agrupar expresiones (expr).
Operadores de comparación
Además de los operadores básicos: ==, !=, <, >, >= y <=, podemos usar los
siguientes:
Operador in
{% if 1 in [1, 2, 3] %}
{% if 5 not in [1, 2, 3] %}
{% if 'cd' in 'abcde' %}
Operador is
{% if value is odd %}
{% if [Link] is constant('Post::PUBLISHED') %}
Operador ..
{{ 1..5 }}
{{ range(1, 5) }}
Combinando el operador .. con el filtro join, podemos obtener una cadena cuyos
valores están separados por el separador indicado:
{{ (1..5)|join(', ') }}
{# Salida: 1, 2, 3, 4, 5 #}
Operador ~
100 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Operador ternario
Otras variantes:
Etiqueta spaceless
{% spaceless %}
<div>
<strong>foo bar</strong>
</div>
{% endspaceless %}
Atributos HTML
En Drupal, muchas plantillas reciben la variable {{ attributes }}, con atributos HTML
para incorporar en una etiqueta. Podemos imprimir todos los atributos de una vez,
con {{ attributes }}, o acceder a los elementos dentro de attributes de forma
individual {{ [Link] }}, {{ [Link] }}, etc.
Nótese que, en el ejemplo, aunque hemos usado los atributos de forma individual,
al final de la etiqueta se añade nuevamente {{ attributes }}, para que se impriman
otros atributos que puedan provenir de cualquier módulo.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 101
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Funciones de preprocesamiento de
27.4
plantillas
Como ya sabemos, las plantillas reciben una serie de variables. Antes de que estas
variables lleguen definitivamente a la plantilla, hay una serie de funciones, llamadas
de preprocesamiento, que pueden interceptarlas y modificarlas.
Núcleo:
[Link]
ule/function/template_preprocess_comment/8
Módulos:
4. MODULE_preprocess_HOOK(&$variables). Es la implementación de
hook_preprocess_HOOK() dentro de un módulo. Esta función se utiliza
cuando un módulo desea modificar las variables de la plantilla HOOK de
otro módulo.
Tema:
8. THEME_preprocess_HOOK(&$variables). Es la implementación de
hook_preprocess_HOOK() dentro de un tema. Se implementa en el
archivo .theme del tema, y actúa sobre una plantilla en particular
(HOOK).
102 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Hay que tener en cuenta que varios módulos pueden implementar funciones de
preprocesamiento sobre el mismo HOOK. El orden de ejecución de las mismas
dependerá del orden en que se ejecuten los módulos.
Como las últimas funciones en actuar son las implementadas en el tema, este
tendrá siempre la última palabra en cuando al tratamiento de variables.
hook_preprocess(&$variables, $hook)
[Link]
tion/hook_preprocess/8
hook_preprocess_HOOK(&$variables)
[Link]
tion/hook_preprocess_HOOK/8
Ejemplo 1:
<?php
/**
* Implements hook_preprocess_HOOK() for [Link].
*/
function b_forcontu_preprocess_comment(&$variables) {
$variables['attributes']['class'][] = 'forcontu';
}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 103
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Ejemplo 2:
[Link]
.php/class/TwigEnvironment/8
En este ejemplo vamos a añadir una nueva variable llamda 'twig_debug', que
estará disponible en todas las plantillas, y que indicará si el modo de depuración
se encuentra activo.
<?php
/**
* Implements hook_preprocess().
*/
function b_forcontu_preprocess(&$variables, $hook) {
$variables['twig_debug'] = \Drupal::service('twig')->isDebug();
Ahora la nueva variable twig_debug estará disponible en todas las plantillas del
sistema.
<div id="page-wrapper">
<div id="page">
<header id="header" class="header" role="banner" aria-
label="{{ 'Site header'|t }}">
<div class="section layout-container clearfix">
{{ page.secondary_menu }}
{{ [Link] }}
{{ page.primary_menu }}
</div>
</header>
{% if twig_debug %}
<div class="twig-debug">
{{ 'Twig Debug is enabled'|t }}
</div>
104 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
{% endif %}
{% if [Link] %}
...
.twig-debug {
background-color: #ffeb3b;
}
F27.4a
twig_debug
Nueva variable twig_debug
utilizada desde la plantilla
[Link].
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 105
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
tion/hook_form_system_theme_settings_alter/8
hook_form_system_theme_settings_alter(&$form, &$form_state)
Esta función permite alterar el formulario de configuración del tema, por lo que
recibe los parámetros habituales en el tratamiento de formularios: $form y
$form_state. $form es un parámetro pasado por referencia, así que todos los
cambios que hagamos, añadiendo, modificando o eliminando elementos, se verán
reflejados en el formulario.
F27.5a <?php
Formulario de
/**
configuración del tema
* Implements hook_form_system_theme_settings_alter().
Función que permite */
modificar el formulario de function b_forcontu_form_system_theme_settings_alter(&$form,
configuración del tema. \Drupal\Core\Form\FormStateInterface $form_state) {
$form['b_forcontu'] = array(
'#type' => 'fieldset',
'#title' => t('Bartik Forcontu settings'),
);
$form['b_forcontu']['show_twig_message'] = array(
'#type' => 'checkbox',
'#title' => t('Display "Twig Debug" message'),
'#default_value' => theme_get_setting('show_twig_message'),
'#description' => t('Check this option if you want to display
a message when Twig Debug is enabled.'),
);
}
106 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
ting/8
F27.5b
Opciones de
configuración
Nuevo campo en el
formulario de Opciones de
configuración del tema.
Para poder utilizar este valor en las plantillas, tenemos que añadirlo a $variables a
través de alguna función de preprocesamiento. En nuestro ejemplo, como solo
estamos mostrando el texto en la plantilla [Link], implementaremos la
función hook_preprocess_page(). Aquí también usaremos la función
theme_get_setting() para obtener el valor del parámetro de configuración
[F27.5c].
<?php F27.5c
theme_get_setting()
/**
* Implements hook_preprocess_HOOK() for [Link]. Esta función permite
*/ obtener el valor del un
function b_forcontu_preprocess_page(&$variables) { parámetro del tema.
$variables['show_twig_message'] = theme_get_setting('show_twig_message');
}
Por último, modificaremos la plantilla [Link] para que solo muestre el mensaje
si la opción está activada [F27.5d].
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 107
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
config/install/b_forcontu.[Link]
F27.5e features:
node_user_picture: 1
Configuración por
comment_user_picture: 1
defecto
comment_user_verification: 1
Archivo YAML con la favicon: 1
configuración que se logo:
aplicará al instalar el tema. use_default: 1
favicon:
use_default: 1
show_twig_message: 1
La forma más rápida de averiguar cuáles son las variables que podemos añadir
dentro de este archivo de configuración, es consultando directamente la
configuración creada al instalar el tema. Como ya hemos visto, lo podemos hacer
desde consola o desde Config Editor de Devel. Recuerda que el archivo de
configuración para un tema tiene el nombre theme_name.settings (Por ejemplo,
b_forcontu.settings).
Por último, deberás desactivar, desinstalar y volver a instalar el tema para probar
si se aplican los valores por defecto indicados en el archivo de configuración.
108 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Instalación/desinstalación de temas
drupal theme:install
// cache:rebuild
Rebuilding cache(s), wait a moment please.
[OK] Done clearing cache(s).
[Link]
[Link]
drupal theme:uninstall
Para poder realizar el cambio, primero estableceremos el nuevo tema por defecto.
Esto lo podemos hacer desde Drush o Drupal Console, teniendo en cuenta que se
trata de un cambio en la configuración (ver comandos en apartado 19.5).
Una vez establecido un nuevo tema por defecto, ya podemos desinstalar el tema:
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 109
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
// cache:rebuild
Rebuilding cache(s), wait a moment please.
[OK] Done clearing cache(s).
[Link]
[Link]
drupal theme:download
[Link]
[Link]
110 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
drupal theme:path
[Link]
[Link]
drupal module:debug
Devuelve un listado con los temas disponibles, indicando, para cada uno de ellos,
si están instalados o desinstalados, el nombre de sistema y la versión.
drupal theme:debug
drupal tde
$ drupal theme:debug
------------ ----------------- ------------- ---------
Id Name Status Version
------------ ----------------- ------------- ---------
stark Stark Uninstalled 8.2.5
stable Stable Installed 8.2.5
seven Seven Installed 8.2.5
bartik Bartik Installed 8.2.5
classy Classy Installed 8.2.5
b_forcontu Bartik Forcontu Installed
------------ ----------------- ------------- ---------
[Link]
[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 111
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Creación de temas
drupal generate:theme
Genera un tema.
$ drupal generate:theme
1 - be/be2/themes/console_theme/console_theme.[Link]
2 - be/be2/themes/console_theme/console_theme.theme
[Link]
console/content/es/commands/[Link]
112 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Contenidos de la Unidad
28
28.1 Arrays renderizables
28.2 Elementos renderizables
28.3 Definición de plantillas en módulos
28.4 Crear extensiones de Twig
28.5 Hazlo desde la consola
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 115
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Pero antes de llegar a las plantillas, es en los módulos en donde se genera la salida
de páginas, bloques y otros elementos. Los módulos no generan el HTML
directamente, sino que deben devolver un array renderizable con la información
necesaria para que el sistema pueda generar el HTML correspondiente.
Servicio: renderer
Clase:
[Link]
Renderer/8
<?php
/**
* @file
* Contains \Drupal\forcontu_theming\Controller\ForcontuThemingController.
*/
namespace Drupal\forcontu_theming\Controller;
use Drupal\Core\Controller\ControllerBase;
116 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
El primer elemento es una salida #markup, que es una cadena HTML directa.
Aunque podríamos especificar una cadena HTML completa, recuerda que utilizamos
siempre la función t() para traducir los textos de la interfaz.
//Example 1: markup
$build['forcontu_theming_markup'] = [
'#markup' => '<p>' . $this->t('Lorem ipsum dolor sit amet,
consectetur adipiscing elit.') . '</p>',
];
//Example 2: table
$header = ['Column 1', 'Column 2', 'Column 3'];
$rows[] = ['A', 'B', 'C'];
$rows[] = ['D', 'E', 'F'];
$build['forcontu_theming_table'] = [
'#type' => 'table',
'#header' => $header,
'#rows' => $rows,
];
[Link]
//Example 3: list
$list = ['Item 1', 'Item 2', 'Item 3'];
$build['forcontu_theming_list'] = [
'#theme' => 'item_list',
'#title' => $this->t('List of items'),
'#list_type' => 'ol',
'#items' => $list,
];
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 117
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F28.1a
Arrays renderizables
Salida en el navegador una
vez el array es renderizado.
<div class="item-list">
<h3>Lista de ítems</h3>
<ol>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ol>
</div>
118 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 119
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Servicio renderer
Servicio: renderer
Clase:
[Link]
Renderer/8
<?php
namespace Drupal\example_module;
use Drupal\Core\Render\RendererInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
protected $renderer;
return $this->renderer->render($build);
}
}
[Link]
on/Renderer::render/8
120 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Elementos hijos
$build = [
'container' => [
'#prefix' => '<div id="container">',
'#suffix' => '</div>',
'#markup' => $this->t('This is a container div'),
'list' => [
'#theme' => 'item_list',
'#title' => $this->t('List of items'),
'#list_type' => 'ol',
'#items' => $list,
],
],
];
return $build;
}
F28.1b
Arrays renderizables
Ejemplo de array
renderizable con elementos
hijos.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 121
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Enlaces de interés
Render API
[Link]
up/theme_render/8
Clase RenderElement
[Link]
[Link]/class/RenderElement/8
122 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Cada elemento renderizable viene definido por una clase que extiende a la clase
RenderElement:
[Link]
[Link]/class/RenderElement/8
dropbutton
$build['dropbutton'] = [
'#type' => 'dropbutton',
'#links' => [
'view' => [
'title' => $this->t('View'),
'url' => Url::fromRoute('forcontu_theming.link_view'),
],
'edit' => [
'title' => $this->t('Edit'),
'url' => Url::fromRoute('forcontu_theming.link_edit'),
],
'delete' => [
'title' => $this->t('Delete'),
'url' => Url::fromRoute('forcontu_theming.link_delete'),
],
],
];
F28.2a
dropbutton
Botón agrupador de
acciones o enlaces.
Clase Dropbutton:
[Link]
[Link]/class/Dropbutton/8
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 123
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
operations
Clase Operations:
[Link]
.php/class/Operations/8
more_link
El elemento more_link permite añadir un enlace de 'Ver más', muy típico de los
bloques, en los que se muestra un listado limitado de elementos, y un enlace de
"ver más" para ir al listado completo [F28.2b].
La propiedad #title permite modificar el texto del enlace. El valor por defecto es
'More' (Más).
$build['more_link'] = [
'#type' => 'more_link',
'#url' => Url::fromRoute('forcontu_theming.list')
];
F28.2a
more_link
Enlace de "ver más".
Clase MoreLink:
[Link]
hp/class/MoreLink/8
toolbar_item
?php
/**
* Implements hook_toolbar().
*
*/
function masquerade_toolbar() {
$items = array();
if (\Drupal::service('masquerade')->isMasquerading()) {
124 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$items['masquerade_switch_back'] = array(
'#type' => 'toolbar_item',
'tab' => array(
'#type' => 'link',
'#title' => t('Unmasquerade'),
'#url' => Url::fromRoute('[Link]'),
),
'#weight' => 101,
);
}
return $items;
}
[Link]
hp/class/ToolbarItem/8
html_tag
Permite añadir cualquier etiqueta HTML (#tag), con sus atributos (#attributes) y
valor (#value). Por ejemplo:
$color = '#ffeb3b';
$build['html_tag'] = [
'#type' => 'html_tag',
'#tag' => 'p',
'#value' => $this->t('The content area color has been changed to
@code', array('@code' => $color)),
'#attributes' => [
'style' => 'background-color: ' . $color,
],
];
[Link]
hp/class/HtmlTag/8
status_messages
Elemento para mostrar mensajes de estado del sistema. Lo que hace el elemento
es imprimir el resultado de las llamadas a drupal_set_message() que se hayan
realizado durante la ejecución de la página. Los mensajes se almacenan en una
variable de sesión y se muestran en la página a través de la plantilla [Link].
Con este elemento podemos imprimir los mensajes de estado en cualquier otra
ubicación.
$build['status_messages'] = [
'#type' => 'status_messages',
];
Clase StatusMessages:
[Link]
[Link]/class/StatusMessages/8
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 125
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
view
$build['view'] = [
'#prefix' => '<div class="view-comments_recent">',
'#suffix' => '</div>',
'#type' => 'view',
'#name' => 'comments_recent',
'#display_id' => 'block_1',
'#embed' => TRUE,
];
[Link]
View/8
inline_template
$build['inline_template'] = [
'#type' => 'inline_template',
'#template' => '<div class="block-filter-text-source">{{ label
}}</div>',
'#context' => [
'label' => $this->t('Lorem Ipsum'),
],
];
Clase InlineTemplate:
[Link]
[Link]/class/InlineTemplate/8
126 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Función hook_theme()
[Link]
tion/hook_theme/8
El valor devuelto es un array donde cada elemento es un array que describe una
plantilla. La clave identifica al elemento, y se conoce como "theme hook". Algunas
de las propiedades que podemos usar al definir una plantilla son:
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 127
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
/**
* Implements hook_theme().
*/
function forcontu_theming_theme($existing, $type, $theme, $path) {
return [
'forcontu_theming_dimensions' => [
'variables' => [
'length' => NULL,
'width' => NULL,
'height' => NULL,
'unit' => 'cm.'
],
'template' => 'forcontu-theming-dimensions',
],
];
}
/forcontu_theming/templates/[Link]
{#
/**
* @file
* Default theme implementation for 'forcontu_theming_dimensions'.
*
* Available variables:
* - length.
* - width.
* - height
* - unit (dafault to cm.)
*/
#}
<span class="item-dimensions">
{% trans %}
Dimensions (length x width x height): {{ length }} x {{ width }} x
{{ height }} {{ unit }}
{% endtrans %}
</span>
Recuerda que siempre hay que traducir las cadenas incluidas directamente en las
plantillas.
Ya tenemos definida la plantilla y podemos hacer uso de ella desde cualquier array
renderizable. Vacía la caché del sitio para que el sistema reconozca la nueva
plantilla.
$build['item_dimensions'] = [
'#theme' => 'forcontu_theming_dimensions',
'#length' => 12,
'#width' => 8,
'#height' => 24,
];
128 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
<span class="item-dimensions">
Dimensions (length x width x height): 12 x 8 x 24 cm.
</span>
Funciones de preprocesamiento
- MODULE_preprocess_HOOK(&$variables). Es la implementación de
hook_preprocess_HOOK() dentro de un módulo. Esta función se utiliza
cuando un módulo desea modificar las variables de la plantilla HOOK de
otro módulo.
Añadir librerías
En el apartado 27.1 vimos cómo definir y añadir una librería a un tema. Un módulo
también puede añadir su propia librería de estilos (CSS) o código Javascript.
Seguiremos los siguientes pasos:
1. Crear el archivo CSS, definir los estilos, y guardarlo en la carpeta /css del
módulo.
.item-dimensions {
color: #FF0000;
}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 129
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
forcontu_theming.css:
version: 1.x
css:
theme:
css/forcontu_theming.css: {}
Con 'theme' estamos estableciendo el peso o nivel del estilo. Los valores
posibles, por orden de peso, de menor a mayor, son: base, layout,
component, state y theme.
$build['item_dimensions'] = [
'#theme' => 'forcontu_theming_dimensions',
'#attached' => [
'library' => [
'forcontu_theming/forcontu_theming.css',
],
],
'#length' => 12,
'#width' => 8,
'#height' => 24,
];
{{ attach_library('forcontu_theming/forcontu_theming.css') }}
<span class="item-dimensions">
{% trans %}
Dimensions (length x width x height): {{ length }} x {{ width }} x
{{ height }} {{ unit }}
{% endtrans %}
</span>
/**
* Implements MODULE_preprocess_HOOK() for focontu_theming_dimensions.
*/
function forcontu_theming_preprocess_forcontu_theming_dimensions(&$variables) {
$variables['#attached']['library'][] = 'forcontu_theming/forcontu_theming.css';
}
130 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
/**
* Implements MODULE_preprocess_HOOK() for page.
*/
function forcontu_theming_preprocess_page(&$variables) {
$variables['page']['#cache']['contexts'][] = 'route';
if (\Drupal::routeMatch()->getRouteName() === 'forcontu_theming.render_elements') {
$variables['#attached']['library'][] = 'forcontu_theming/forcontu_theming.css';
}
}
En todos los casos, el resultado será el texto en rojo, como se muestra en la Figura
[F28.3a]:
F28.3a
Librería CSS
Estilos aplicados a través
de un archivo CSS del
módulo.
A nivel de HTML, el sistema está cargando la librería CSS de esta forma:
@import url("/modules/custom/forcontu_theming/css/forcontu_theming.css?omyl8u");
Si quieres saber más sobre cómo trabajar con librerías en módulos y temas, puedes
consultar este enlace:
[Link]
and-javascript-js-to-a-drupal-8-module
Las sugerencias de plantillas estudiadas para temas, también se aplican para las
plantillas creadas en los módulos. Desde el módulo podemos implementar
hook_theme_suggestions_alter() para añadir nuevas sugerencias de nombres de
plantillas a las plantillas creadas por el módulo.
Como ejemplo, añadimos una sugerencia de nombre que actúa únicamente cuando
el usuario está logueado.
/**
* Implements hook_theme_suggestions_HOOK_alter() for HOOK
* 'forcontu_theming_dimensions'.
*/
function
forcontu_theming_theme_suggestions_forcontu_theming_dimensions_alter(array
&$suggestions, array $variables) {
if (\Drupal::currentUser()->isAuthenticated()) {
$suggestions[] = 'forcontu_theming_dimensions__logged_in';
}
}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 131
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
[Link]/class/RenderElement/8
[Link]
[Link]/class/FormElement/8
132 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
<?php
namespace Drupal\forcontu_theming\Element;
use Drupal\Core\Render\Element\RenderElement;
/**
* Provides a render element to display a Dimensions item.
*
* @RenderElement("forcontu_theming_dimensions")
*/
class ForcontuThemingDimensions extends RenderElement {
/**
* {@inheritdoc}
*/
public function getInfo() {
$class = get_class($this);
return [
'#pre_render' => [
[$class, 'preRenderForcontuThemingDimensions'],
],
'#length' => NULL,
'#width' => NULL,
'#height' => NULL,
'#unit' => 'cm.',
'#theme' => 'forcontu_theming_dimensions',
];
}
/**
* Element pre render callback.
*/
public static function preRenderForcontuThemingDimensions($element) {
return $element;
}
}
$build['item_dimensions_element'] = [
'#type' => 'forcontu_theming_dimensions',
'#length' => 11,
'#width' => 7,
'#height' => 23,
'#unit' => 'mm.',
];
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 133
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
wig_Extension/8
<?php
namespace Drupal\forcontu_theming\TwigExtension;
134 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
services:
forcontu_theming.[Link]:
class:
Drupal\forcontu_theming\TwigExtension\ForcontuThemingTwigExtension
tags:
- { name: [Link] }
Ahora ya podemos hacer uso de las nuevas extensiones en cualquier plantilla Twig:
<p>Lorem-ipsum-dolor-sit-amet,-consectetur-adipiscing-elit.-Quin-
etiam-ferae,-inquit-Pacuvius,-quíbus-.</p>
En el ejemplo del siguiente apartado, generado con Drupal Console, veremos cómo
inyectar servicios dentro de la clase que implementa las extensiones.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 135
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
drupal generate:twig:extension
$ drupal generate:twig:extension
// cache:rebuild
1 - modules/custom/forcontu_console/forcontu_console.[Link]
2 - modules/custom/forcontu_console/src/TwigExtension/[Link]
[Link]
console/content/es/commands/[Link]
<?php
namespace Drupal\forcontu_console\TwigExtension;
use Drupal\Core\Render\Renderer;
use Drupal\Core\Session\AccountProxy;
136 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
/**
* Class test.
*
* @package Drupal\forcontu_console
*/
class test extends \Twig_Extension {
/**
* Drupal\Core\Session\AccountProxy definition.
*
* @var \Drupal\Core\Session\AccountProxy
*/
protected $currentUser;
/**
* Constructor.
*/
public function __construct(Renderer $renderer, AccountProxy
$current_user) {
parent::__construct($renderer);
$this->currentUser = $current_user;
}
/**
* {@inheritdoc}
*/
public function getTokenParsers() {
return [];
}
/**
* {@inheritdoc}
*/
public function getNodeVisitors() {
return [];
}
/**
* {@inheritdoc}
*/
public function getFilters() {
return [];
}
/**
* {@inheritdoc}
*/
public function getTests() {
return [];
}
/**
* {@inheritdoc}
*/
public function getFunctions() {
return [];
}
/**
* {@inheritdoc}
*/
public function getOperators() {
return [];
}
/**
* {@inheritdoc}
*/
public function getName() {
return 'forcontu_console.[Link]';
}
}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 137
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
services:
forcontu_console.[Link]:
class: Drupal\forcontu_console\TwigExtension\test
arguments: ['@renderer', '@current_user']
tags:
- { name: [Link] }
138 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
29
Contenidos de la Unidad
29.1 Crear un tipo de plugin
29.2 Crear un servicio personalizado
29.3 Hazlo desde la consola
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 141
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Algunos de los tipos de plugin disponibles en el núcleo de Drupal son los bloques,
los efectos de imagen, los tipos de campo o los controles y formateadores de
campos.
Cada tipo de plugin tiene su propio servicio "plugin manager", que es una clase
que implementa la interfaz PluginManagerInterface y que se encarga de definir qué
método se utilizará para descubrir o localizar los plugins de ese tipo que se hayan
creado en el sistema (annotation, hook, YAML, etc.), y cómo se crearán o
instanciarán plugins de ese tipo.
Generalmente los tipos de plugin incluyen una clase base para facilitar la
instanciación de plugins. Por ejemplo, para crear un plugin de Bloque, crearemos
una clase que extienda a la clase BlockBase.
[Link]
Para definir un nuevo tipo de plugin, tenemos que seguir estos pasos:
4. Definir una interfaz que tendrán que implementar los plugins de este tipo.
5. Crear una clase base que implemente la interfaz, y que será la clase de la
que heredarán los plugins de este tipo.
7. Para utilizar los plugins de este tipo, podemos llamar al servicio encargado
de gestionarlo. Tendremos que crear una instancia del plugin que
vayamos a utilizar.
142 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
<?php
namespace Drupal\forcontu_plugins;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Plugin\DefaultPluginManager;
use Drupal\forcontu_plugins\Annotation\Fipsum;
/**
* Provides the plugin manager for Fipsum plugins.
*/
class FipsumPluginManager extends DefaultPluginManager {
$subdir = 'Plugin/Fipsum';
$plugin_interface = FipsumInterface::class;
$plugin_definition_annotation_name = Fipsum::class;
$this->alterInfo('forcontu_plugins_fipsum_info');
$this->setCacheBackend($cache_backend, 'forcontu_plugins_fipsum_info');
}
}
Entre las cláusulas use, debemos especificar la clase de tipo Annotation, que
definiremos en el paso 3:
use Drupal\forcontu_plugins\Annotation\Fipsum;
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 143
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
[Link]/class/DefaultPluginManager/8
services:
[Link]:
class: Drupal\forcontu_plugins\FipsumPluginManager
parent: default_plugin_manager
Paso 3. Annotation
El tipo de plugin definido utiliza el método Annotation para que el sistema pueda
descubrir sus plugins. Para definir la clase annotation, extendemos a la clase
Drupal\Component\Annotation\Plugin. La clase Fipsum se creará en el archivo
src/Annotation/[Link]. Dentro del comentario annotation tenemos que añadir
la propiedad @Annotation. Dentro de la clase definimos los atributos que tendrá el
plugin.
<?php
namespace Drupal\forcontu_plugins\Annotation;
use Drupal\Component\Annotation\Plugin;
/**
* Defines a Fipsum annotation object.
*
* @see \Drupal\forcontu_plugins\FipsumPluginManager
* @see plugin_api
*
* @Annotation
*/
class Fipsum extends Plugin {
/**
* The plugin ID.
*
* @var string
*/
public $id;
/**
* The description of the plugin.
*
* @var \Drupal\Core\Annotation\Translation
*
* @ingroup plugin_translatable
*/
public $description;
}
144 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Debemos definir una interfaz que tendrán que implementar todos los plugins de
este tipo. En nuestro tipo de plugin Fipsum, definimos dos métodos:
Archivo: /forcontu_plugins/src/[Link]
<?php
namespace Drupal\forcontu_plugins;
/**
* Interface for all Fipsum type plugins.
*/
interface FipsumInterface {
Esta clase base será la que extenderán los plugins de este tipo.
Archivo: /forcontu_plugins/src/[Link]
<?php
namespace Drupal\forcontu_plugins;
use Drupal\Component\Plugin\PluginBase;
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 145
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Plugin lorem_ipsum
Archivo: src/Plugin/Fipsum/[Link]
Genera un texto tipo Lorem Ipsum clásico, obtenido a través de la API de
[Link].
<?php
namespace Drupal\forcontu_plugins\Plugin\Fipsum;
use Drupal\forcontu_plugins\FipsumBase;
/**
* Provides a LoremIpsum text.
*
* @Fipsum(
* id = "lorem_ipsum",
* description = @Translation("Lorem Ipsum text")
* )
*/
class LoremIpsum extends FipsumBase {
Plugin forcontu_ipsum
Archivo: src/Plugin/Fipsum/[Link]
Genera un texto tipo Forcontu Ipsum, que se obtiene a partir de una URL extraída
de [Link].
<?php
namespace Drupal\forcontu_plugins\Plugin\Fipsum;
use Drupal\forcontu_plugins\FipsumBase;
/**
* Provides an ForcontuIpsum text.
*
* @Fipsum(
* id = "forcontu_ipsum",
* description = @Translation("Forcontu Ipsum text")
* )
*/
class ForcontuIpsum extends FipsumBase {
146 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Para utilizar los plugins de este tipo, debemos llamar al servicio encargado de
gestionarlo, y crear una instancia del plugin que vayamos a utilizar.
forcontu_plugins.fipsum:
path: '/forcontu/plugins/fipsum'
defaults:
_controller:
'\Drupal\forcontu_plugins\Controller\ForcontuPluginsController::fi
psum'
_title: 'Fipsum Test Page'
requirements:
_permission: 'access content'
<?php
/**
* @file
* Contains
\Drupal\forcontu_plugins\Controller\ForcontuPluginsController.
*/
namespace Drupal\forcontu_plugins\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\forcontu_plugins\FipsumPluginManager;
protected $fipsum;
$build['fipsum_lorem_ipsum_title'] = [
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 147
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$build['fipsum_lorem_ipsum_text'] = [
'#markup' => '<p>' . $lorem_ipsum->generate(300) . '</p>',
];
$forcontu_ipsum = $this->fipsum->createInstance('forcontu_ipsum');
$build['fipsum_forcontu_ipsum_title'] = [
'#markup' => '<h2>' . $forcontu_ipsum->description() . '</h2>',
];
$build['fipsum_forcontu_ipsum_text'] = [
'#markup' => '<p>' . $forcontu_ipsum->generate(600) . '</p>',
];
return $build;
}
}
F29.1a
Plugins
Texto Lorem ipsum
devuelto por los plugins de
tipo Fipsum creados.
Enlaces de interés:
- Annotations-based plugins
[Link]
148 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Ya hemos trabajado con servicios y sabemos cómo hacer uso de ellos. En este
apartado vamos a ver cómo se crea un nuevo servicio personalizado.
services:
[Link]:
class: Drupal\forcontu_plugins\ForcontuCourses
arguments: ["%[Link]%"]
parameters:
[Link]:
- { title: 'Experto en Drupal 8 Site Building',
tutor: 'Fran Gil', duration: 4, hours: 180}
- { title: 'Experto en Drupal 8 Back-End Development',
tutor: 'Fran Gil', duration: 6, hours: 300}
- { title: 'Experto en Drupal 8 Front-End Development',
tutor: 'Fran Gil', duration: 4, hours: 180}
- { title: 'Máster en Drupal 8',
tutor: 'Fran Gil', duration: 14, hours: 660}
Más información sobre las propiedades que puede tener un archivo [Link]:
[Link]
of-a-service-file
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 149
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
<?php
namespace Drupal\forcontu_plugins;
interface ForcontuCoursesInterface {
<?php
namespace Drupal\forcontu_plugins;
protected $courses;
Archivo forcontu_plugins.[Link]:
forcontu_plugins.courses:
path: '/forcontu/plugins/courses'
defaults:
_controller:
'\Drupal\forcontu_plugins\Controller\ForcontuPluginsController::co
urses'
_title: 'List of courses'
requirements:
_permission: 'access content'
150 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Archivo src/Controller/[Link]:
<?php
namespace Drupal\forcontu_plugins\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\forcontu_plugins\FipsumPluginManager;
use Drupal\forcontu_plugins\ForcontuCoursesInterface;
class ForcontuPluginsController extends ControllerBase {
protected $fipsum;
protected $forcontuCourses;
$build['forcontu_plugins_table'] = [
'#type' => 'table',
'#header' => $header,
'#rows' => $list,
];
return $build;
}
}
F29.2a
Servicio
[Link]
Página mostrando los
cursos devueltos por el
servicio.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 151
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Dentro de la clase que define el servicio, podemos inyectar los servicios que
vayamos a utilizar. Para añadir un servicio tenemos que:
<?php
namespace Drupal\forcontu_console;
use Drupal\Core\Database\Driver\mysql\Connection;
use Drupal\Core\Session\AccountProxy;
protected $database;
protected $currentUser;
services:
forcontu_console.foo:
class: Drupal\forcontu_console\ForcontuConsoleFoo
arguments: ['@database', '@current_user']
152 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
drupal generate:plugin:type:annotation
$ drupal generate:plugin:type:annotation
1 -
modules/custom/forcontu_console/src/Annotation/ForcontuConsoleBar.
php
2 -
modules/custom/forcontu_console/src/Plugin/ForcontuConsoleBarBase.
php
3 -
modules/custom/forcontu_console/src/Plugin/ForcontuConsoleBarInter
[Link]
4 -
modules/custom/forcontu_console/src/Plugin/ForcontuConsoleBarManag
[Link]
5 - modules/custom/forcontu_console/forcontu_console.[Link]
[Link]
console/content/es/commands/[Link]
<?php
namespace Drupal\forcontu_console\Plugin;
use Drupal\Core\Plugin\DefaultPluginManager;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
/**
* Provides the Forcontu console bar plugin manager.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 153
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
*/
class ForcontuConsoleBarManager extends DefaultPluginManager {
/**
* Constructor for ForcontuConsoleBarManager objects.
*
* @param \Traversable $namespaces
* An object that implements \Traversable which contains the
root paths
* keyed by the corresponding namespace to look for plugin
implementations.
* @param \Drupal\Core\Cache\CacheBackendInterface
$cache_backend
* Cache backend instance to use.
* @param \Drupal\Core\Extension\ModuleHandlerInterface
$module_handler
* The module handler to invoke the alter hook with.
*/
public function __construct(\Traversable $namespaces,
CacheBackendInterface $cache_backend, ModuleHandlerInterface
$module_handler) {
parent::__construct('Plugin/ForcontuConsoleBar', $namespaces,
$module_handler,
'Drupal\forcontu_console\Plugin\ForcontuConsoleBarInterface',
'Drupal\forcontu_console\Annotation\ForcontuConsoleBar');
$this-
>alterInfo('forcontu_console_forcontu_console_bar_info');
$this->setCacheBackend($cache_backend,
'forcontu_console_forcontu_console_bar_plugins');
}
}
La interfaz generada:
<?php
namespace Drupal\forcontu_console\Plugin;
use Drupal\Component\Plugin\PluginInspectionInterface;
/**
* Defines an interface for Forcontu console bar plugins.
*/
interface ForcontuConsoleBarInterface extends
PluginInspectionInterface {
<?php
namespace Drupal\forcontu_console\Plugin;
use Drupal\Component\Plugin\PluginBase;
/**
* Base class for Forcontu console bar plugins.
*/
abstract class ForcontuConsoleBarBase extends PluginBase
implements ForcontuConsoleBarInterface {
// Add common methods and abstract methods for your plugin type here.
}
154 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
<?php
namespace Drupal\forcontu_console\Annotation;
use Drupal\Component\Annotation\Plugin;
/**
* Defines a Forcontu console bar item annotation object.
*
* @see \Drupal\forcontu_console\Plugin\ForcontuConsoleBarManager
* @see plugin_api
*
* @Annotation
*/
class ForcontuConsoleBar extends Plugin {
/**
* The plugin ID.
*
* @var string
*/
public $id;
/**
* The label of the plugin.
*
* @var \Drupal\Core\Annotation\Translation
*
* @ingroup plugin_translatable
*/
public $label;
}
services:
[Link].forcontu_console_bar:
class: Drupal\forcontu_console\Plugin\ForcontuConsoleBarManager
parent: default_plugin_manager
drupal generate:plugin:type:yaml
Como el comando anterior, también genera un tipo de plugin, pero esta vez con el
método de descubrimiento yaml, en lugar de annotation. Prueba el comando para
ver las diferentes entre un método y otro.
[Link]
console/content/es/commands/[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 155
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
drupal generate:plugin:*
drupal generate:service
Genera un servicio.
$ drupal generate:service
// cache:rebuild
156 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
1 - modules/custom/forcontu_console/forcontu_console.[Link]
2 - modules/custom/forcontu_console/src/[Link]
3 - modules/custom/forcontu_console/src/[Link]
[Link]
console/content/es/commands/[Link]
<?php
namespace Drupal\forcontu_console;
use Drupal\Core\Database\Driver\mysql\Connection;
use Drupal\Core\Session\AccountProxy;
/**
* Class ForcontuConsoleFoo.
*
* @package Drupal\forcontu_console
*/
class ForcontuConsoleFoo implements ForcontuConsoleFooInterface {
/**
* Drupal\Core\Database\Driver\mysql\Connection definition.
*
* @var \Drupal\Core\Database\Driver\mysql\Connection
*/
protected $database;
/**
* Drupal\Core\Session\AccountProxy definition.
*
* @var \Drupal\Core\Session\AccountProxy
*/
protected $currentUser;
/**
* Constructor.
*/
public function __construct(Connection $database, AccountProxy
$current_user) {
$this->database = $database;
$this->currentUser = $current_user;
}
}
La interfaz generada:
<?php
namespace Drupal\forcontu_console;
/**
* Interface ForcontuConsoleFooInterface.
*
* @package Drupal\forcontu_console
*/
interface ForcontuConsoleFooInterface {
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 157
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
services:
forcontu_console.foo:
class: Drupal\forcontu_console\ForcontuConsoleFoo
arguments: ['@database', '@current_user']
158 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Entidades I:
30
Entidades de configuración
En Drupal 8 encontramos dos variantes de entidades, las entidades
Comparativa D8/D7
de configuración y las entidades de contenido.
Las entidades fueron introducidas en el
núcleo de Drupal 7, aunque la mayor parte
Ya estudiamos la configuración simple, que permite almacenar de la funcionalidad se implementó en el
variables únicas, no repetitivas. En esta unidad estudiaremos las
módulo contribuido Entity API. En Drupal 8
entidades de configuración, que permiten almacenar estructuras de
casi toda esta funcionalidad se ha incluido
configuración más complejas, que se pueden listar, editar, eliminar,
en el núcleo y se han añadido también
etc., pero, sobre todo, se pueden instanciar múltiples veces.
muchas mejoras.
Contenidos de la Unidad
30
30.1 Introducción a Entity API y tipos de entidades
30.2 Operaciones sobre entidades
30.3 Entidades de configuración (Configuration Entities)
30.4 Hazlo desde la consola
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 161
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Las entidades son elementos sobre los que podemos realizar operaciones comunes
como crear, cargar, guardar, modificar, eliminar, etc.
162 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Tipos de entidad
Con tipo de entidad nos referimos a la clase que permite crear o instanciar
entidades de ese tipo. Por ejemplo, el tipo de entidad Node permite crear nodos,
que son las entidades de ese tipo.
Las clases que definen entidades se crean en el directorio /src/Entity del módulo,
correspondiéndole el espacio de nombres \Drupal\[módulo]\Entity. Dentro la clase
se añade, vía annotations (etiqueta @EntityType), información de configuración de
la clase (etiqueta, controladores, tablas, etc.). Este es el método que utiliza el
sistema para descubrir qué tipos de entidad implementa cada módulo.
Bundles
- Los tipos de contenido (Artículo, Página básica, etc.) son bundles del
tipo de entidad Node.
- Los tipos de comentario son bundles del tipo de entidad Comment.
- Los vocabularios son bundles de la entidad Taxonomy.
- Los tipos de bloques personalizados son bundles de la entidad Blocks.
No todas las entidades tienen que tener bundles. Por ejemplo, la entidad User no
tiene bundles. Las entidades de configuración generalmente no tienen bundles (Por
ejemplo, Role, Menu, View, etc.).
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 163
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Comprobación de entidades
Una vez hemos comprobado que el objeto es una entidad, podemos obtener el tipo
de entidad con:
164 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
nterface/EntityInterface/8
// Obtiene el ID de la entidad
$entity->id();
Servicio: entity_type.manager
Clase:
[Link]
hp/class/EntityTypeManager/8
$node_storage = \Drupal::entityTypeManager()->getStorage('node');
$user_storage = \Drupal::entityTypeManager()->getStorage('user');
Como en otros muchos casos, podemos utilizar el servicio desde la clase global
\Drupal, como en el ejemplo anterior, o inyectando el servicio en la clase en que
estemos trabajando.
[Link]
[Link]/interface/EntityStorageInterface/8
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 165
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Carga de entidades
$node = $node_storage->load(1);
[Link]
n/hook_ENTITY_TYPE_load/8
$new_user = $user_storage->create([
'name' => 'test_user',
'mail' => 'foo@[Link]',
'pass' => '123456',
]);
$new_user->save();
166 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
del almacén.
Cuando se guarda una entidad con save(), el sistema identifica si se trata de una
nueva entidad (aún no tiene un ID asignado) o de una entidad existente. En
algunos casos, como cuando importamos elementos, puede ser necesario forzar a
que la entidad se cree. Esto lo podemos hacer con el método enforceIsNew(),
siempre teniendo en cuenta que el ID asignado a la entidad no puede existir en la
base de datos.
Cuando son otros módulos los que crean las entidades, podemos intervenir durante
la creación implementando el hook:
- hook_ENTITY_TYPE_create($entity)
/**
* Implements ENTITY_TYPE_create() for node.
*/
function forcontu_entities_node_create(\Drupal\Core\Entity\EntityInterface $entity) {
[Link]
n/hook_ENTITY_TYPE_create/8
[Link]
n/hook_ENTITY_TYPE_presave/8
[Link]
n/hook_ENTITY_TYPE_insert/8
[Link]
n/hook_ENTITY_TYPE_update/8
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 167
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Eliminar entidades
$entity->delete();
Cuando se elimina una entidad de otro módulo, podemos utilizar estos hooks:
[Link]
on/hook_ENTITY_TYPE_predelete/8
[Link]
on/hook_ENTITY_TYPE_delete/8
[Link]
ntity::access/8
if ($entity->access('view')) {
}
168 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
[Link]/interface/EntityAccessControlHandlerInterface/8
$access_control_handler =
\Drupal::entityTypeManager()->getAccessControlHandler('node');
Para acceder al valor de un campo en una entidad podemos utilizar este método:
$entity->get("FIELD")->getValue();
$body = $node->get('body')->getValue();
dpm($body);
F30.2a
Acceso a campos
Valor del campo devuelto
en formato array.
Para acceder al valor del campo (o de cualquier otro elemento del campo):
// resumen
$body[0]['summary'];
// formato
$body[0]['format'];
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 169
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$terms = $node->get('field_tags')->getValue();
$term_storage =
\Drupal::entityTypeManager()->getStorage('taxonomy_term');
foreach($terms as $term_id) {
$term = $term_storage->load($term_id['target_id']);
dpm($term->label());
}
[Link]
[Link]
[Link]/interface/QueryInterface/8
$query = \Drupal::entityQuery('node')
->condition('status', 1)
->condition('type', 'article')
->range(0,5)
->sort('changed', 'DESC');
$entity_ids = $query->execute();
170 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Entidades de configuración
30.3
(Configuration entities)
Aunque en este apartado se explica paso a paso cómo crear un nuevo tipo de
entidad de configuración, para una implementación más ágil y para evitar errores,
se recomienda usar Drupal Console para generar el esqueleto de la entidad.
Veremos en el último apartado los comandos disponibles.
En este primer paso vamos a crear la interfaz y la clase que implementa la entidad.
src/Entity/[Link]
<?php
namespace Drupal\forcontu_entities\Entity;
use Drupal\Core\Config\Entity\ConfigEntityInterface;
/**
* Provides an interface for defining Section entities.
*/
interface SectionInterface extends ConfigEntityInterface {
/**
* Returns the URL pattern of the section.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 171
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
*
* @return string
* The URL pattern of the section
*/
public function getUrlPattern();
/**
* Returns the color of the section.
*
* @return string
* Color in HEX format
*/
public function getColor();
/**
* Sets the section URL pattern.
*
* @param string $pattern
* The pattern URL
*
* @return $this
*/
public function setUrlPattern($pattern);
/**
* Sets the section Color.
*
* @param string $color
* Color in HEX format
*
* @return $this
*/
public function setColor($color);
La clase tiene una cabecera de comentario con formato annotation, que define las
propiedades de la entidad dentro de la directiva @ConfigEntityType.
src/Entity/[Link] (Annotation)
<?php
namespace Drupal\forcontu_entities\Entity;
use Drupal\Core\Config\Entity\ConfigEntityBase;
/**
* Defines the Section entity.
*
* @ConfigEntityType(
* id = "forcontu_entities_section",
* label = @Translation("Section"),
* handlers = {
* "list_builder" = "Drupal\forcontu_entities\SectionListBuilder",
* "form" = {
* "add" = "Drupal\forcontu_entities\Form\SectionForm",
* "edit" = "Drupal\forcontu_entities\Form\SectionForm",
* "delete" = "Drupal\forcontu_entities\Form\SectionDeleteForm"
* },
* "route_provider" = {
* "html" = "Drupal\forcontu_entities\SectionHtmlRouteProvider",
* },
* },
* config_prefix = "forcontu_entities_section",
* admin_permission = "administer site configuration",
172 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
* entity_keys = {
* "id" = "id",
* "label" = "label",
* "uuid" = "uuid"
* },
* links = {
* "canonical" = "/admin/structure/forcontu_entities_section/{forcontu_entities_section}",
* "add-form" = "/admin/structure/forcontu_entities_section/add",
* "edit-form" = "/admin/structure/forcontu_entities_section/{forcontu_entities_section}/edit",
* "delete-form" = "/admin/structure/forcontu_entities_section/{forcontu_entities_section}/delete",
* "collection" = "/admin/structure/forcontu_entities_section"
* }
* )
*/
- id. Nombre de sistema del tipo de entidad, que debe llevar como prefijo
el nombre del módulo (salvo que el módulo y la entidad tengan el mismo
nombre).
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 173
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
src/Entity/[Link] (class)
/**
* The Section ID.
*
* @var string
*/
protected $id;
/**
* The Section label.
*
* @var string
*/
protected $label;
/**
* URL pattern.
*
* @var string
*/
protected $urlPattern;
/**
* Color (HEX format)
*
* @var string
*/
protected $color;
/**
* {@inheritdoc}
*/
public function getUrlPattern() {
return $this->urlPattern;
}
/**
* {@inheritdoc}
*/
public function getColor() {
return $this->color;
}
/**
* {@inheritdoc}
*/
public function setUrlPattern($pattern) {
$this->urlPattern = $pattern;
return $this;
}
/**
* {@inheritdoc}
*/
public function setColor($color) {
$this->color = $color;
return $this;
}
}
$entity->setUrlPattern($pattern)->setColor($color);
174 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Los enlaces que necesitamos para gestionar las entidades, pueden definirse de dos
formas:
entity.forcontu_entities_section.collection:
path: '/admin/structure/forcontu_entities_section'
defaults:
_entity_list: 'forcontu_entities_section'
_title: 'Sections configuration'
requirements:
_permission: 'administer site configuration'
entity.forcontu_entities_section.add_form:
path: '/admin/structure/forcontu_entities_section/add'
defaults:
_entity_form: 'forcontu_entities_section.add'
_title: 'Add section'
requirements:
_permission: 'administer site configuration'
entity.forcontu_entities_section.edit_form:
path: '/admin/structure/forcontu_entities_section/{example}'
defaults:
_entity_form: 'forcontu_entities_section.edit'
_title: 'Edit section'
requirements:
_permission: 'administer site configuration'
entity.forcontu_entities_section.delete_form:
path:
'/admin/structure/forcontu_entities_section/{example}/delete'
defaults:
_entity_form: 'forcontu_entities_section.delete'
_title: 'Delete section'
requirements:
_permission: 'administer site configuration'
Genera las rutas de forma dinámica a partir de una clase proveedora de rutas. Este
es el método que hemos definido al declarar la clase Section, a través del
parámetro "route_provider":
* "route_provider" = {
* "html" = "Drupal\forcontu_entities\SectionHtmlRouteProvider",
* },
Se trata de un código genérico que podemos reutilizar para otros tipos de entidad,
creando siempre una clase específica para cada tipo. Además, este es el método
que implementa Drupal Console.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 175
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
src/[Link]
<?php
namespace Drupal\forcontu_entities;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\Routing\AdminHtmlRouteProvider;
use Symfony\Component\Routing\Route;
/**
* Provides routes for Section entities.
*
* @see Drupal\Core\Entity\Routing\AdminHtmlRouteProvider
* @see Drupal\Core\Entity\Routing\DefaultHtmlRouteProvider
*/
class SectionHtmlRouteProvider extends AdminHtmlRouteProvider {
/**
* {@inheritdoc}
*/
public function getRoutes(EntityTypeInterface $entity_type) {
$collection = parent::getRoutes($entity_type);
$entity_type_id = $entity_type->id();
if ($collection_route = $this->getCollectionRoute($entity_type)) {
$collection->add("entity.{$entity_type_id}.collection",
$collection_route);
}
return $collection;
}
/**
* Gets the collection route.
*
* @param \Drupal\Core\Entity\EntityTypeInterface $entity_type
* The entity type.
*
* @return \Symfony\Component\Routing\Route|null
* The generated route, if available.
*/
protected function getCollectionRoute(EntityTypeInterface $entity_type) {
if ($entity_type->hasLinkTemplate('collection') &&
$entity_type->hasListBuilderClass()) {
$entity_type_id = $entity_type->id();
$route = new Route($entity_type->getLinkTemplate('collection'));
$route
->setDefaults([
'_entity_list' => $entity_type_id,
// Make sure this is not a TranslatableMarkup object as the
// TitleResolver translates this string again.
'_title' => (string) $entity_type->getLabel(),
])
->setRequirement('_permission', $entity_type->getAdminPermission())
->setOption('_admin_route', TRUE);
return $route;
}
}
}
Independientemente del método utilizado para declarar las rutas, tendremos que
crear el enlace de menú a la página de administración de esta entidad.
forcontu_entities.[Link]
176 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
forcontu_entities.[Link]
entity.forcontu_entities_section.add_form:
route_name: 'entity.forcontu_entities_section.add_form'
title: 'Add Section'
appears_on:
- entity.forcontu_entities_section.collection
config/schema/forcontu_entities_section.[Link]
forcontu_entities.forcontu_entities_section.*:
type: config_entity
label: 'Section config'
mapping:
id:
type: string
label: 'ID'
label:
type: label
label: 'Label'
uuid:
type: string
urlPattern:
type: string
label: 'URL Pattern'
color:
type: string
label: 'Color'
Ya solo nos queda definir las páginas que permiten gestionar las entidades de tipo
Section. Volvemos a la sección 'handlers' de la definición en annotation de la
entidad, para ver las clases que debemos crear.
src/[Link]
<?php
namespace Drupal\forcontu_entities;
use Drupal\Core\Config\Entity\ConfigEntityListBuilder;
use Drupal\Core\Entity\EntityInterface;
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 177
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
/**
* Provides a listing of Section entities.
*/
class SectionListBuilder extends ConfigEntityListBuilder {
/**
* {@inheritdoc}
*/
public function buildHeader() {
$header['label'] = $this->t('Section');
$header['id'] = $this->t('Machine name');
$header['urlPattern'] = $this->t('URL pattern');
$header['color'] = $this->t('Color');
return $header + parent::buildHeader();
}
/**
* {@inheritdoc}
*/
public function buildRow(EntityInterface $entity) {
$row['label'] = $entity->label();
$row['id'] = $entity->id();
$row['urlPattern'] = $entity->getUrlPattern();
$row['color'] = $entity->getColor();
src/Form/[Link]
<?php
namespace Drupal\forcontu_entities\Form;
use Drupal\Core\Entity\EntityForm;
use Drupal\Core\Form\FormStateInterface;
/**
* Class SectionForm.
*
* @package Drupal\forcontu_entities\Form
*/
class SectionForm extends EntityForm {
/**
* {@inheritdoc}
*/
public function form(array $form, FormStateInterface $form_state) {
$form = parent::form($form, $form_state);
$forcontu_entities_section = $this->entity;
$form['label'] = [
'#type' => 'textfield',
'#title' => $this->t('Label'),
'#maxlength' => 255,
'#default_value' => $forcontu_entities_section->label(),
'#description' => $this->t("Label for the Section."),
'#required' => TRUE,
];
$form['id'] = [
'#type' => 'machine_name',
'#default_value' => $forcontu_entities_section->id(),
'#machine_name' => [
'exists' => '\Drupal\forcontu_entities\Entity\Section::load',
],
178 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$form['urlPattern'] = [
'#type' => 'textfield',
'#title' => $this->t('URL pattern'),
'#maxlength' => 255,
'#default_value' => $forcontu_entities_section->getUrlPattern(),
'#description' => $this->t("URL pattern for the Section."),
'#required' => TRUE,
];
$form['color'] = [
'#type' => 'color',
'#title' => $this->t('Color'),
'#default_value' => $forcontu_entities_section->getColor(),
'#description' => $this->t("Color for the Section."),
'#required' => TRUE,
];
return $form;
}
/**
* {@inheritdoc}
*/
public function save(array $form, FormStateInterface $form_state) {
$forcontu_entities_section = $this->entity;
$status = $forcontu_entities_section->save();
switch ($status) {
case SAVED_NEW:
drupal_set_message($this->t('Created the %label Section.', [
'%label' => $forcontu_entities_section->label(),
]));
break;
default:
drupal_set_message($this->t('Saved the %label Section.', [
'%label' => $forcontu_entities_section->label(),
]));
}
$form_state->setRedirectUrl($forcontu_entities_section-
>toUrl('collection'));
}
}
src/Form/[Link]
<?php
namespace Drupal\forcontu_entities\Form;
use Drupal\Core\Entity\EntityConfirmFormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Url;
/**
* Builds the form to delete Section entities.
*/
class SectionDeleteForm extends EntityConfirmFormBase {
/**
* {@inheritdoc}
*/
public function getQuestion() {
return $this->t('Are you sure you want to delete %name?', ['%name'
=> $this->entity->label()]);
}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 179
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
/**
* {@inheritdoc}
*/
public function getCancelUrl() {
return new Url('entity.forcontu_entities_section.collection');
}
/**
* {@inheritdoc}
*/
public function getConfirmText() {
return $this->t('Delete');
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state) {
$this->entity->delete();
drupal_set_message(
$this->t('content @type: deleted @label.',
[ '@type' => $this->entity->bundle(),
'@label' => $this->entity->label(),
])
);
$form_state->setRedirectUrl($this->getCancelUrl());
}
}
F30.3a
Gestión de entidades
Section
Listado, inicialmente vacío,
se secciones.
Haciendo clic en Add Section, podemos crear una nueva entidad Section [F30.3b]:
F30.3b
Gestión de entidades
Section
Crear (o editar) una
entidad Section.
180 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F30.3c
Gestión de entidades
Section
Listado de secciones.
Para acceder a las entidades creadas, podemos utilizar cualquiera de los métodos
estudiados previamente. Por ejemplo, a través de entityQuery:
$query = \Drupal::entityQuery('forcontu_entities_section');
$sections = $query->execute();
$section_storage =
\Drupal::entityTypeManager()->getStorage('forcontu_entities_section');
foreach($sections as $section_id) {
$section = $section_storage->load($section_id);
};
Enlaces relacionados:
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 181
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
drupal generate:entity:config
$ drupal generate:entity:config
Enter the module name [admin_toolbar]:
> forcontu_console
1 - modules/custom/forcontu_console/config/schema/foo_entity.[Link]
2 - modules/custom/forcontu_console/forcontu_console.[Link]
3 - modules/custom/forcontu_console/forcontu_console.[Link]
4 - modules/custom/forcontu_console/src/Entity/[Link]
5 - modules/custom/forcontu_console/src/Entity/[Link]
6 - modules/custom/forcontu_console/src/[Link]
7 - modules/custom/forcontu_console/src/Form/[Link]
8 - modules/custom/forcontu_console/src/Form/[Link]
9 - modules/custom/forcontu_console/src/[Link]
[Link]
console/content/es/commands/[Link]
Una vez generado el tipo de entidad, el primer archivo que tenemos que analizar
es la declaración de la entidad, y concretamente la parte de annotations
(@ConfigEntityType). Aquí encontraremos las clases y rutas relacionadas con la
entidad creada.
182 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Archivo: src/Entity/[Link]
<?php
namespace Drupal\forcontu_console\Entity;
use Drupal\Core\Config\Entity\ConfigEntityBase;
/**
* Defines the Foo entity entity.
*
* @ConfigEntityType(
* id = "foo_entity",
* label = @Translation("Foo entity"),
* handlers = {
* "list_builder" = "Drupal\forcontu_console\FooEntityListBuilder",
* "form" = {
* "add" = "Drupal\forcontu_console\Form\FooEntityForm",
* "edit" = "Drupal\forcontu_console\Form\FooEntityForm",
* "delete" = "Drupal\forcontu_console\Form\FooEntityDeleteForm"
* },
* "route_provider" = {
* "html" = "Drupal\forcontu_console\FooEntityHtmlRouteProvider",
* },
* },
* config_prefix = "foo_entity",
* admin_permission = "administer site configuration",
* entity_keys = {
* "id" = "id",
* "label" = "label",
* "uuid" = "uuid"
* },
* links = {
* "canonical" = "/admin/structure/foo_entity/{foo_entity}",
* "add-form" = "/admin/structure/foo_entity/add",
* "edit-form" = "/admin/structure/foo_entity/{foo_entity}/edit",
* "delete-form" = "/admin/structure/foo_entity/{foo_entity}/delete",
* "collection" = "/admin/structure/foo_entity"
* }
* )
*/
class FooEntity extends ConfigEntityBase implements FooEntityInterface {
/**
* The Foo entity ID.
*
* @var string
*/
protected $id;
/**
* The Foo entity label.
*
* @var string
*/
protected $label;
Recuerda que solo estamos generando un esqueleto, que debemos completar. Los
cambios mínimos a realizar son:
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 183
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
específicas de la entidad.
Una vez realizados estos cambios, instala el módulo (o actualiza la caché), y accede
a la URL de administración del tipo de entidad:
/admin/structure/foo_entity
184 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Entidades II:
31
Entidades de contenido
Las entidades de contenido se utilizan para crear elementos de
Comparativa D8/D7
contenido. Una de las principales diferencias con respecto a las
entidades de configuración es que tienen campos. Las opciones de Las entidades fueron introducidas en el
Gestionar campos, Gestionar presentación, etc., son comunes en las núcleo de Drupal 7, aunque la mayor parte
entidades de contenido. También son traducibles y, opcionalmente, de la funcionalidad se implementó en el
pueden tener revisiones. módulo contribuido Entity API. En Drupal 8
casi toda esta funcionalidad se ha incluido
en el núcleo y se han añadido también
Algunos ejemplos de entidades de contenido son los nodos, los
muchas mejoras.
comentarios, los términos de taxonomía, los usuarios, los archivos,
los tipos de bloques personalizados, etc.
Una diferencia fundamental es que en
En esta unidad veremos cómo crear entidades de contenido y Drupal 8 para cada entidad se define una
campos. clase específica, que se usará para crear
instancias de esa entidad.
Contenidos de la Unidad
31.1 Entidades de contenido (Content entities)
31.2 Crear un tipo de contenido personalizado
31
31.3 Campos personalizados
31.4 Theming de entidades
31.5 Programación de taxonomías
31.6 Validación de entidades
31.7 Acceso a rutas y operaciones sobre entidades
31.8 Hazlo desde la consola
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 187
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
La entidad tendrá bundles, así que se podrán definir diferentes tipos de mensajes.
Para simplificar, la entidad no será traducible y tampoco se podrán crear revisiones
de los mensajes.
- Leído (is_read). Campo de tipo Booleano. Acepta los valores FALSE (no
leído) y TRUE (leído). Esta propiedad no será rellenable por el usuario.
Vamos a ver, paso a paso, los archivos que intervienen en la creación de la entidad.
Consulta el último apartado de esta unidad para crear la entidad desde Drupal
Console.
En este primer paso vamos a crear la interfaz y la clase que implementa la entidad.
188 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
src/Entity/[Link]
<?php
namespace Drupal\forcontu_entities\Entity;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\Entity\EntityChangedInterface;
use Drupal\user\EntityOwnerInterface;
/**
* Provides an interface for defining Message entities.
*
* @ingroup forcontu_entities
*/
interface MessageInterface extends ContentEntityInterface,
EntityChangedInterface, EntityOwnerInterface {
/**
* Gets the Message type.
*
* @return string
* The Message type.
*/
public function getType();
/**
* Gets the Message subject.
*
* @return string
* Subject of the Message.
*/
public function getSubject();
/**
* Sets the Message subject.
*
* @param string $subject
* The Message subject.
*
* @return \Drupal\forcontu_entities\Entity\MessageInterface
* The called Message entity.
*/
public function setSubject($subject);
/**
* Gets the Message creation timestamp.
*
* @return int
* Creation timestamp of the Message.
*/
public function getCreatedTime();
/**
* Sets the Message creation timestamp.
*
* @param int $timestamp
* The Message creation timestamp.
*
* @return \Drupal\forcontu_entities\Entity\MessageInterface
* The called Message entity.
*/
public function setCreatedTime($timestamp);
/**
* Returns the Message published status indicator.
*
* Unpublished Message are only visible to restricted users.
*
* @return bool
* TRUE if the Message is published.
*/
public function isPublished();
/**
* Sets the published status of a Message.
*
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 189
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
/**
* Gets the To user id.
*
* @return int
* The user id.
*/
public function getUserToId();
/**
* Sets the To user id.
*
* @param int $uid
* To user id.
*
* @return $this
*/
public function setUserToId($uid);
/**
* Gets the To user object.
*
* @return UserInterface
* The user object.
*/
public function getUserTo();
/**
* Sets the To user object.
*
* @param string $account
* The user object.
*
* @return $this
*/
public function setUserTo(UserInterface $account);
/**
* Gets the Content.
*
* @return string
* Message content.
*/
public function getContent();
/**
* Sets the message's content.
*
* @param string $content
* Message's content.
*
* @return $this
*/
public function setContent($content);
/**
* Returns the Message read indicator.
*
* @return bool
*/
public function isRead();
/**
* Sets the read status of a Message.
*
* @param bool $read
* TRUE to set this Message to read.
*
* @return $this
*/
public function setRead($read);
190 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
La clase tiene una cabecera de comentario con formato annotation, que define las
propiedades de la entidad dentro de la directiva @ContentEntityType.
src/Entity/[Link] (Annotation)
<?php
namespace Drupal\forcontu_entities\Entity;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Entity\EntityChangedTrait;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\user\UserInterface;
/**
* Defines the Message entity.
*
* @ingroup forcontu_entities
*
* @ContentEntityType(
* id = "forcontu_entities_message",
* label = @Translation("Message"),
* bundle_label = @Translation("Message type"),
* handlers = {
* "view_builder" = "Drupal\Core\Entity\EntityViewBuilder",
* "list_builder" = "Drupal\forcontu_entities\MessageListBuilder",
* "views_data" = "Drupal\forcontu_entities\Entity\MessageViewsData",
*
* "form" = {
* "default" = "Drupal\forcontu_entities\Form\MessageForm",
* "add" = "Drupal\forcontu_entities\Form\MessageForm",
* "edit" = "Drupal\forcontu_entities\Form\MessageForm",
* "delete" = "Drupal\forcontu_entities\Form\MessageDeleteForm",
* },
* "access" = "Drupal\forcontu_entities\MessageAccessControlHandler",
* "route_provider" = {
* "html" = "Drupal\forcontu_entities\MessageHtmlRouteProvider",
* },
* },
* base_table = "forcontu_entities_message",
* admin_permission = "administer message entities",
* entity_keys = {
* "id" = "id",
* "bundle" = "type",
* "label" = "subject",
* "uuid" = "uuid",
* "uid" = "user_id",
* "langcode" = "langcode",
* "status" = "status",
* },
* links = {
* "canonical" =
"/admin/structure/forcontu_entities_message/{forcontu_entities_message}",
* "add-page" = "/admin/structure/forcontu_entities_message/add",
* "add-form" =
"/admin/structure/forcontu_entities_message/add/{forcontu_entities_message_type}",
* "edit-form" =
"/admin/structure/forcontu_entities_message/{forcontu_entities_message}/edit",
* "delete-form" =
"/admin/structure/forcontu_entities_message/{forcontu_entities_message}/delete",
* "collection" = "/admin/structure/forcontu_entities_message",
* },
* bundle_entity_type = "forcontu_entities_message_type",
* field_ui_base_route = "entity.forcontu_entities_message_type.edit_form"
* )
*/
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 191
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
- Dentro de entity_keys:
o 'bundle' = 'type'. El nombre interno del bundle será type, por
lo que crearemos tipos de mensajes. Es similar a los tipos de
contenido, donde el bundle también se identifica como type.
o 'label' = 'subject'. La etiqueta de cada mensaje se
corresponderá con el campo 'subject' (asunto del mensaje). Este
es el único cambio que hemos hecho en este archivo tras
generarlo con Drupal Console.
src/Entity/[Link] (class)
use EntityChangedTrait;
/**
* {@inheritdoc}
*/
public static function preCreate(EntityStorageInterface
$storage_controller, array &$values) {
parent::preCreate($storage_controller, $values);
$values += array(
'user_id' => \Drupal::currentUser()->id(),
);
}
192 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
// ...
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 193
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
src/Entity/[Link] (campos)
$fields['user_id'] = BaseFieldDefinition::create('entity_reference')
->setLabel(t('Authored by'))
->setDescription(t('The user ID of author of the Message entity.'))
->setRevisionable(TRUE)
->setSetting('target_type', 'user')
->setSetting('handler', 'default')
->setTranslatable(TRUE)
->setDisplayOptions('view', array(
'label' => 'hidden',
'type' => 'author',
'weight' => 0,
))
->setDisplayOptions('form', array(
'type' => 'entity_reference_autocomplete',
'weight' => 5,
'settings' => array(
'match_operator' => 'CONTAINS',
'size' => '60',
'autocomplete_type' => 'tags',
'placeholder' => '',
),
))
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['user_to'] = BaseFieldDefinition::create('entity_reference')
->setLabel(t('To'))
->setDescription(t('The user ID of the Message recipient.'))
->setRevisionable(TRUE)
->setSetting('target_type', 'user')
->setSetting('handler', 'default')
->setTranslatable(TRUE)
->setDisplayOptions('view', array(
'label' => 'To',
'type' => 'author',
'weight' => 0,
))
->setDisplayOptions('form', array(
'type' => 'entity_reference_autocomplete',
'weight' => 5,
'settings' => array(
'match_operator' => 'CONTAINS',
'size' => '60',
'autocomplete_type' => 'tags',
'placeholder' => '',
),
))
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['subject'] = BaseFieldDefinition::create('string')
->setLabel(t('Subject'))
->setDescription(t('The subject of the Message entity.'))
->setSettings(array(
'max_length' => 100,
'text_processing' => 0,
))
->setDefaultValue('')
->setDisplayOptions('view', array(
'label' => 'above',
'type' => 'string',
'weight' => -4,
))
->setDisplayOptions('form', array(
'type' => 'string_textfield',
'weight' => -4,
))
194 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
->setDisplayConfigurable('form', TRUE)
->setDisplayConfigurable('view', TRUE);
$fields['content'] = BaseFieldDefinition::create('text_long')
->setLabel(t('Content'))
->setDescription(t('The content of the Message'))
->setTranslatable(TRUE)
->setDisplayOptions('view', array(
'label' => 'hidden',
'type' => 'text_default',
'weight' => 0,
))
->setDisplayConfigurable('view', TRUE)
->setDisplayOptions('form', array(
'type' => 'text_textfield',
'weight' => 0,
))
->setDisplayConfigurable('form', TRUE);
$fields['is_read'] = BaseFieldDefinition::create('boolean')
->setLabel(t('Read'))
->setDescription(t('A boolean indicating whether the Message is read.'))
->setDefaultValue(FALSE);
$fields['status'] = BaseFieldDefinition::create('boolean')
->setLabel(t('Publishing status'))
->setDescription(t('A boolean indicating whether the Message is
published.'))
->setDefaultValue(TRUE);
$fields['created'] = BaseFieldDefinition::create('created')
->setLabel(t('Created'))
->setDescription(t('The time that the entity was created.'));
$fields['changed'] = BaseFieldDefinition::create('changed')
->setLabel(t('Changed'))
->setDescription(t('The time that the entity was last edited.'));
return $fields;
}
}
Nota: Hay que tener cuidado con los nombres que asignamos a los campos,
especialmente si estamos trabajando en inglés. Estos nombres serán los nombres
de las columnas en la tabla base, y las consultas generadas sobre la tabla pueden
generar errores si utilizamos nombres reservados de MySQL. Consulta esta tabla
con todas las palabras reservadas:
[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 195
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
field-definitions
Ya hablamos de los dos posibles métodos, rutas estáticas y rutas dinámicas. Aquí
volvemos a utilizar el método generado por Drupal Console.
"route_provider" = {
"html" = "Drupal\forcontu_entities\MessageHtmlRouteProvider",
- forcontu_entities.[Link]
- forcontu_entities.[Link]
- forcontu_entities.[Link]
Ahora toca definir las páginas que permiten gestionar las entidades de tipo
Message. Volvemos a la sección 'handlers' de la definición en annotation de la
entidad, para ver las clases que debemos crear.
En la tabla hemos añadido los campos From, To, Subject (reutilizando Name) y
Created. Para recuperar los valores utilizamos los métodos definidos en la clase
Message. El método label() es un método heredado que devuelve la etiqueta de la
196 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
src/[Link]
<?php
namespace Drupal\forcontu_entities;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityListBuilder;
use Drupal\Core\Routing\LinkGeneratorTrait;
use Drupal\Core\Url;
use Drupal\Core\Datetime\DateFormatterInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\EntityStorageInterface;
/**
* Defines a class to build a listing of Message entities.
*
* @ingroup forcontu_entities
*/
class MessageListBuilder extends EntityListBuilder {
use LinkGeneratorTrait;
protected $dateFormatter;
$this->dateFormatter = $date_formatter;
}
/**
* {@inheritdoc}
*/
public static function createInstance(ContainerInterface $container,
EntityTypeInterface $entity_type) {
return new static(
$entity_type,
$container->get('entity_type.manager')->getStorage($entity_type-
>id()),
$container->get('[Link]')
);
}
/**
* {@inheritdoc}
*/
public function buildHeader() {
$header['id'] = $this->t('Message ID');
$header['from'] = $this->t('From');
$header['to'] = $this->t('To');
$header['subject'] = $this->t('Subject');
$header['created'] = $this->t('Created');
/**
* {@inheritdoc}
*/
public function buildRow(EntityInterface $entity) {
/* @var $entity \Drupal\forcontu_entities\Entity\Message */
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 197
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$row['id'] = $entity->id();
$row['from'] = $entity->getOwner()->getAccountName();
$row['to'] = $entity->getUserTo()->getAccountName();
$row['subject'] = $this->l(
$entity->label(),
new Url(
'entity.forcontu_entities_message.edit_form', array(
'forcontu_entities_message' => $entity->id(),
)
)
);
$row['created'] = $this->dateFormatter->format($entity-
>getCreatedTime(), 'short');
return $row + parent::buildRow($entity);
}
}
Bundles
198 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Permisos
Los permisos que se utilizarán para las diferentes operaciones sobre los mensajes,
se declaran en el archivo forcontu_entities.[Link]:
forcontu_entities.[Link]
Theming
- templates/[Link].
Plantilla para mostrar el listado de mensajes.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 199
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
<?php
/**
* Implements hook_theme().
*/
function forcontu_entities_theme() {
$theme = [];
$theme['forcontu_entities_message'] = array(
'render element' => 'elements',
'file' => 'forcontu_entities_message.[Link]',
'template' => 'forcontu_entities_message',
);
$theme['forcontu_entities_message_content_add_list'] = [
'render element' => 'content',
'variables' => ['content' => NULL],
'file' => 'forcontu_entities_message.[Link]',
];
return $theme;
}
/**
* Implements hook_theme_suggestions_HOOK().
*/
function forcontu_entities_theme_suggestions_forcontu_entities_message(array
$variables) {
$suggestions = array();
$entity = $variables['elements']['#forcontu_entities_message'];
$sanitized_view_mode = strtr($variables['elements']['#view_mode'], '.',
'_');
Si, como en nuestro caso, el módulo ya había sido instalado antes de finalizar la
implementación de la nueva entidad, la tabla de la entidad no se habrá creado.
200 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F31.1a
Crear tipos de
mensajes
Desde Message Type
podemos crear nuevos
tipos de mensajes o
bundles.
Crear mensajes
F31.1b
Crear mensajes
Desde Message List
podemos añadir nuevos
mensajes.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 201
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F31.1c
Listado de mensajes
Listado de mensajes y
operaciones.
Tabla base
Los datos se almacenan en la tabla base [F31.1d], ya que todos los campos han
sido definidos como base fields. Los campos adicionales que añadamos a los tipos
de mensajes a través de Administrar campos, o desde programación, se
almacenarán en tablas adicionales.
F31.1d
Tabla base
Tabla donde se almacenan
las entidades creadas.
Nuestra implementación tiene total integración con vistas, sin necesidad de añadir
código adicional.
F31.1e
Vistas
Vista Mis Mensajes.
202 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F31.1f
Vistas
Configuración de la vista
Mis mensajes.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 203
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Archivo: forcontu_entities/config/install/[Link]
Se trata del archivo principal, donde se declara el tipo de contenido y su
configuración por defecto. En el siguiente ejemplo, generado con Drupal Console,
hemos creado el tipo de contenido News (news). Del archivo generado,
recomendamos modificar, al menos, los siguientes parámetros:
langcode: en
status: true
dependencies:
module:
- menu_ui
enforced:
module:
- forcontu_entities
third_party_settings:
menu_ui:
available_menus:
- main
parent: 'main:'
name: News
type: news
description: 'News content type'
help: ''
new_revision: false
preview_mode: 1
display_submitted: true
204 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link].*:
type: config_entity
label: 'Content type'
mapping:
name:
type: label
label: 'Name'
type:
type: string
label: 'Machine-readable name'
description:
type: text
label: 'Description'
help:
type: text
label: 'Explanation or submission guidelines'
new_revision:
type: boolean
label: 'Whether a new revision should be created by default'
preview_mode:
type: integer
label: 'Preview before submitting'
display_submitted:
type: boolean
label: 'Display setting for author and date Submitted by post
information'
config_entity:
type: mapping
mapping:
uuid:
type: string
label: 'UUID'
langcode:
type: string
label: 'Language code'
status:
type: boolean
label: 'Status'
dependencies:
type: config_dependencies
label: 'Dependencies'
third_party_settings:
type: sequence
label: 'Third party settings'
sequence:
type: '[%parent.%parent.%type].third_party.[%key]'
_core:
type: _core_config_info
dependencies:
module:
- menu_ui
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 205
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
third_party_settings:
menu_ui:
available_menus:
- main
parent: 'main:'
[Link].*.third_party.menu_ui:
type: mapping
label: 'Per-content type menu settings'
mapping:
available_menus:
type: sequence
label: 'Available menus'
sequence:
type: string
label: 'Menu machine name'
parent:
type: string
label: 'Parent'
...
dependencies:
module:
- menu_ui
enforced:
module:
- forcontu_entities
Campos adicionales
Archivo: forcontu_entities/config/install/[Link]
Añade un campo Body. Los campos añadidos por esta vía no son campos base, y
se pueden configurar (e incluso eliminar) desde la interfaz. Es por ello que, en los
tipos de contenido, el campo Cuerpo (body) es un campo opcional, mientras que
el campo Título es obligatorio (Título sí es un campo base).
langcode: en
status: true
dependencies:
config:
- [Link]
- [Link]
module:
- text
206 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
id: [Link]
field_name: body
entity_type: node
bundle: news
label: Body
description: ''
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings:
display_summary: true
field_type: text_with_summary
field_config_base:
type: config_entity
mapping:
id:
type: string
label: 'ID'
field_name:
type: string
label: 'Field name'
entity_type:
type: string
label: 'Entity type'
bundle:
type: string
label: 'Bundle'
label:
type: label
label: 'Label'
description:
type: text
label: 'Help text'
required:
type: boolean
label: 'Required field'
translatable:
type: boolean
label: 'Translatable'
default_value:
type: sequence
label: 'Default values'
sequence:
type: [Link].[%parent.%parent.field_type]
label: 'Default value'
default_value_callback:
type: string
label: 'Default value callback'
settings:
type: field.field_settings.[%parent.field_type]
field_type:
type: string
label: 'Field type'
/core/modules/text/config/schema/[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 207
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
type: field.field_settings.[%parent.field_type]
field.field_settings.text_with_summary:
type: mapping
label: 'Text (formatted, long, with summary) settings'
mapping:
display_summary:
type: boolean
label: 'Summary input'
Archivo:
forcontu_entities/config/install/core.entity_view_display.[Link]
langcode: en
status: true
dependencies:
config:
- [Link]
- [Link]
module:
- text
- user
id: [Link]
targetEntityType: node
bundle: news
mode: default
content:
body:
label: hidden
type: text_default
weight: 101
settings: { }
third_party_settings: { }
links:
weight: 100
hidden: { }
Archivo:
forcontu_entities/config/install/core.entity_view_display.[Link]
langcode: en
status: true
dependencies:
config:
208 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
- core.entity_view_mode.[Link]
- [Link]
- [Link]
module:
- text
- user
id: [Link]
targetEntityType: node
bundle: news
mode: teaser
content:
body:
label: hidden
type: text_summary_or_trimmed
weight: 101
settings:
trim_length: 600
third_party_settings: { }
links:
weight: 100
hidden: { }
Archivo:
config/install/core.entity_form_display.[Link]
langcode: en
status: true
dependencies:
config:
- [Link]
- [Link]
module:
- path
- text
id: [Link]
targetEntityType: node
bundle: news
mode: default
content:
body:
type: text_textarea_with_summary
weight: 31
settings:
rows: 9
summary_rows: 3
placeholder: ''
third_party_settings: { }
created:
type: datetime_timestamp
weight: 10
settings: { }
third_party_settings: { }
path:
type: path
weight: 30
settings: { }
third_party_settings: { }
promote:
type: boolean_checkbox
settings:
display_label: true
weight: 15
third_party_settings: { }
sticky:
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 209
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
type: boolean_checkbox
settings:
display_label: true
weight: 16
third_party_settings: { }
title:
type: string_textfield
weight: -5
settings:
size: 60
placeholder: ''
third_party_settings: { }
uid:
type: entity_reference_autocomplete
weight: 5
settings:
match_operator: CONTAINS
size: 60
placeholder: ''
third_party_settings: { }
hidden: { }
Referencias en el núcleo
- [Link]
- [Link].*.yml
- core.entity_form_display.[Link]
- core.entity_view_display.[Link]
- block_content.[Link]
- [Link].block_content.[Link]
- core.entity_form_display.block_content.[Link]
- core.entity_view_display.block_content.[Link]
210 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
fieldformatters
@FieldType
El tipo de campo se define con un plugin de tipo @FieldType. Se trata de una clase
que extiende a FieldItemBase, y que se ubica en /src/Plugin/Field/FieldType. Si un
módulo implementa varios tipos de campos, cada clase se ubicará en un archivo
independiente, pero todos dentro de la misma carpeta.
[Link]
ss/FieldItemBase/8
Archivo: /forcontu_entities/src/Plugin/Field/FieldType/[Link]
<?php
namespace Drupal\forcontu_entities\Plugin\Field\FieldType;
use Drupal\Core\Field\FieldItemBase;
use Drupal\Core\Field\FieldStorageDefinitionInterface;
use Drupal\Core\TypedData\DataDefinition;
/**
* Plugin implementation of the 'forcontu_entities_color' field type.
*
* @FieldType(
* id = "forcontu_entities_color",
* label = @Translation("Forcontu Color"),
* module = "forcontu_entities",
* description = @Translation("Field to store an RGB color."),
* default_widget = "forcontu_entities_text",
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 211
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
* default_formatter = "forcontu_entities_simple_text"
* )
*/
class ColorItem extends FieldItemBase {
/**
* {@inheritdoc}
*/
public static function schema(FieldStorageDefinitionInterface
$field_definition) {
return array(
'columns' => array(
'value' => array(
'type' => 'text',
'size' => 'tiny',
'not null' => FALSE,
),
),
);
}
/**
* {@inheritdoc}
*/
public function isEmpty() {
$value = $this->get('value')->getValue();
return $value === NULL || $value === '';
}
/**
* {@inheritdoc}
*/
public static function
propertyDefinitions(FieldStorageDefinitionInterface $field_definition)
{
$properties['value'] = DataDefinition::create('string')
->setLabel(t('Hex value'));
return $properties;
}
}
- label. Etiqueta del campo. Es el nombre del campo que se mostrará desde
administración.
212 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
FieldItemInterface::schema()
Devuelve el esquema del campo, que se utilizará para crear la tabla en la base de
datos. El único valor obligatorio que debemos proporcionar son las columnas que
tendrá la tabla (columns). Opcionalmente podemos añadir claves únicas, índices y
claves ajenas.
[Link]
p/function/FieldItemInterface::schema/8
Nota: los campos computados pueden no requerir la creación de una tabla, ya que
no necesitan almacenar el valor del campo. En este tipo de campos, el valor se
obtiene en tiempo de ejecución, bien calculándolo, o bien obteniéndolo desde otras
fuentes, pero sin almacenarlo. En estos casos, el método schema() debe devolver
un array vacío.
FieldItemInterface::propertyDefinitions()
Este método debe ser implementado obligatoriamente. Devuelve un array con las
propiedades del campo.
[Link]
p/function/FieldItemInterface::propertyDefinitions/8
TypedData::getConstraints ()
[Link]
function/TypedData::getConstraints/8
Esquema de configuración
Archivo: /forcontu_entities/config/schema/forcontu_entities.[Link]
field.forcontu_entities_color.value:
type: sequence
label: 'Default value'
sequence:
- type: mapping
label: 'Default'
mapping:
value:
type: string
label: 'Value'
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 213
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
@FieldWidget
[Link]
/WidgetBase/8
Archivo: /forcontu_entities/src/Plugin/Field/FieldWidget/[Link]
<?php
namespace Drupal\forcontu_entities\Plugin\Field\FieldWidget;
use Drupal\Core\Field\FieldItemListInterface;
use Drupal\Core\Field\WidgetBase;
use Drupal\Core\Form\FormStateInterface;
/**
* Plugin implementation of the 'forcontu_entities_text' widget.
*
* @FieldWidget(
* id = "forcontu_entities_text",
* module = "forcontu_entities",
* label = @Translation("RGB value as #ffffff"),
* field_types = {
* "forcontu_entities_color"
* }
* )
*/
class TextWidget extends WidgetBase {
/**
* {@inheritdoc}
*/
public function formElement(FieldItemListInterface $items,
$delta, array $element, array &$form,
FormStateInterface $form_state) {
214 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F31.3a
Campo personalizado
Selección del control de
formulario.
@FieldFormatter
[Link]
ass/FormatterBase/8
Archivo:
/forcontu_entities/src/Plugin/Field/FieldFormatter/[Link]
<?php
namespace Drupal\forcontu_entities\Plugin\Field\FieldFormatter;
use Drupal\Core\Field\FormatterBase;
use Drupal\Core\Field\FieldItemListInterface;
/**
* Plugin implementation of the 'forcontu_entities_simple_text' formatter.
*
* @FieldFormatter(
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 215
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
* id = "forcontu_entities_simple_text",
* module = "forcontu_entities",
* label = @Translation("Simple text-based formatter"),
* field_types = {
* "forcontu_entities_color"
* }
* )
*/
class SimpleTextFormatter extends FormatterBase {
/**
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items, $langcode) {
$elements = array();
F31.3b
Campo personalizado
Selección del formateador.
216 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F31.3c
Campo personalizado
Presentación del campo.
Configuración adicional
<?php
return $elements;
}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 217
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$output['formatter_tag'] = [
'#title' => $this->t('HTML tag'),
'#type' => 'select',
'#options' => [
'p' => $this->t('p'),
'div' => $this->t('div'),
'span' => $this->t('span'),
],
'#default_value' => $this->getSetting('formatter_tag'),
];
return $output;
}
$formatter_tag = $this->getSetting('formatter_tag');
return $summary;
}
}
F31.3d
Configuración del
plugin
Resumen de la
configuración actual del
plugin.
F31.3e
Configuración del
plugin
Formulario de
configuración del plugin.
218 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
En el apartado 31.1 vimos cómo crear plantillas relacionadas con las entidades.
En este apartado vamos a ver algunos hooks relacionados con la presentación de
entidades.
hook_entity_view()
[Link]
n/hook_entity_view/8
[Link]
on/comment_entity_view/8
hook_ENTITY_TYPE_view()
[Link]
n/hook_ENTITY_TYPE_view/8
hook_entity_view_alter()
[Link]
n/hook_entity_view_alter/8
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 219
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
hook_ENTITY_TYPE_view_alter()
[Link]
n/hook_ENTITY_TYPE_view_alter/8
220 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Crear vocabularios
Archivo: /config/install/[Link].nombre_vocabulario.yml
langcode: en
status: true
dependencies: { }
name: Tags
vid: tags
description: 'Use tags to group articles on similar topics into
categories.'
hierarchy: 0
weight: 0
/core/modules/taxonomy/config/schema/[Link]
[Link]
hp/class/Vocabulary/8
use Drupal\taxonomy\Entity\Vocabulary;
// ...
Vocabulary::create([
'vid' => 'tags',
'name' => 'Tags',
])->save();
Crear términos
Los términos también son una entidad y se pueden crear con los métodos create()
y save() de la clase Term:
[Link]
ss/Term/8
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 221
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
<?php
/**
* Implements hook_install().
*/
function forum_install() {
// ...
// Create a default forum so forum posts can be created.
$term = Term::create(array(
'name' => t('General discussion'),
'description' => '',
'parent' => array(0),
'vid' => 'forums',
'forum_container' => 0,
));
$term->save();
}
Archivo: core/profiles/standard/config/install/[Link].field_tags.yml
langcode: en
status: true
dependencies:
module:
- node
- taxonomy
id: node.field_tags
field_name: field_tags
entity_type: node
type: entity_reference
settings:
target_type: taxonomy_term
module: core
locked: false
cardinality: -1
translatable: true
indexes: { }
persist_with_no_fields: false
custom_storage: false
Archivo:
/core/profiles/standard/config/install/[Link].field_tags.yml
langcode: en
status: true
dependencies:
config:
- [Link].field_tags
- [Link]
- [Link]
id: [Link].field_tags
222 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
field_name: field_tags
entity_type: node
bundle: article
label: Tags
description: 'Enter a comma-separated list. For example:
Amsterdam, Mexico City, "Cleveland, Ohio"'
required: false
translatable: true
default_value: { }
default_value_callback: ''
settings:
handler: 'default:taxonomy_term'
handler_settings:
target_bundles:
tags: tags
sort:
field: _none
auto_create: true
field_type: entity_reference
$term_storage = \Drupal::entityManager->getStorage('taxonomy_term');
$term = $term_storage->load($tid);
$query = \Drupal::entityQuery('taxonomy_term');
$query->condition('vid', "tags");
$tids = $query->execute();
$term_storage = \Drupal::entityManager->getStorage('taxonomy_term');
$terms = $term_storage->loadMultiple($tids);
$term_storage = \Drupal::entityManager()->getStorage('taxonomy_term');
$tree = $term_storage->loadTree('tags');
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 223
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Constraints (restricciones)
/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint
/vendor/symfony/validator/Constraints/
También puedes encontrar otras constraints en los módulos, tanto del núcleo como
contribuidos (busca @Constraint para localizar todas las disponibles).
LengthConstraint
/core/lib/Drupal/Core/Validation/Plugin/Validation/Constraint/[Link]
<?php
namespace Drupal\Core\Validation\Plugin\Validation\Constraint;
use Symfony\Component\Validator\Constraints\Length;
/**
* Length constraint.
*
* Overrides the symfony constraint to use Drupal-style replacement patterns.
*
224 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
* @Constraint(
* id = "Length",
* label = @Translation("Length", context = "Validation"),
* type = { "string" }
* )
*/
class LengthConstraint extends Length {
/**
* {@inheritdoc}
*/
public function validatedBy() {
return '\Symfony\Component\Validator\Constraints\LengthValidator';
}
}
Esta clase sobrescribe a la clase Length de Symfony, que está disponible en:
/vendor/symfony/validator/Constraints/[Link]
/vendor/symfony/validator/Constraints/[Link]
Validación de entidades
/core/modules/comment/src/Plugin/Validation/Constraint/
Constraint: [Link]
Validador: [Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 225
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
- El nombre del autor del comentario debe coincidir con el autor del
comentario.
<?php
namespace Drupal\comment\Plugin\Validation\Constraint;
use Drupal\Core\Entity\Plugin\Validation\Constraint\CompositeConstraintBase;
/**
* Supports validating comment author names.
*
* @Constraint(
* id = "CommentName",
* label = @Translation("Comment author name", context = "Validation"),
* type = "entity:comment"
* )
*/
class CommentNameConstraint extends CompositeConstraintBase {
/**
* Message shown when an anonymous user comments using a registered name.
*
* @var string
*/
public $messageNameTaken = 'The name you used (%name) belongs to a
registered user.';
//...
public function coversFields() {
return ['name', 'uid'];
}
}
<?php
protected $context;
226 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
[Link]/interface/ExecutionContextInterface/8
Para cada violación (buildViolation), se indica el mensaje que se debe mostrar (en
el ejemplo anterior, $constraint->messageNameTaken). También se pueden añadir
otros parámetros como la propiedad o campo donde se produce la violación
(atPath). Por último, se añade la violación al contexto con addViolation().
[Link]
[Link]/interface/ConstraintViolationBuilderInterface/8
/core/modules/comment/src/Entity/[Link]
/**
* Defines the comment entity class.
*
* @ContentEntityType(
* id = "comment",
* ...
* constraints = {
* "CommentName" = {}
* }
* )
*/
Las llaves vacías indican que la constraint no requiere parámetros. Esta definición
será suficiente para que, cuando se guarde una entidad de tipo Comment (creación
o edición), se compruebe primero si se cumple la constraint.
hook_entity_type_alter(array &$entity_types)
[Link]
n/hook_entity_type_alter/8
/**
* Implements hook_entity_type_alter().
*/
function forcontu_entities_entity_type_alter(array &$entity_types) {
$node_definition = $entity_types['node'];
$node_definition->addConstraint('ConstraintName', ['options']);
}
Método validate()
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 227
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$violations = $entity->validate();
Validación de campos
/core/modules/file/src/Plugin/Field/FieldType/[Link]
/**
* Plugin implementation of the 'file' field type.
*
* @FieldType(
* id = "file",
* label = @Translation("File"),
* ...
* constraints = {"ReferenceAccess" = {}, "FileValidation" = {}}
* )
*/
/core/modules/file/src/Plugin/Validation/Constraint/
Constraint: [Link]
Validador: [Link]
Las constraints asociadas a un tipo de campo también se pueden añadir dentro del
método propertyDefinitions():
return $properties;
}
TypedData::getConstraints ()
228 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
function/TypedData::getConstraints/8
/core/modules/telephone/src/Plugin/Field/FieldType/[Link]
$max_length = 256;
$constraints[] = $constraint_manager->create('ComplexData',
array(
'value' => array(
'Length' => array(
'max' => $max_length,
'maxMessage' => t('%name: the telephone number may not
be longer than @max characters.', array('%name' => $this-
>getFieldDefinition()->getLabel(), '@max' => $max_length)),
)
),
));
return $constraints;
}
$fields['mail'] = BaseFieldDefinition::create('email')
->setLabel(t('Email'))
->setDescription(t('The email of this user.'))
->setDefaultValue('')
->addConstraint('UserMailUnique')
->addConstraint('UserMailRequired')
->addConstraint('ProtectedUserField');
$fields['age'] = BaseFieldDefinition::create('integer')
->setLabel(t('Age'))
->setDescription(t('The age of this user.'))
->setDefaultValue('')
->addPropertyConstraints('value', [
'Range' => [
'min' => 0,
'max' => 17,
]
]);
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 229
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$fields['name'] = BaseFieldDefinition::create('string')
->setLabel(t('Name'))
->setPropertyConstraints('value', [
'Length' => [
'max' => 32
]
]);
return $fields;
}
Por ejemplo, si queremos añadir una restricción al campo title de los nodos,
implementaremos hook_entity_base_field_info_alter():
[Link]
n/hook_entity_base_field_info_alter/8
/**
* Implements hook_entity_base_field_info_alter().
*/
function forcontu_entities_entity_base_field_info_alter(&$fields,
\Drupal\Core\Entity\EntityTypeInterface $entity_type) {
Método validate()
$violations = $entity->field_text->validate();
Más información:
230 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link].edit_form:
path: '/comment/{comment}/edit'
defaults:
_title: 'Edit'
_entity_form: '[Link]'
requirements:
_entity_access: '[Link]'
comment: \d+
[Link].delete_form:
path: '/comment/{comment}/delete'
defaults:
_title: 'Delete'
_entity_form: '[Link]'
requirements:
_entity_access: '[Link]'
comment: \d+
comment: \d+
[Link]
hp/function/EntityAccessCheck::access/8
if ($entity->access('delete')) {
}
if ($entity->access('update')) {
}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 231
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
drupal generate:entity:content
$ drupal generate:entity:content
// generate:entity:config
1 - modules/custom/forcontu_console/forcontu_console.[Link]
2 - modules/custom/forcontu_console/forcontu_console.[Link]
3 - modules/custom/forcontu_console/forcontu_console.[Link]
4 - modules/custom/forcontu_console/forcontu_console.[Link]
5 - modules/custom/forcontu_console/src/[Link]
6 - modules/custom/forcontu_console/src/[Link]
7 - modules/custom/forcontu_console/src/Entity/[Link]
8 - modules/custom/forcontu_console/src/Entity/[Link]
9 - modules/custom/forcontu_console/src/[Link]
10 - modules/custom/forcontu_console/src/Entity/[Link]
11 - modules/custom/forcontu_console/src/[Link]
12 - modules/custom/forcontu_console/src/Form/[Link]
13 - modules/custom/forcontu_console/src/Form/[Link]
14 - modules/custom/forcontu_console/src/Form/[Link]
15 - modules/custom/forcontu_console/bar_entity.[Link]
16 - modules/custom/forcontu_console/templates/bar_entity.[Link]
232 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
17 - modules/custom/forcontu_console/src/Form/[Link]
18 - modules/custom/forcontu_console/src/Form/[Link]
19 - modules/custom/forcontu_console/src/Form/[Link]
20 - modules/custom/forcontu_console/src/[Link]
21 - modules/custom/forcontu_console/src/[Link]
22 - modules/custom/forcontu_console/src/Controller/[Link]
23 - modules/custom/forcontu_console/templates/[Link]
24 - modules/custom/forcontu_console/forcontu_console.module
25 - modules/custom/forcontu_console/forcontu_console.module
26 - modules/custom/forcontu_console/config/schema/bar_entity_type.[Link]
27 - modules/custom/forcontu_console/forcontu_console.[Link]
28 - modules/custom/forcontu_console/forcontu_console.[Link]
29 - modules/custom/forcontu_console/src/Entity/[Link]
30 - modules/custom/forcontu_console/src/Entity/[Link]
31 - modules/custom/forcontu_console/src/[Link]
32 - modules/custom/forcontu_console/src/Form/[Link]
33 - modules/custom/forcontu_console/src/Form/[Link]
34 - modules/custom/forcontu_console/src/[Link]
[Link]
console/content/es/commands/[Link]
drupal generate:entity:bundle
$ drupal generate:entity:bundle
1 - modules/custom/forcontu_console/config/install/core.entity_form_display.[Link]
2 - modules/custom/forcontu_console/config/install/core.entity_view_display.[Link]
3 - modules/custom/forcontu_console/config/install/core.entity_view_display.[Link]
4 - modules/custom/forcontu_console/config/install/[Link]
5 - modules/custom/forcontu_console/config/install/[Link]
[Link]
console/content/es/commands/[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 233
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
drupal generate:plugin:field
Genera un nuevo tipo de campo completo, incluyendo los plugins de tipo de campo,
control (widget) y formateador (formatter).
$ drupal generate:plugin:field
// generate:plugin:fieldtype
// generate:plugin:fieldwidget
// generate:plugin:fieldformatter
// cache:rebuild
1 - modules/custom/forcontu_console/src/Plugin/Field/FieldType/[Link]
2 - modules/custom/forcontu_console/src/Plugin/Field/FieldWidget/[Link]
3 - modules/custom/forcontu_console/src/Plugin/Field/FieldFormatter/[Link]
[Link]
console/content/es/commands/[Link]
234 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
drupal generate:plugin:fieldtype
[Link]
console/content/es/commands/[Link]
drupal generate:plugin:fieldwidget
[Link]
console/content/es/commands/[Link]
drupal generate:plugin:fieldformatter
[Link]
console/content/es/commands/[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 235
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
32
Contenidos de la Unidad
32.1 Administración de formatos de texto y filtros
32.2 Crear un filtro personalizado
32.3 Crear un formato de texto
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 239
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
En Drupal los filtros se aplican haciendo uso de los formatos de texto. Al indicar
que un texto tendrá un formato de texto determinado, estamos estableciendo un
conjunto de reglas de transformación que se aplicarán al texto antes de mostrarlo
en el sitio web. Es importante tener en cuenta que los filtros se aplican en el
momento de generar la presentación del sitio (cargar la página en el navegador),
pero internamente la base de datos almacena en todo momento el texto original
introducido por el usuario, sin aplicarle ningún tipo de transformación.
Los formatos de texto son, por tanto, un conjunto de filtros que se aplicarán al
texto de forma ordenada. El correcto orden de los filtros será fundamental para
obtener el texto resultante deseado.
Inicialmente Drupal integra cuatro formatos de texto: Basic HTML (HTML básico),
Restricted HTML (HTML restringido), Full HTML (HTML completo) y Plain text (texto
plano).
240 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Para ver y configurar los formatos de texto disponibles en el sitio debemos acceder
a [F32.1a]:
URL Formatos de texto
Administración Configuración Autoría del contenido /admin/config/content/
Formato y editores de texto formats
F32.1a
Formatos de texto
Por defecto Drupal cuenta
con los formatos de texto
Filtered HTML, Full
HTML y Plain text.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 241
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F32.1b
Configuración de
formatos de texto
Para cada formato de texto
podemos especificar los
filtros que se aplicarán y
los roles que podrán hacer
uso de él.
F32.1c
Formatos de texto.
Configurar filtros
Algunos filtros tienen
opciones de configuración
adicionales.
242 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
En Drupal 8, los filtros son un tipo de plugin (@Filter) que extienden a la clase
FilterBase (que implementa la interfaz FilterInterface).
[Link]
s/FilterBase/8
[Link]
/interface/FilterInterface/8
<?php
namespace Drupal\forcontu_filters\Plugin\Filter;
use Drupal\filter\FilterProcessResult;
use Drupal\filter\Plugin\FilterBase;
/**
* Provides a filter to replace words from a black list.
*
* @Filter(
* id = "filter_black_list",
* title = @Translation("Black list filter"),
* description = @Translation("Replaces all words from a black list"),
* type = Drupal\filter\Plugin\FilterInterface::TYPE_TRANSFORM_IRREVERSIBLE
* )
*/
class FilterBlackList extends FilterBase {
/**
* {@inheritdoc}
*/
public function process($text, $langcode) {
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 243
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
- status. Estado por defecto cuando se crean nuevas instancias del filtro.
Por ejemplo, cuando se crea un nuevo formato de texto. El valor por
defecto es FALSE, de forma que estará desactivado inicialmente.
- weight. Peso con respecto a otros filtros. El valor por defecto es 0.
- settings. Valores de configuración del filtro por defecto.
FilterInterface::process($text, $langcode)
[Link]
/function/FilterInterface::process/8
244 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F32.2a
Activar el filtro
Activaremos el filtro en el
formato de texto HTML
Completo.
F32.2b
Texto filtrado
Ejemplo de texto filtrado.
- Hemos modificado el método process() para que lea la lista negra desde
la variable de configuración.
<?php
namespace Drupal\forcontu_filters\Plugin\Filter;
use Drupal\filter\FilterProcessResult;
use Drupal\filter\Plugin\FilterBase;
use Drupal\Core\Form\FormStateInterface;
/**
* Provides a filter to replace words from a black list.
*
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 245
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
* @Filter(
* id = "filter_black_list",
* title = @Translation("Black list filter"),
* description = @Translation("Replaces all words from a black list"),
* type = Drupal\filter\Plugin\FilterInterface::TYPE_TRANSFORM_IRREVERSIBLE,
* settings = {
* "black_list" = "foo bar",
* }
* )
*/
class FilterBlackList extends FilterBase {
/**
* {@inheritdoc}
*/
public function process($text, $langcode) {
$form['black_list'] = [
'#type' => 'textfield',
'#title' => $this->t('Black list'),
'#default_value' => $this->settings['black_list'],
'#description' => $this->t('A list of words to be banned
(separated by space)'),
];
return $form;
}
}
F32.2c
Configuración del filtro
Formulario de
configuración adicional del
filtro.
Enlaces de interés:
246 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Para ver cómo se crea un nuevo formato de texto desde un módulo, analizaremos
el código de perfil de instalación Standard, donde se crean los formatos de texto
por defecto (basic_html, full_html y restricted_html).
/config/install/[Link].nombre_formato.yml
/core/modules/filter/config/schema/[Link]
El perfil standard implementa estos archivos para cada uno de los formatos de
texto:
/core/profiles/standard/config/install/[Link].basic_html.yml
/core/profiles/standard/config/install/[Link].full_html.yml
/core/profiles/standard/config/install/[Link].restricted_html.yml
langcode: en
status: true
dependencies:
module:
- editor
name: 'Full HTML'
format: full_html
weight: 1
roles:
- administrator
filters:
filter_align:
id: filter_align
provider: filter
status: true
weight: 8
settings: { }
filter_caption:
id: filter_caption
provider: filter
status: true
weight: 9
settings: { }
filter_htmlcorrector:
id: filter_htmlcorrector
provider: filter
status: true
weight: 10
settings: { }
editor_file_reference:
id: editor_file_reference
provider: editor
status: true
weight: 11
settings: { }
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 247
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Dentro de "filters" se añaden los filtros que estarán activos, con status: true. Si un
filtro tiene configuración específica, podemos añadir también los valores por
defecto.
Los formatos de texto que utilizan el editor WYSIWYG requieren una configuración
adicional, en el archivo:
/config/install/[Link].nombre_formato.yml
Siguiendo el esquema:
/core/modules/ckeditor/config/schema/[Link]
El perfil standard implementa estos archivos para los formatos Full HTML y Basic
HTML:
/core/profiles/standard/config/install/[Link].full_html.yml
/core/profiles/standard/config/install/[Link].basic_html.yml
Como ejemplo, vemos la configuración para el editor en formato Full HTML. Entre
otras opciones, se configuran los iconos que se activarán en el editor.
langcode: en
status: true
dependencies:
config:
- [Link].full_html
module:
- ckeditor
format: full_html
editor: ckeditor
settings:
toolbar:
rows:
-
-
name: Formatting
items:
- Bold
- Italic
- Strike
- Superscript
- Subscript
- '-'
- RemoveFormat
-
name: Linking
items:
- DrupalLink
- DrupalUnlink
-
name: Lists
items:
- BulletedList
- NumberedList
-
name: Media
items:
- Blockquote
248 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
- DrupalImage
- Table
- HorizontalRule
-
name: 'Block Formatting'
items:
- Format
-
name: Tools
items:
- ShowBlocks
- Source
plugins:
stylescombo:
styles: ''
image_upload:
status: true
scheme: public
directory: inline-images
max_size: ''
max_dimensions:
width: 0
height: 0
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 249
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
33 Archivos e imágenes
En esta unidad analizamos las funciones, clases y servicios que nos
Comparativa D8/D7
permiten manipular archivos e imágenes.
Existen muchas similutes entre Drupal 8 y
Drupal 7, pero la nueva API orientada a
Veremos qué son los archivos gestionados y no gestionados y cómo
objetos hace que sea necesario el estudio
trabajar con ellos desde formularios.
de esta unidad en profundidad.
Contenidos de la Unidad
33.1 El sistema de archivos de Drupal
33
33.2 Funciones de archivos
33.3 La entidad File
33.4 Hooks relacionados con archivos
33.5 Formularios con archivos
33.6 Control de permisos sobre archivos
33.7 Presentación de imágenes con estilos
33.8 Efecto de imagen personalizado
33.9 Hazlo desde la consola
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 253
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
En el curso de Experto en Drupal 8 Site Building (Unidad 15), vimos que Drupal
permite almacenar los archivos como públicos o como privados.
Un archivo público tiene una ruta que equivale a la carpeta real donde está
almacenado:
[Link]
Por ello, los archivos públicos son accesibles desde Internet y pueden ser
visualizados o descargados por cualquier usuario si conoce la URL o si están
enlazados desde nuestra web.
[Link]
URIs
Cuando trabajamos con archivos, las rutas se expresan en forma de URI con la
estructura scheme://target, donde schema representa el esquema o ubicación
(public, private, temporary, etc.) y target la ruta relativa al archivo.
- public://[Link]
- public://foo/bar/[Link]
- private://[Link]
/sites/default/files/foo/bar/[Link]
254 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Si queremos tener un control de acceso sobre los archivos del sitio, podemos
indicar una ruta para el sistema privado de archivos, generalmente fuera del
acceso directo desde la web. En Drupal 7, esta ruta se podía configurar desde la
interfaz, pero en Drupal 8 es necesario indicar la ruta en el archivo de configuración
[Link].
La ruta indicada debe ser absoluta y estar fuera del directorio donde has
instalado Drupal (y fuera del acceso directo desde la web). Por ejemplo, si tu
instalación de Drupal está en:
/home/username/public_html
/**
* Private file path:
*
* A local file system path where private files will be stored. This directory
* must be absolute, outside of the the Drupal installation directory and not
* accessible over the web.
*
* Note: Caches need to be cleared when this value is changed to make the
* private:// stream wrapper available to the system.
*
* See [Link] for more information about
* securing private files.
*/
$settings['file_private_path'] = '/home/username/private';
Tras modificar el archivo [Link], vacía la caché del sitio. De esta forma, se
creará la carpeta y el archivo .htaccess que la protege.
El uso de archivos privados proporciona control de acceso a los archivos del sitio,
aunque es menos eficiente que el método público.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 255
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F33.1a
Método predeterminado
de descarga
Selección del método
predeterminado de
descarga.
Siguiendo los mismos pasos también podemos modificar la ubicación original del
sistema público de archivos. Sólo tenemos que activar y modificar la variable
correspondiente en el archivo [Link]:
/**
* Public file path:
*
* A local file system path where public files will be stored. This directory
* must exist and be writable by Drupal. This directory must be relative to
* the Drupal installation directory and be accessible over the web.
*/
$settings['file_public_path'] = 'sites/default/files';
256 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Clase FileSystem
[Link]
leSystem/8
[Link]
p/function/FileSystem::basename/8
[Link]
p/function/FileSystem::uriScheme/8
[Link]
p/function/FileSystem::validScheme/8
[Link]
p/function/FileSystem::dirname/8
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 257
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
<?php
$file_system = \Drupal::service('file_system');
$uri = 'private://foo/bar/[Link]';
//devuelve: 'private://foo/bar'
$directory = $file_system->dirname($uri);
//devuelve: 'private'
$scheme = $file_system->uriScheme($uri);
//devuelve: '[Link]
$filename = $file_system->basename($uri);
[Link]
p/function/FileSystem::mkdir/8
[Link]
p/function/FileSystem::rmdir/8
[Link]
p/function/FileSystem::chmod/8
[Link]
p/function/FileSystem::unlink/8
<?php
$file_system = \Drupal::service('file_system');
258 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
[Link]
ult_scheme/8
[Link]
are_directory/8
[Link]
_directory/8
[Link]
ile_save_upload/8
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 259
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
anaged_save_data/8
[Link]
[Link]
e_multiple/8
[Link]
anaged_delete/8
[Link]
anaged_delete_recursive/8
[Link]
anaged_copy/8
[Link]
anaged_move/8
260 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
ad_max_size/8
[Link]
tory_temp/8
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 261
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
$file_storage = \Drupal::entityTypeManager()->getStorage('file');
[Link]
/FileInterface/8
- uuid. ID único.
- langcode. Idioma.
262 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Servicio [Link]
[Link]
[Link]/class/DatabaseFileUsageBackend/8
$currentUser = \Drupal::currentUser();
$user_storage = \Drupal::entityTypeManager()->getStorage('user');
$user = $user_storage->load($currentUser->id());
$image_id = $user->get('user_picture')->first()->getValue()['target_id'];
$file_storage = \Drupal::entityTypeManager()->getStorage('file');
$image = $file_storage->load($image_id);
$image_uri = $image->getFileUri();
[Link]
[Link]/class/FileItem/8
Obtendremos el valor del campo, y, dentro del valor devuelto, el target_id, que se
corresponde con la entidad de tipo archivo. A partir de ahí podemos cargar el
archivo y utilizar los métodos de la clase File. Por ejemplo, getFileUri() para obtener
la URI del archivo almacenado.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 263
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
- hook_ENTITY_TYPE_load($entities).
- hook_ENTITY_TYPE_create($entity)
- hook_ENTITY_TYPE_presave($entity).
- hook_ENTITY_TYPE_insert($entity).
- hook_ENTITY_TYPE_update($entity).
- hook_ENTITY_TYPE_predelete($entity).
- hook_ENTITY_TYPE_delete($entity).
También podemos implementar estos otros hooks específicos para trabajar con
archivos:
[Link]
nction/hook_file_download/8
- hook_file_mimetype_mapping_alter(&$mapping). Permite
modificar el tipo MIME del archivo.
[Link]
nction/hook_file_mimetype_mapping_alter/8
[Link]
hook_file_copy/8
[Link]
hook_file_move/8
[Link]
nction/hook_file_url_alter/8
264 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
hook_file_validate/8
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 265
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
[Link]/class/File/8
[Link]
[Link]/class/ManagedFile/8
Archivo: /forcontu_files/forcontu_files.[Link]
forcontu_files.unmanaged:
path: '/forcontu/files/unmanaged'
defaults:
_form: '\Drupal\forcontu_files\Form\Unmanaged'
_title: 'Unmanaged file upload'
requirements:
_permission: 'access content'
Archivo: /forcontu_files/src/Form/[Link]
<?php
namespace Drupal\forcontu_files\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
$form['upload'] = array(
'#type' => 'file',
'#title' => $this->t('PDF File'),
'#description' => $this->t('Upload a PDF File.'),
);
266 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$form['actions']['submit'] = array(
'#type' => 'submit',
'#value' => $this->t('Upload file'),
);
return $form;
}
$directory = 'public://unmanaged';
file_prepare_directory($directory, FILE_CREATE_DIRECTORY);
if (file_unmanaged_save_data($form_state->getValue('upload'),
$destination)) {
drupal_set_message($this->t('File Uploaded'));
} else {
drupal_set_message($this->t('Error'));
}
}
}
Archivo: /forcontu_files/forcontu_files.[Link]
forcontu_files.managed:
path: '/forcontu/files/managed'
defaults:
_form: '\Drupal\forcontu_files\Form\Managed'
_title: 'Managed file upload'
requirements:
_permission: 'access content'
Archivo: /forcontu_files/src/Form/[Link]
<?php
namespace Drupal\forcontu_files\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\file\FileUsage\DatabaseFileUsageBackend;
protected $currentUser;
protected $fileUsage;
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 267
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$this->currentUser = $current_user;
$this->fileUsage = $file_usage;
}
$form['upload'] = [
'#title' => $this->t('Upload file'),
'#type' => 'managed_file',
'#upload_location' => 'public://managed',
'#upload_validators' => [
'file_validate_extensions' => ['pdf'],
],
'#required' => TRUE,
];
return $form;
}
$file_storage =
\Drupal::entityTypeManager()->getStorage('file');
foreach($form_state->getValue('upload') as $fid){
$file = $file_storage->load($fid);
El uso del archivo se maneja con el servicio [Link], que hemos inyectado en la
clase de formulario. Como ejemplo, asociamos el archivo con nuestro módulo y con
el usuario actual.
268 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
hook_file_download($uri)
[Link]
ok_file_download/8
La función sólo requiere como entrada el parámetro $uri, con el identificador del
archivo. La función debe devolver:
Archivo: /forcontu_files/forcontu_files.module
/**
* Implements hook_file_download().
*/
function forcontu_files_file_download($uri) {
$file_system = \Drupal::service('file_system');
$directory = $file_system->dirname($uri);
Como se observa en este ejemplo, para evitar que los archivos privados sean
cacheados, se ha añadido la directiva 'Cache-control' => 'private', que avisa al
navegador de que no debe almacenar el archivo en cachés compartidas.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 269
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$build['image'] = [
'#theme' => 'image_style',
'#style_name' => 'thumbnail',
'#uri' => $image_uri,
];
[Link]
lass/ImageStyle/8
$style = \Drupal::entityTypeManager()->getStorage('image_style')-
>load('thumbnail');
$url = $style->buildUrl('public://[Link]');
270 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
{% set test_image = {
'#theme': 'image_style',
'#style_name': 'thumbnail',
'#uri': 'public://images/[Link],
'#alt': 'Some text',
'#attributes': { class: 'foo bar' },
} %}
{{ test_image }}
Como alternativa podemos utilizar el módulo Twig tweak, que añade nuevos
filtros y funciones de Twig:
[Link]
{{ 'public://images/[Link]' | image_style('thumbnail') }}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 271
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
ass/ImageEffectBase/8
[Link]
[Link]/class/DesaturateImageEffect/8
Archivo /core/modules/image/src/Plugin/ImageEffect/[Link]
<?php
namespace Drupal\image\Plugin\ImageEffect;
use Drupal\Core\Image\ImageInterface;
use Drupal\image\ImageEffectBase;
/**
* Desaturates (grayscale) an image resource.
*
* @ImageEffect(
* id = "image_desaturate",
* label = @Translation("Desaturate"),
* description = @Translation("Desaturate converts an image to grayscale.")
* )
*/
class DesaturateImageEffect extends ImageEffectBase {
/**
* {@inheritdoc}
*/
public function applyEffect(ImageInterface $image) {
if (!$image->desaturate()) {
$this->logger->error('Image desaturate failed using the %toolkit
toolkit on %path (%mimetype, %dimensions)', array('%toolkit' => $image-
>getToolkitId(), '%path' => $image->getSource(), '%mimetype' => $image-
>getMimeType(), '%dimensions' => $image->getWidth() . 'x' . $image-
>getHeight()));
return FALSE;
}
return TRUE;
}
}
[Link]
interface/ImageInterface/8
272 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
drupal generate:plugin:imageeffect
$ drupal generate:plugin:imageeffect
// cache:rebuild
1 -
modules/custom/forcontu_console/src/Plugin/ImageEffect/[Link]
[Link]
console/content/es/commands/[Link]
drupal generate:plugin:imageformatter
Genera un plugin de tipo field formatter, pero específico para un campo de imagen.
[Link]
console/content/es/commands/[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 273
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
34 Sistema de búsqueda
El sistema de búsqueda de Drupal estará disponible al activar el
Comparativa D8/D7
módulo Search del núcleo.
En Drupal 8 las búsquedas se
implementan como un nuevo tipo de
Drupal indexa tanto los contenidos como los usuarios del sitio web, plugin.
de forma que las consultas realizadas posteriormente sean más
rápidas y eficaces. El proceso de indexación se realiza
periódicamente, a través del cron del sistema.
- Buscar en nodos.
- Buscar en otros elementos del sitio, implementando
búsquedas personalizadas.
- La búsqueda personalizada puede realizarse directamente
sobre los elementos objeto de búsqueda, o sobre el índice,
en cuyo caso tendremos que implementar la indexación de
estos elementos.
34
Contenidos de la Unidad
34.1 Introducción al sistema de búsqueda
34.2 Búsqueda de nodos
34.3 Página de búsqueda personalizada
34.4 Hazlo desde la consola
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 277
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
El módulo Search
Drupal mantiene un índice de los contenidos del sitio web y la construcción de este
índice es lo que se conoce como indexación. Cuando creamos nuevos contenidos
en el sitio web, estos deben ser indexados (añadidos al índice de búsquedas).
De no ser así, el nuevo contenido no se mostrará en los resultados de las
búsquedas. Igualmente, los nodos modificados tendrán que ser reindexados
para aplicar en el índice los cambios correspondientes.
F34.1a
Progreso de la
indexación
Estado de la indexación.
278 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Para realizar la indexación del sitio se requiere la ejecución del cron del sistema.
La indexación es una tarea que, dependiendo del volumen de contenidos del sitio,
puede consumir bastantes recursos de tiempo y memoria del servidor, por lo que
debe limitarse el número de elementos que se indexarán cada vez que se ejecuta
el cron. Este valor por defecto está fijado a 100 elementos.
Utiliza el botón Volver a indexar el sitio solo cuando necesites rehacer el índice
desde cero. Será necesario ejecutar el cron para realizar la indexación del sitio, ya
sea automática o manualmente. En un sitio en producción el cron debe ejecutarse
automática y periódicamente, para que el sitio indexe con frecuencia el contenido
nuevo creado. En un sitio en desarrollo, sin embargo, es más recomendable
trabajar con la ejecución manual del cron. Consulta los comandos de Drush y
Drupal Console en el apartado 34.5.
F34.1b
Estado de indexación
Tras la ejecución del cron
los elementos ya están
indexados.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 279
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Interfaz de búsqueda:
[Link]
ch/8
280 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
hook_node_update_index()
[Link]
_node_update_index/8
hook_node_update_index(\Drupal\node\NodeInterface $node)
La función recibe como parámetro el nodo que está siendo indexado ($node), y
devuelve una cadena (salida ya renderizada), que será añadida al contenido
indexado.
/**
* Implements hook_node_update_index().
*/
function forcontu_search_node_update_index(\Drupal\node\NodeInterface $node) {
if($node->isPromoted()) {
return 'promocionado';
}
}
F34.2a
Búsqueda sin modificar
Resultado de mostrar la
cadena destacado sin
implementar la
funcionalidad. Como
ningún nodo contiene esta
cadena, el resultado será
vacío.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 281
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F34.2b
Búsqueda de contenido
'promocionado'
Una vez implementada la
función, la búsqueda de
'promocionado' devuelve
los nodos promocionados a
la página principal, aunque
no contengan la cadena
'promocionado' en su
contenido.
282 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
hook_node_search_result()
[Link]
_node_search_result/8
hook_node_search_result(\Drupal\node\NodeInterface $node)
La función recibe como parámetro el nodo que está siendo mostrado en los
resultados de la búsqueda ($node), y debe devolver un array asociativo con
información adicional que será mostrada junto al resultado.
/**
* Implements hook_node_search_result().
*/
function forcontu_search_node_search_result(\Drupal\node\NodeInterface $node) {
if($node->isPromoted()) {
return ['promoted_content' => t('Promoted content')];
}
F34.2c
Resultado con
contenido adicional
El contenido adicional se
muestra junto al autor, la
fecha de actualización del
nodo y el número de
comentarios.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 283
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
{{ title_prefix }}
<h3{{ title_attributes }}>
<a href="{{ url }}">{{ title }}</a>
{% if (info_split.promoted_content) %}
<span class="info-promoted-content">
[{{ info_split.promoted_content }}]
</span>
{% endif %}
</h3>
{{ title_suffix }}
{% if snippet %}
<p{{ content_attributes }}>{{ snippet }}</p>
{% endif %}
{% if info %}
<p>{{ info }}</p>
{% endif %}
F34.2d
Plantilla modificada
Presentación de los
resultados de búsqueda
una vez modificada la
plantilla.
284 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
[Link]/class/SearchPluginBase/8
- \Drupal\search\Plugin\ConfigurableSearchPluginBase. Extiende a la
clase base anterior para añadir opciones de configuración a la búsqueda,
que se podrán editar desde la configuración de búsquedas en el área de
administración.
[Link]
[Link]/class/ConfigurableSearchPluginBase/8
El método execute() debe devolver un array con los resultados, en forma de lista.
Archivo:
/forcontu_search/src/Plugin/Search/[Link]
<?php
namespace Drupal\forcontu_search\Plugin\Search;
use Drupal\search\Plugin\SearchPluginBase;
use Drupal\Core\Database\Connection;
use Drupal\Core\Entity\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Executes a seach on users with role 'client'.
*
* @SearchPlugin(
* id = "forcontu_search_clients_search",
* title = @Translation("Clients search")
* )
*/
class ForcontuSearchClientsSearch extends SearchPluginBase {
protected $database;
protected $entityManager;
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 285
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$configuration,
$plugin_id,
$plugin_definition
);
}
$this->database = $database;
$this->entityManager = $entity_manager;
parent::__construct($configuration, $plugin_id, $plugin_definition);
}
/**
* Execute the search.
*
* @return array
* A structured list of search results
*/
public function execute() {
$results = [];
if (!$this->isSearchExecutable()) {
return $results;
}
$keys = $this->keywords;
$query = $this->database
->select('users_field_data', 'ufd')
->extend('Drupal\Core\Database\Query\PagerSelectExtender');
$query->fields('ufd', ['uid']);
$query->condition('default_langcode', 1);
$query->condition('name', '%' . $keys . '%', 'LIKE')
->condition('status', 1);
$uids = $query
->limit(3)
->execute()
->fetchCol();
$accounts = $this->entityManager->getStorage('user')->loadMultiple($uids);
return $results;
}
}
286 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Además del plugin, tenemos que definir la configuración inicial, que incluye la ruta.
Nótese que la ruta empezará por /search/. Nuestra página de búsqueda tendrá la
ruta /search/clients:
Archivo:
/forcontu_search/config/install/[Link].forcontu_search_clients_search.yml
langcode: en
status: true
dependencies:
module:
- forcontu_search
id: forcontu_search_clients_search
label: Clients
path: clients
weight: 1
plugin: forcontu_search_clients_search
configuration: { }
Para probar la búsqueda, crea el rol Client (client) y asígnaselo a varios usuarios.
Modifica también los nombres de los usuarios para que parte del nombre coindicida
(por ejemplo, añadiendo la cadena foo). Como hemos establecido el paginador a
3, crea al menos 4 usuarios que cumplan con las condiciones de la búsqueda.
F34.3a
Búsqueda
Resultados de la
búsqueda.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 287
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F34.3b
Listado de páginas de
búsqueda
Páginas de búsqueda
disponibles.
F34.3c
Configuración de
búsqueda
Configurar la página de
búsqueda.
Por ejemplo, podemos crear una búsqueda de usuarios por rol, donde podamos
configurar el rol o roles a buscar. Esto nos permitiría separar en diferentes páginas
las búsquedas de usuarios registrados, editores, clientes, etc.
288 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Para los otros métodos que utiliza el plugin, disponemos de una implementación
por defecto en la clase base, así que solo los tendremos que añadir si queremos
realizar alguna modificación. Algunos de estos métodos son:
/core/modules/search/tests/modules/search_extra_type
[Link]
[Link]/interface/SearchIndexingInterface/8
[Link]
[Link]/class/NodeSearch/8
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 289
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
drush search-status
drush search-status
$ drush search-status
There are 5 items out of 31 still to be indexed.
[Link]
drush search-index
drush search-index
drush search-index
83.87 complete. Remaining items to be indexed: 5 [ok]
The search index has been built. [ok]
[Link]
drush search-reindex
drush search-reindex
$ drush search-reindex
The search index must be fully rebuilt before any new items can be
indexed.
Do you really want to continue? (y/n): y
The search index will be rebuilt.
[ok]
$ drush search-status
There are 31 items out of 31 still to be indexed.
290 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$ drush search-status
There are 0 items out of 31 still to be indexed.
[Link]
drush core-cron
drush core-cron
drush cron
$ drush core-cron
Cron run successful. [success]
[Link]
drupal cron:execute
drupal cron:execute
drush cre
$ drupal cron:execute
// cache:rebuild
Rebuilding cache(s), wait a moment please.
[OK] Done clearing cache(s).
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 291
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
// cache:rebuild
Rebuilding cache(s), wait a moment please.
[OK] Done clearing cache(s).
[Link]
[Link]
drupal cron:debug
drupal cron:debug
$ drupal cron:debug
[Link]
[Link]
drupal cron:release
drupal cron:release
drupal crr
$ drupal cron:release
Cron lock was released successfully
// cache:rebuild
Rebuilding cache(s), wait a moment please.
[OK] Done clearing cache(s).
[Link]
[Link]
292 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
35 Traducción de módulos
Todo el texto que se incluye dentro del código de los módulos, y que
Comparativa D8/D7
conocemos como texto de interfaz, debe estar preparado para ser
traducido. De esta forma podremos implementar sitios en Drupal Aunque la función t() sigue estando
completamente multilingües. No importa si nuestro sitio solo va a disponible, la utilizaremos únicamente
estar en un idioma. Si aplicamos siempre esta regla, evitaremos cuando no exista una alternativa basada
problemas futuros. en POO.
Los archivos de traducción .po y .pot son
El texto de interfaz se escribe en inglés, y luego se añade la iguales que los utilizados en Drupal 7. Las
traducción correspondiente al idioma o idiomas en que estemos herramientas que podemos utilizar para
trabajando. traducir, como el software PoEdit, también
son comunes a ambas versiones de
Drupal.
En esta unidad vamos a ver las diferentes fórmulas que existen para
que los textos de la interfaz sean traducibles.
35
Contenidos de la Unidad
35.1 Traducción de la interfaz
35.2 Archivos de traducción
35.3 Traducción de cadenas fuera del código PHP
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 295
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Todo el texto que se incluye dentro del código de los módulos, y que conocemos
como texto de interfaz, debe estar preparado para ser traducido. De esta forma
podremos implementar sitios en Drupal completamente multilingües. No importa si
nuestro sitio solo va a estar en un idioma. Si aplicamos siempre esta regla,
evitaremos problemas futuros.
En esta unidad vamos a ver las diferentes fórmulas que existen para que los textos
de la interfaz sean traducibles.
[Link]
La función/método t()
Durante todo el curso hemos utilizado la función o método t() para la traducción
de cadenas. La función t() permite que el sistema pueda traducir las cadenas de
texto al resto de idiomas activos en el sitio.
[Link]
[Link]
[Link]/trait/StringTranslationTrait/8
296 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
<?php
use Drupal\Core\StringTranslation\StringTranslationTrait;
class MyClass {
use StringTranslationTrait;
$this->t('The content has been viewed %count times', ['%count' => $count]);
En este segundo ejemplo, las variables de sustitución van precedidas del símbolo
@ (@op, @name, @colletion).
¿Qué diferencia hay entre usar cadenas de sustitución con % o con @? En realidad,
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 297
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
[Link]/function/FormattableMarkup::placeholderFormat/8
\Drupal\Component\Utility\Html::escape():
[Link]
tion/Html::escape/8
UrlHelper::stripDangerousProtocols()
[Link]
function/UrlHelper::stripDangerousProtocols/8
El método formatPlural()
[Link]
298 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]/function/StringTranslationTrait::formatPlural/8
En las funciones o hooks procedimentales donde no tengamos acceso directo al
trait y no podamos añadirlo, llamaremos al servicio 'string_translation' (clase
TranslationManager), de la siguiente forma:
\Drupal::translation()->formatPlural($statistics['totalcount'],
'1 view', '@count views');
[Link]
[Link]/class/TranslationManager/8
Módulos de traducción
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 299
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Un archivo con extensión .po está constituido por una cabecera con una serie de
metadatos y a continuación las cadenas traducidas. Cada cadena traducida está
compuesta por dos elementos:
msgid "Forms"
msgstr "Formularios"
msgid "delete"
msgstr "eliminar"
msgid "title"
msgstr "título"
Los archivos .po, al igual que otros archivos del módulo, también deben estar
codificados en formato UTF-8 sin BOM.
Los archivos .pot se utilizan como plantilla de los archivos de traducción .po. Su
estructura es similar, pero dejando las cadenas de traducción vacías:
msgid "Forms"
msgstr ""
msgid "delete"
msgstr ""
msgid "title"
msgstr ""
300 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
contact_emails-[Link]
contact_emails-[Link]
contact_storage-[Link]
contact_storage-[Link]
...
[Link]
[Link]
Aquí puedes consultar el estado actual y los problemas que se vayan encontrando
durante la migración del módulo a Drupal 8:
[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 301
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Stats
Archivos Strings Warnings
11 120 0
Hecho
#: modules/custom/forcontu_forms/forcontu_forms.[Link]
modules/custom/forcontu_forms/forcont
u_forms.[Link]
msgid "Forcontu Forms"
msgstr ""
#: modules/custom/forcontu_forms/forcontu_forms.[Link]
msgid "Form API"
msgstr ""
#: modules/custom/forcontu_forms/src/Form/[Link]
msgid "Search"
msgstr "Buscar"
#: modules/custom/forcontu_forms/forcontu_forms.[Link]
msgid "Forcontu Forms Settings"
msgstr "Configuración de Forcontu Forms"
302 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Editor PoEdit
[Link]
Una vez instalado, abriremos el archivo generado .po (o .pot) generado por
Translation template extractor. En la ventana principal de la aplicación se
mostrarán dos columnas, una con el texto original y otra con la traducción.
Haciendo clic sobre cada cadena podremos completar la traducción
correspondiente. Una vez añadidas las traducciones, los cambios serán
almacenados directamente en el archivo .po original, que podrá ser utilizado
directamente en la carpeta translations del módulo [F35.2a].
Si abrimos un archivo .pot, la aplicación nos pedirá primero indicar el nombre del
archivo .po que se generará a partir de la plantilla.
F35.2a
Poedit
Poedit es un software que
facilita la edición de
archivos de traducción
(.po).
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 303
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
- forcontu_forms.[Link]
- forcontu_forms.[Link]
Los patrones que podemos utilizar para indicar el patrón de ruta son:
Más información:
[Link]
ce_translation_properties/8
$ drush locale-update
Tablas de traducción
304 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Muchos archivos YAML incluyen propiedades cuyos valores son parte de la interfaz
y que, por tanto, deben ser traducibles. Nosotros no tendremos que especificar
nada especial para que estos textos sean traducibles, simplemente tenemos que
localizarlos en la traducción de interfaz.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 305
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
{% trans %}
Submitted by {{ author_name }} on {{ date }}
{% endtrans %}
{% trans %}
This {{ [Link] }} has a length of: {{ count }}. It contains:
{{ [Link]|placeholder }} and {{ token.bad_text }}.
{% endtrans %}
<div>
{% set count = 1 %}
{% trans %}
Found 1 item.
{% plural count %}
Found {{ count }} items.
{% endtrans %}
</div>
Por defecto, las variables son filtradas con el método escape(), que equivale a
@variable. Si queremos obtener la variable sin filtrar, podemos usar el filtro |raw:
{% trans %}
Escaped: {{ string }}
{% endtrans %}
{% trans %}
Raw: {{ string|raw }}
{% endtrans %}
Traducción en Annotations
/**
* Provides a block to display the page title.
*
* @Block(
* id = "page_title_block",
* admin_label = @Translation("Page title"),
* )
*/
306 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]:
type: config_object
label: 'Webform settings'
mapping:
settings:
type: mapping
label: 'Webform default settings'
mapping:
default_page_base_path:
type: string
label: 'Default base path'
default_form_submit_label:
type: label
label: 'Default webform submit text'
default_form_submit_once:
type: boolean
label: 'Prevent duplicate submissions'
default_form_closed_message:
type: text
label: 'Default webform closed message'
Y los archivos de configuración, los valores que se hayan definido como text, string
o label, también serán traducibles:
settings:
default_page_base_path: form
default_form_closed_message: 'Sorry...This form is closed to new
submissions.'
default_form_exception_message: 'Unable to display this webform.
Please contact the site administrator.'
default_form_submit_label: Submit
default_form_submit_once: false
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 307
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Contenidos de la Unidad
36
36.1 Introducción a JavaScript en Drupal
36.2 Introducción a jQuery
36.3 Librerías jQuery en el núcleo
36.4 Carga condicional de elementos de formulario (#states)
36.5 Ajax en Drupal
36.6 Ajax en formularios
36.7 Autocompletado de elementos
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 311
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
jQuery permite manipular los elementos DOM (Document Object Model, Modelo
de Objetos del Documento), que es una API que da acceso a los objetos que
conforman las páginas HTML y XML. Manipulando estos objetos es posible
modificar el contenido, estructura y estilos de los documentos HTML y XML.
Además, también es posible actuar frente a eventos (al hacer clic o pasar el cursor
sobre un elemento, al pulsar una tecla, al cargar la página, etc.).
En este primer apartado nos centramos en cómo cargar un archivo con código
JavaScript. Crearemos un primero módulo llamado Forcontu jQuery
(forcontu_jquery), donde implementaremos los ejemplos de uso de jQuery.
El archivo JavaScript
(function () {
'use strict';
// Custom javascript
})();
[Link]
Además, siempre debe utilizarse la directiva 'use strict', de forma que se fuerza el uso
de código en modo estricto (por ejemplo, todas las variables tienen que ser declaradas.
312 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
(function ($) {
'use strict';
//jQuery code
})(jQuery);
Vamos a crear un primer ejemplo de código JavaScript. Veremos más sobre cómo
implementar este código jQuery en el próximo apartado. Lo que hace el script es
localizar los elementos HTML con la clase CSS .fadeout (class="fadeout"). Después
de un retardo de 2 segundos (2000), se aplicará la función fadeOut(), que irá
atenuando el elemento hasta hacerlo desaparecer del todo (en 3 segundos).
Archivo: /forcontu_jquery/js/forcontu_jquery_fadeout.js
(function ($) {
'use strict';
$(document).ready(function() {
$(".fadeout").delay(2000).fadeOut(3000);
});
})(jQuery)
Definir la librería JS
En unidades previas hemos visto cómo crear librerías con archivos CSS. Esas
mismas librerías pueden contener también archivos JS, así que el procedimiento
para añadir archivos JS es exactamente el mismo.
Los archivos JS se ubican, generalmente, en la carpeta /js del tema o del módulo,
y se declaran en el archivo .[Link].
foo: F36.1a
version: 1.x
css: Librerías
theme: Definición de librería para
css/[Link]: {} incluir archivos CSS y JS.
js:
js/[Link]: {}
dependencies:
- core/jquery
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 313
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Archivo: /forcontu_jquery/forcontu_jquery.[Link]
forcontu_jquery.fadeout:
js:
js/forcontu_jquery_fadeout.js: {}
dependencies:
- core/jquery
Como ya adelantamos, Drupal 8 solo carga jQuery cuando alguna librería lo solicita.
Lo haremos añadiendo como dependencia el nombre de la librería jQuery
(core/jquery).
Una vez definida la librería, tenemos varias formas de utilizarla. El nombre indicado
es el nombre del módulo más el nombre de la librería (no se especifica el nombre
del archivo JS directamente).
De forma global
Este método solo se puede aplicar en los temas, pero no en los módulos. En el
archivo .[Link] del tema, podemos añadir la directiva libraries para indicar las
librerías que se cargarán en todas las páginas que utilicen el tema:
name: Bartik
type: theme
base theme: classy
description: 'A flexible, ...'
package: Core
libraries:
- bartik/global-styling
$build['foo'] = [
'#markup' => $this->t('Lorem ipsum...'),
'#attached' => [
'library' => [
'forcontu_jquery/forcontu_jquery.bar',
],
],
];
314 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
módulo y el de la librería.
{% block messages %}
{% if message_list is not empty %}
{{ attach_library('bartik/messages') }}
<div class="messages__wrapper layout-container">
{{ parent() }}
</div>
{% endif %}
{% endblock messages %}
Función de preprocesamiento
[Link]
tion/hook_preprocess_HOOK/8
/**
* Implements hook_preprocess_HOOK() for maintenance_page.
*/
function seven_preprocess_maintenance_page(&$variables) {
$variables['#attached']['library'][] = 'seven/maintenance-page';
}
Si queremos limitar las páginas en las que se cargará la librería, podemos hacerlo
también a través de la función de preprocesamiento, pero a nivel de página
hook_preprocess_page(). En este caso tenemos que añadir caché según la ruta,
y comprobar la ruta actual. Por ejemplo:
/**
* Implements hook_preprocess_HOOK() for page.
*/
function forcontu_theming_preprocess_page(&$variables) {
$variables['page']['#cache']['contexts'][] = 'route';
if (\Drupal::routeMatch()->getRouteName() === 'forcontu_theming.render_elements') {
$variables['#attached']['library'][] = 'forcontu_theming/forcontu_theming.css';
}
}
[Link]
tion/hook_page_attachments/8
/**
* Implements hook_page_attachments().
*/
function foo_page_attachments(array &$attachments) {
$attachments['#attached']['library'][] = 'foo/bar';
if (!\Drupal::currentUser()->hasPermission('custom permissions')) {
$attachments['#attached']['library'][] = 'foo/baz';
}
}
Si quieres saber más sobre cómo trabajar con librerías en módulos y temas, puedes
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 315
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
and-javascript-js-to-a-drupal-8-module
Página /forcontu/jquery/fadeout
forcontu_jquery.fadeout:
path: '/forcontu/jquery/fadeout'
defaults:
_controller:
'\Drupal\forcontu_jquery\Controller\ForcontuJqueryController::fade
out'
_title: 'Fade out example'
requirements:
_permission: 'access content'
$build['text'] = [
'#markup' => '<p>' . $this->t('Lorem ipsum dolor sit amet,
consectetur adipiscing elit. Duis tristique enim lorem, quis
imperdiet ante luctus non. Phasellus sapien neque, placerat sed
odio ut, efficitur tincidunt dui.') . '</p>',
];
$build['temp_text'] = [
'#type' => 'html_tag',
'#tag' => 'p',
'#attributes' => [
'class' => 'fadeout',
],
'#value' => $this->t('This text will disappear in 5 seconds...'),
'#attached' => [
'library' => [
'forcontu_jquery/forcontu_jquery.fadeout',
],
],
];
return $build;
}
}
Nota: Recuerda vaciar la caché del sitio cuando realices cambios en rutas, archivos
de plantillas, librerías, etc. También puede ser necesario actualizar la caché del
navegador con Control + F5.
316 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
El resultado será una página con dos párrafos. Uno de ellos tiene asignada la clase
'fadeout', y se irá desvaneciendo hasta desaparecer del todo (display: none)
[F36.1b].
F36.1b
Fade out
Efecto fade out con
jQuery.
F36.1c
Juntar archivos
JavaScript
Permite optimizar los
archivos JavaScript en
sitios en producción.
<script
src="/sites/default/files/js/js_BKcMdIbOMdbTdLn9dkUq3KCJfIKKo2SvKo
[Link]"></script>
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 317
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
<script
src="/sites/default/files/js/js_VhqXmo4azheUjYC30rijnR_Dddo0WjWkF2
[Link]"></script>
<![endif]-->
<script src="/sites/default/files/js/js_LfA-
[Link]"></script>
<script
src="/core/assets/vendor/domready/[Link]?v=1.0.8"></script>
Por defecto, todos los archivos JS se cargan al final del documento (en el pie). Si
necesitamos que se cargue en el encabezado, lo indicaremos en la declaración de
la librería:
js-header:
header: true
js:
[Link]: {}
js-footer:
js:
[Link]: {}
318 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
JavaScript configurable
Archivo .[Link]
cuddly-slider:
version: 1.x
js:
js/[Link]: {}
dependencies:
- core/jquery
- core/drupalSettings
Desde PHP, igual que añadimos la librería con #attached, también podemos pasar
los parámetros al código JavaScript:
$build['#attached']['library'][] = 'example_module/cuddly-slider';
$build['#attached']['drupalSettings']['example_module']['cuddlySli
der']['foo'] = 'bar';
Dentro del archivo JS, se podrá acceder a la variable 'foo' de esta forma:
drupalSettings.example_module.[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 319
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$(document).ready()
[Link]
Como norma general utilizaremos siempre esta estructura antes de añadir el código
jQuery personalizado.
(function ($) {
'use strict';
$(document).ready(function() {
// Código jQuery
});
})(jQuery)
Selección de elementos
[Link]
[Link]
Código jQuery:
320 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Código HTML:
<div id="block1">...</div>
[Link]
Código jQuery:
Código HTML:
[Link]
Código jQuery:
Código HTML:
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 321
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
Código jQuery:
$('input[value="Monday"]').parent().css("color", "red");
Código HTML:
<label>
<input type="radio" name="weekday" value="Monday" />Monday
</label>
<label>
<input type="radio" name="weekday" value="Tuesday" />Tuesday
</label>
<label>
<input type="radio" name="weekday" value="Wednesday" />Wednesday
</label>
322 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
- Todos los elementos ("*"). El selector "*" permite seleccionar todos los
elementos de la página.
[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 323
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
En el siguiente ejemplo seleccionamos los elementos cuya etiqueta sea "tr" (fila),
aplicando los siguientes estilos:
Código jQuery:
$("tr").css("color", "#FFFFFF");
$("tr:even").css("background-color", "red");
$("tr:odd").css("background-color", "green");
$("tr:first").css("background-color", "blue");
Código HTML:
<table border="1">
<tr><td>Row #0 (first)</td></tr>
<tr><td>Row #1</td></tr>
<tr><td>Row #2</td></tr>
<tr><td>Row #3</td></tr>
<tr><td>Row #4</td></tr>
<tr><td>Row #5</td></tr>
</table>
F36.2a
Ejemplo jQuery
Ejemplo de selección de
elementos de una tabla en
función del orden de los
mismos (:even, :odd, :first
y :last)
324 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Modificación de CSS
Una de las acciones que podemos realizar sobre los elementos de la página es
modificar sus atributos CSS. Algunos de los métodos de la API de jQuery para
realizar estas operaciones son:
$("p").css("color", "#000000");
[Link]
[Link]
$("p").addClass("class1 class2");
[Link]
$("p").removeClass("oldclass1 oldclass2");
$("p").removeClass("oldclass1 oldclass2").addClass("class1");
Encontrarás más métodos para trabajar con CSS y atributos en la API de jQuery,
dentro de las categorías CSS y Attributes, respectivamente.
- [Link]
- [Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 325
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Eventos
[Link]
- .keydown(), cuando el usuario presiona una tecla por primera vez. Por
ejemplo, cuando comienza a escribir dentro de un elemento de texto, el
evento se ejecuta sólo una vez, al pulsar la primera tecla.
[Link]
326 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
- .toggle(). Este evento permite realizar una acción diferente cada vez que
se hace clic (comportamiento por defecto) sobre un elemento.
[Link]
En el siguiente ejemplo, cualquier elemento de lista (<li>) cambiará de
color cuando hagamos clic sobre él. Tras el primer clic cambiará a azul, si
hacemos clic nuevamente cambiará a rojo y, con un tercer clic, a verde.
A partir de ahí el ciclo se repite.
$("li").toggle(
function () {
$(this).css("color", "blue");
},
function () {
$(this).css("color", "red");
},
function () {
$(this).css("color", "green");
}
);
Efectos
[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 327
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
opacidad).
[Link]
[Link]
Código jQuery:
$(document).ready(function(){
$("#ocultar").click(function(event){
[Link]();
$('#box1').fadeOut(2000);
});
$("#mostrar").click(function(event){
[Link]();
$("#box1").slideDown(3000);
});
});
Código HTML:
F36.2c
Efectos con jQuery
Ejemplo de efectos con
jQuery.
328 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Accordion
Permite formatear los elementos de una página como un acordeón, de forma que
cuando se despliega un elemento, el resto de elementos se pliegan.
[Link]
forcontu_jquery.accordion:
js:
js/forcontu_jquery_accordion.js: {}
dependencies:
- core/[Link]
Posteriormente añadimos el archivo .js, con la configuración particular que hace uso
del plugin en los elementos de la página (js/forcontu_jquery_accordion.js). El
acordeón se activará para el elemento con id="accordion".
(function ($) {
'use strict';
$(document).ready(function() {
$("#accordion").accordion();
});
})(jQuery)
Por último, definimos una página donde usaremos el efecto acordeón. Dentro del
archivo de routing hemos definido la ruta forcontu_jquery.accordion con URL
/forcontu/jquery/accordion. Como ejemplo hemos añadido un contenido
estático:
//...
public function accordion() {
$build['content'] = [
'#markup' => '
<div id="accordion">
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 329
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
return $build;
F36.3a
Ejemplo: Accordion
Ejemplo de uso de la
librería Accordion. Al hacer
clic sobre uno de los títulos,
se desplegará el contenido
y se plegarán el resto de
elementos.
Otras librerías
330 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Efectos
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 331
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Traducción de cadenas
Sabemos que la función t() permite que las cadenas introducidas en el código sean
traducibles a través de la traducción de la interfaz. Pues bien, también podemos
incluir cadenas traducibles en el código JavaScript, a través de la función
Drupal.t().
$("#block1").append(Drupal.t('Advanced search'));
332 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Propiedad #states
[
STATE1 => CONDITIONS_ARRAY1,
STATE2 => CONDITIONS_ARRAY2,
…
]
Cada clave (STATE1, STATE2, etc.) es un estado (visible, checked, etc.). Cada array
de condiciones tiene una estructura en forma de clave/valor, donde la clave es un
selector jQuery que hace referencia a otro elemento del formulario, al que
llamaremos elemento remoto. El valor es un array con las condiciones que debe
cumplir ese elemento remoto para que se aplique el estado al elemento principal.
[
'visible' => [
JQUERY_SELECTOR => REMOTE_CONDITIONS,
JQUERY_SELECTOR => REMOTE_CONDITIONS,
]
]
$form['item1'] = [
'#type' => 'textfield',
'#states' => [
'visible' => [
':input[name="checkbox1"]' => ['checked' => TRUE],
],
],
];
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 333
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Si un estado tiene varias condiciones, se deben cumplir todas las condiciones para
que se produzca el cambio de estado. Si queremos que solo se cumpla una de
ellas, podemos usar el operador 'or', de la siguiente forma:
$form['group'] = [
'#type' => 'container',
'#states' => [
'visible' => [
[':input[name="confirmation_type"]' => ['value' => 'page']],
'or',
[':input[name="confirmation_type"]' => ['value' => 'inline']],
],
],
];
Estados
La condición value se debe usar para comprobar si una opción de una lista (select,
botones de radio, etc.) ha sido seleccionada.
Archivo forcontu_forms/forcontu_forms.[Link]
forcontu_forms.states:
path: '/forcontu/forms/states'
defaults:
_form: '\Drupal\forcontu_forms\Form\States'
334 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Archivo forcontu_forms/src/Form/[Link]
<?php
namespace Drupal\forcontu_forms\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
$form['title'] = [
'#type' => 'textfield',
'#title' => $this->t('Title'),
'#required' => TRUE,
'#default_value' => '',
];
$form['unlock_options'] = [
'#type' => 'checkbox',
'#title' => $this->t('Check to unlock more options'),
];
$form['options'] = [
'#type' => 'container',
'#states' => [
'visible' => [
':input[name="unlock_options"]' => ['checked' => TRUE],
],
],
];
$form['options']['color'] = [
'#type' => 'select',
'#title' => $this->t('Color'),
'#options' => [
'none' => $this->t('None'),
'black' => $this->t('Black'),
'red' => $this->t('Red'),
'blue' => $this->t('Blue'),
'other' => $this->t('Other color'),
],
'#description' => $this->t('Choose a color.'),
];
$form['options']['color_name'] = [
'#type' => 'textfield',
'#size' => 50,
'#title' => $this->t('Color name'),
'#description' => $this->t('Write the color name'),
'#states' => [
'visible' => [
':input[name="color"]' => ['value' => 'other'],
],
'required' => [
':input[name="color"]' => ['value' => 'other'],
],
],
];
// ...
return $form;
}
// ...
}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 335
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F36.4a
Estados
Ejemplo de cambios de
estado en un formularo.
F36.4b
Estados
Ejemplo de cambios de
estado en un formularo.
F36.4c
Estados
Ejemplo de cambios de
estado en un formularo.
336 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Drupal behaviors
Hasta ahora hemos utilizado el método .ready() para comprobar que la página ha
sido cargada y empezar a ejecutar nuestro código.
(function ($) {
'use strict';
$(document).ready(function() {
// Código jQuery
});
})(jQuery)
Este método puede traer consigo un problema asociado: como el código sólo se
ejecuta al cargar la página, no se aplicará a los nuevos elementos que se puedan
añadir más adelante, de forma dinámica. Este problema es especialmente relevante
cuando utilizamos Ajax, ya que es común solicitar nuevos datos al servidor.
Veamos un ejemplo muy sencillo. El siguiente código jQuery añade la clase CSS
"red-text" a todas las etiquetas <p>. Previamente hemos definido la clase en un
archivo .css (.red-text { color: red; }).
Todas las acciones definidas en el evento .ready() se ejecutan tan pronto esté
construida la estructura del DOM. En primer lugar, añadimos la clase a todas las
etiquetas <p>, pero esta acción sólo afectará a las etiquetas definidas en el DOM.
Por eso, cuando posteriormente añadimos código HTML adicional con el
método .append(), este contenido no recibirá la clase que sí han recibido el resto
de párrafos preexistentes.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 337
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Código jQuery:
(function($){
'use strict';
$(document).ready(function(){
//Añade la clase "red-text" a todas las etiquetas <p>
$("p").addClass("red-text");
Código HTML:
<div id="maintext">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce
tellus purus, hendrerit nec porta id, commodo sed sem.</p>
</div>
Resultado:
Código jQuery:
(function($){
'use strict';
[Link] = {
attach: function (context, settings) {
$("p", context).addClass("red-text");
}
};
$(document).ready(function(){
//Añade un nuevo párrafo. Esta etiqueta <p> no recibe la nueva clase
$("#maintext").append("<p>Vivamus ut velit nisi, id ultricies
sem. Pellentesque tincidunt commodo neque et egestas.<p>");
338 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]();
});
})(jQuery);
Código HTML:
<div id="maintext">
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce
tellus purus, hendrerit nec porta id, commodo sed sem.</p>
</div>
(function ($) {
'use strict';
[Link] = {
attach: function (context, settings) {
// Cuando se añade el contenido a la página
},
detach: function (context, settings) {
// Cuando se elimina el contenido de la página (opcional)
},
};
})(jQuery);
- [Link]
- [Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 339
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
340 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Ajax en enlaces
Es posible utilizar Ajax a partir de un enlace, de forma que al hacer click sobre este,
se ejecute una función vía Ajax, que obtiene información del servidor. La
información obtenida, que en este ejemplo será la hora del servidor, se mostrará
en el elemento HTML indicado, sin recargar la página completa.
Archivo: forcontu_ajax/forcontu_ajax.[Link]
forcontu_ajax.link:
path: '/forcontu/ajax/link'
defaults:
_controller:
'\Drupal\forcontu_ajax\Controller\ForcontuAjaxController::link'
_title: 'Ajax link example'
requirements:
_permission: 'access content'
forcontu_ajax.link_callback:
path: '/forcontu/ajax/link-callback'
defaults:
_controller:
'\Drupal\forcontu_ajax\Controller\ForcontuAjaxController::linkCallback'
_title: 'Ajax link example callback'
requirements:
_permission: 'access content'
Archivo: forcontu_ajax/src/Controller/[Link]
<?php
namespace Drupal\forcontu_ajax\Controller;
use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\Url;
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\ReplaceCommand;
$build['text'] = [
'#markup' => '<p>' . $this->t('Click the link to get the
updated time from server.') . '</p>',
];
$build['time'] = [
'#type' => 'html_tag',
'#tag' => 'div',
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 341
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$build['refresh_time'] = [
'#title' => $this->t('Refresh time'),
'#type' => 'link',
'#url' => Url::fromRoute('forcontu_ajax.link_callback'),
'#attributes' => [
'class' => 'use-ajax',
],
];
return $build;
}
[Link]
ss/AjaxResponse/8
[Link]
/class/ReplaceCommand/8
342 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F36.5a
Ejemplo: Ajax con
enlace
Ejemplo de uso de Ajax a
través de un enlace con la
clase 'use-ajax'.
Comandos de Ajax
/core/lib/Drupal/Core/Ajax/*[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 343
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Para este apartado hemos añadido al módulo Forcontu Ajax el ejemplo AjaxDemo
incluido en fapi_example, del módulo Examples for Developers.
Nota: Aunque aquí hemos utilizado listas estáticas, definidas en la clase del
formulario, podríamos obtener esta información desde términos de taxonomía.
F36.6a
Ejemplo: Ajax en
formularios
Las listas de selección son
dependientes, de forma que
la segunda cargará un
conjunto de elementos,
obtenidos del servidor, en
función de la selección
realizada en la primera
lista.
Comenzamos creando la ruta donde mostraremos el formulario. En este caso no
será necesario registrar una ruta para realizar la llamada Ajax, como sí hacíamos
al incluir Ajax en un enlace.
Archivo: /forcontu_ajax/forcontu_ajax.[Link]
forcontu_ajax.form:
path: '/forcontu/ajax/form'
defaults:
_form: '\Drupal\forcontu_ajax\Form\AjaxForm'
_title: 'Ajax Form Example'
requirements:
_permission: 'access content'
Archivo: /forcontu_ajax/src/Form/[Link]
<?php
namespace Drupal\forcontu_ajax\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
private $colors = [
344 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
'warm' => [
'red' => 'Red',
'orange' => 'Orange',
'yellow' => 'Yellow',
],
'cool' => [
'blue' => 'Blue',
'purple' => 'Purple',
'green' => 'Green',
],
];
$form['temperature'] = [
'#title' => $this->t('Temperature'),
'#type' => 'select',
'#options' => ['warm' => 'Warm', 'cool' => 'Cool'],
'#empty_option' => $this->t('-select'),
'#ajax' => [
'callback' => '::colorCallback',
'wrapper' => 'color-wrapper',
],
];
$form['color_wrapper'] = [
'#type' => 'container',
'#attributes' => ['id' => 'color-wrapper'],
];
$form['actions'] = [
'#type' => 'actions',
];
$form['actions']['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Submit'),
];
return $form;
}
$form['color_wrapper']['color'] = [
'#type' => 'select',
'#title' => $this->t('Color'),
'#options' => $this->colors[$temperature],
];
return $form['color_wrapper'];
}
}
}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 345
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$form['temperature'] = [
'#title' => $this->t('Temperature'),
'#type' => 'select',
'#options' => ['warm' => 'Warm', 'cool' => 'Cool'],
'#empty_option' => $this->t('-select'),
'#ajax' => [
'callback' => '::colorCallback',
'wrapper' => 'color-wrapper',
],
];
$form['color_wrapper'] = [
'#type' => 'container',
'#attributes' => ['id' => 'color-wrapper'],
];
Veremos más adelante otros atributos que podemos utilizar en la propiedad #ajax.
La propiedad '#ajax'.
[Link]
La propiedad '#ajax' es un array que puede tener los siguientes valores (todos son
opcionales):
[Link]
allback
346 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 347
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Definimos dos rutas, una para el formulario, y otra para devolver el resultado de
autocompletado:
forcontu_ajax.form_autocomplete:
path: '/forcontu/ajax/form/autocomplete'
defaults:
_form: '\Drupal\forcontu_ajax\Form\AutocompleteForm'
_title: 'Autocomplete Form Example'
requirements:
_permission: 'access content'
forcontu_ajax.user_autocomplete:
path: '/forcontu/ajax/user_autocomplete'
defaults:
_controller:
'\Drupal\forcontu_ajax\Controller\ForcontuAjaxAutocompleteControll
er::userAutocomplete'
_title: 'User autocomplete'
requirements:
_permission: 'access content'
<?php
namespace Drupal\forcontu_ajax\Form;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
$form['user'] = array(
'#type' => 'textfield',
'#title' => 'Username',
'#autocomplete_route_name' => 'forcontu_ajax.user_autocomplete',
);
//...
return $form;
}
348 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
<?php
namespace Drupal\forcontu_ajax\Controller;
use Drupal\Core\Controller\ControllerBase;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
$string = $request->query->get('q');
F36.7a
Autocompletar
Elemento de tipo textfield
con autocompletar.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 349
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Elemento entity_autocomplete
[Link]
[Link]/class/EntityAutocomplete/8
$form['selected_node'] = [
'#type' => 'entity_autocomplete',
'#title' => 'Select a content',
'#target_type' => 'node',
'#selection_handler' => 'default',
'#selection_settings' => [
'target_bundles' => ['article', 'page'],
],
];
F36.7a
entity_autocomplete
Elemento de autocompletar
de entidades.
$form['tags'] = [
'#type' => 'entity_autocomplete',
'#target_type' => 'taxonomy_term',
'#autocreate' => [
'bundle' => 'tags',
],
];
350 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
37 Programación de actualizaciones
Una vez que un módulo ha sido puesto en producción o contribuido
Comparativa D8/D7
con la comunidad, nos vemos en la obligación de actualizarlo sin la
posibilidad de reinstalarlo desde cero. Esto implica que cada nueva Aunque la estructura de las funciones de
versión del módulo debe incluir el código correspondiente para que actualización son similares, la forma de
se actualice la base de datos sin afectar a los contenidos creados en acceder y modificar los elementos
el sitio web. concretos a actualizar se realiza a través
de la API y la POO de Drupal 8.
Contenidos de la Unidad
37
37.1 Funciones de actualización
37.2 Actualización de entidades y campos
37.3 Actualización de configuración
37.4 Actualizacón de la base de datos
37.5 Hazlo desde la consola
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 353
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Al generar una nueva versión de un módulo, tenemos que tener en cuenta que ya
puede estar siendo usado por otros usuarios, o por nosotros mismos en un sitio en
producción. Esto implica que la nueva versión debe incluir el código
correspondiente para que se actualice la base de datos sin afectar a los contenidos
creados en el sitio web.
Función hook_update_N()
[Link]
unction/hook_update_N/8
354 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
function example_module_update_8101() {
//Primera actualización para la versión 8.x-1.x del módulo
}
function example_module_update_8102() {
//Segunda actualización para la versión 8.x-1.x del módulo
}
function example_module_update_8201() {
//Primera actualización para la versión 8.x-2.x del módulo
}
Supongamos que se lanza una nueva versión del módulo que incluye, además de
las anteriores, la siguiente función de actualización:
function example_module_update_8202() {
//Segunda actualización para la versión 8.x-2.x del módulo
}
[Link]
unction/hook_update_N/8#sec_notes
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 355
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Actualización de campos
[Link]
[Link]/class/FieldStorageConfig/8
$field_storage_configs = \Drupal::entityTypeManager()-
>getStorage('field_storage_config')->loadByProperties(['type' =>
'foo']);
$new_field_storage = $field_storage->toArray();
$new_field_storage['type'] = 'bar';
$new_field_storage['module'] = 'example_module';
$new_field_storage = FieldStorageConfig::create($new_field_storage);
$new_field_storage->original = $new_field_storage;
$new_field_storage->enforceIsNew(FALSE);
$new_field_storage->save();
}
[Link]
[Link]/class/FieldConfig/8
356 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$fields = \Drupal::entityTypeManager()->getStorage('field_config')-
>loadByProperties(['field_name' => 'field_tags']);
use Drupal\field\Entity\FieldStorageConfig;
use Drupal\field\Entity\FieldConfig;
Actualización de entidades
[Link]
[Link]/class/EntityViewDisplay/8
$properties = [
'targetEntityType' => 'node',
'bundle' => 'article'
];
$view_displays = \Drupal::entityTypeManager()-
>getStorage('entity_view_display')->loadByProperties($properties);
$view_display->setComponent('field_tags', [
'settings' => $settings,
] + $component)->save();
}
}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 357
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
[Link]/class/EntityFormDisplay/8
$properties = [
'targetEntityType' => 'node',
'bundle' => 'article'
];
$form_displays = \Drupal::entityTypeManager()-
>getStorage('entity_form_display')->loadByProperties($properties);
$form_display->setComponent('field_tags', [
'settings' => [
'match_operator' => 'STARTS_WITH',
],
] + $component)->save();
}
Nota: puedes ejecutar los ejemplos anteriores directamente desde ejecutar PHP de
Devel, teniendo en cuenta:
- Comenta la parte del código que realiza el cambio de cada objeto. Aquí lo
más importante es analizar las propiedades disponibles de cada elemento.
358 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Actualización de configuración:
[Link]
drupal-8
[Link]
ass/ConfigFactory/8
[Link]
nfig/8
Para guardar el objeto de configuración (una vez realizados los cambios), usamos
el método:
Config::save($has_trusted_data = FALSE)
$config->save(TRUE);
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 359
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Función de actualización:
function example_update_8001() {
$config_factory = \Drupal::configFactory();
$config = $config_factory->getEditable('[Link]');
$config->set('fruit', ['apple', 'banana', 'mango']);
$config->save(TRUE);
}
[Link]
Nota: Localiza otros ejemplos en los módulos del núcleo buscando las llamadas a
\Drupal::configFactory()->getEditable(
/**
* Removes the [Link] configuration.
*/
function system_update_8002() {
\Drupal::configFactory()->getEditable('[Link]')->delete();
return t('The [Link] configuration has been moved to a
container parameter, see [Link] for more
information.');
}
360 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Por último, vamos a ver cómo implementar actualizaciones cuando se han hecho
cambios en el esquema de la base de datos. Seguiremos estos pasos:
En la clase Schema puedes consultar todos los métodos disponibles para manipular
las tablas y campos de la base de datos (Apartado 20.5):
[Link]
s/Schema/8
$database = \Drupal::database();
$schema = $database->schema();
$spec = [
'description' => 'The title for the link.',
'type' => 'blob',
'size' => 'big',
'not null' => FALSE,
'serialize' => TRUE,
];
$schema->addField('menu_tree', 'title', $spec);
}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 361
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$database = \Drupal::database();
$schema = $database->schema();
$spec = [
'description' => 'Description',
'fields' => [
'bar' => [
'description' => 'Bar field description.',
'type' => 'varchar',
'length' => 255,
'not null' => TRUE,
'default' => '',
],
'baz' => [
'description' => 'Baz field description',
'type' => 'text',
'not null' => TRUE,
],
],
'primary key' => ['bar'],
];
$schema->createTable('foo', $spec);
$database = \Drupal::database();
$schema = $database->schema();
$spec = ['bar'];
362 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
drush updatedb-status
drush updatedb-status
drush updbst
$ drush updatedb-status
Module Update ID Description
Forcontu_entities 8001 8001 -
[Link]
drush updatedb
drush updatedb
drush updb
$ drush updatedb
The following updates are pending:
forcontu_entities module :
8001 -
[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 363
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
drush entity-updates
[Link]
drupal update:debug
drupal update:debug
drupal upd
$ drupal update:debug
[Link]
[Link]
drupal module:update
[Link]
[Link]
364 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
drupal update:execute
// cache:rebuild
Rebuilding cache(s), wait a moment please.
[OK] Done clearing cache(s).
[Link]
[Link]
drupal generate:update
drupal generate:update
$ drupal generate:update
Enter the module name [admin_toolbar]:
> forcontu_console
// cache:rebuild
1 - modules/custom/forcontu_console/forcontu_console.install
[Link]
console/content/es/commands/[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 365
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
<?php
/**
* Implements hook_update_N() on Module forcontu_console Update # 8001.
*/
function forcontu_console_update_8001(&$sandbox) {
drupal_set_message('Module forcontu_console Update # 8001 () was
executed successfully.');
}
366 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
38 Tests automáticos
Los tests automáticos, también denominados pruebas de regresión,
Comparativa D8/D7
se utilizan para comprobar, después de añadir o modificar una
funcionalidad, que el cambio introducido no rompe ninguna Simpletest es un framework propio de
funcionalidad existente con anterioridad. Drupal, también incluido en versiones
anteriores. PHPUnit es un framework
externo a Drupal, así que se puede utilizar
Podemos encontrar dos tipos de tests automáticos:
con cualquier versión, aunque es en
Drupal 8 cuando se ha incorporado a la
- Tests unitarios. Realizan comprobaciones a nivel de clases, distribución (como componente externo).
para asegurar que sus métodos funcionan correctamente.
38
Contenidos de la Unidad
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 369
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Drupal cuenta con dos frameworks diferentes para programar tests automáticos,
PHPUnit, que es una librería externa, y un framework propio denominado
Simpletest.
- Los tests unitarios sobre clases que no requieren la carga del entorno
Drupal, los programaremos en PHPUnit.
Enlaces relacionados:
Automated tests:
[Link]
PHPUnit in Drupal 8:
[Link]
370 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Para que los tests sean ejecutables, tenemos que activar el módulo Testing del
núcleo. Una vez activado, podremos ejecutar los tests desde la interfaz de
administración o desde la consola. Veremos ambos métodos en este apartado.
Módulo Testing
El módulo Testing incluido en el núcleo permite ejecutar los tests, tanto desde la
interfaz como desde consola. Una vez instalado, podemos acceder a la
configuración del módulo desde:
F38.2a
Testing
Ejecución de tests desde la
interfaz con el módulo
Testing.
Seleccina el módulo a probar y haz clic en Ejecutar pruebas. Cada prueba puede
tener varios pasos, que serán comprobados uno a uno, mostrándose el resultado
detallado del test [F38.2b].
El módulo Testing permite ejecutar todos los tipos de tests definidos, tanto de
Simpletest como de PHPUnit.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 371
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F38.2b
Testing
Resultado detallado de los
tests ejecutados.
$ php core/scripts/[Link]
Test summary
------------
Drupal\Tests\block\Kernel\BlockStorageUnitTest 2 passes
Test run duration: 6 sec
[Link]
Aunque el comando anterior ejecuta todos los tipos de tests, también podemos
usar el comando específico de PHPUnit:
[Link]
372 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
mymodule/tests/src/Unit
[Link]
UnitTestCase/8
- /mymodule/tests/src/Unit/[Link]
Dentro del mismo Test, cada caso o prueba a realizar, se programará en un método
independiente, sin argumentos, cuyo nombre empieza por test. Por ejempo:
testUserBlock().
/vendor/phpunit/phpunit/src/Framework/[Link]
[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 373
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Ejemplo: JsonTest
namespace Drupal\Component\Serialization;
/**
* Default serialization for JSON.
*
* @ingroup third_party
*/
class Json implements SerializationInterface {
/**
* {@inheritdoc}
*
* Uses HTML-safe strings, with several characters escaped.
*/
public static function encode($variable) {
// Encode <, >, ', &, and ".
return json_encode($variable, JSON_HEX_TAG | JSON_HEX_APOS |
JSON_HEX_AMP | JSON_HEX_QUOT);
}
/**
* {@inheritdoc}
*/
public static function decode($string) {
return json_decode($string, TRUE);
}
/**
* {@inheritdoc}
*/
public static function getFileExtension() {
return 'json';
}
}
La clase Json permite codificar una cadena a Json (método encode()), y viceversa
(método decode()).
namespace Drupal\Tests\Component\Serialization;
use Drupal\Component\Serialization\Json;
use Drupal\Tests\UnitTestCase;
/**
* @coversDefaultClass \Drupal\Component\Serialization\Json
* @group Serialization
*/
class JsonTest extends UnitTestCase {
/**
* A test string with the full ASCII table.
*
* @var string
374 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
*/
protected $string;
/**
* An array of unsafe html characters which has to be encoded.
*
* @var array
*/
protected $htmlUnsafe;
/**
* An array of unsafe html characters which are already escaped.
*
* @var array
*/
protected $htmlUnsafeEscaped;
/**
* {@inheritdoc}
*/
protected function setUp() {
parent::setUp();
/**
* Tests encoding length.
*/
public function testEncodingLength() {
// Verify that JSON encoding produces a string with all of the
characters.
$json = Json::encode($this->string);
$this->assertTrue(strlen($json) > strlen($this->string), 'A
JSON encoded string is larger than the source string.');
}
//...
}
En la clase de test JsonTest, se han programado una serie de pruebas para verificar
el correcto funcionamiento de la clase Json. Vamos a ver, paso a paso, los
elementos que se han definido en esta clase.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 375
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Annotations
/**
* @coversDefaultClass \Drupal\Component\Serialization\Json
* @group Serialization
*/
class JsonTest extends UnitTestCase {
/**
* Tests the render() method.
*
* @covers ::render
*/
public function testSerializerReceivesOptions() {
Método setUp()
Dentro del método setup() se debe llamar siempre al método de la clase padre:
parent::setUp();
376 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Métodos test* ()
/**
* Tests encoding length.
*/
public function testEncodingLength() {
// Verify that JSON encoding produces a string with all of the characters.
$json = Json::encode($this->string);
$this->assertTrue(strlen($json) > strlen($this->string), 'A JSON
encoded string is larger than the source string.');
}
Métodos assert*()
Las funciones assert*() son las que determinan si la clase evaluada supera la
prueba o no.
[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 377
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
- assertDirectoryExists(), assertDirectoryIsReadable(),
assertDirectoryIsWritable(). Comprobaciones sobre directorios.
/**
* Tests converting PHP variables to JSON strings and back.
*/
public function testReversibility() {
$json = Json::encode($this->string);
// Verify that encoding/decoding is reversible.
$json_decoded = Json::decode($json);
$this->assertSame($this->string, $json_decoded, 'Encoding a
string to JSON and decoding back results in the original
string.');
}
378 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Ejemplo: BanMiddlewareTest
El siguiente ejemplo nos servirá para enteder qué son los objetos "mock".
namespace Drupal\ban;
use Drupal\Component\Utility\SafeMarkup;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;
/**
* Provides a HTTP middleware to implement IP based banning.
*/
class BanMiddleware implements HttpKernelInterface {
/**
* The decorated kernel.
*
* @var \Symfony\Component\HttpKernel\HttpKernelInterface
*/
protected $httpKernel;
/**
* The ban IP manager.
*
* @var \Drupal\ban\BanIpManagerInterface
*/
protected $banIpManager;
/**
* Constructs a BanMiddleware object.
*
* @param \Symfony\Component\HttpKernel\HttpKernelInterface $http_kernel
* The decorated kernel.
* @param \Drupal\ban\BanIpManagerInterface $manager
* The ban IP manager.
*/
public function __construct(HttpKernelInterface $http_kernel,
BanIpManagerInterface $manager) {
$this->httpKernel = $http_kernel;
$this->banIpManager = $manager;
}
/**
* {@inheritdoc}
*/
public function handle(Request $request, $type = self::MASTER_REQUEST,
$catch = TRUE) {
$ip = $request->getClientIp();
if ($this->banIpManager->isBanned($ip)) {
return new Response(SafeMarkup::format('@ip has been
banned', ['@ip' => $ip]), 403);
}
return $this->httpKernel->handle($request, $type, $catch);
}
}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 379
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
namespace Drupal\Tests\ban\Unit;
use Drupal\ban\BanMiddleware;
use Drupal\Tests\UnitTestCase;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\HttpKernelInterface;
/**
* @coversDefaultClass \Drupal\ban\BanMiddleware
* @group ban
*/
class BanMiddlewareTest extends UnitTestCase {
/**
* The mocked wrapped kernel.
*
* @var
\Symfony\Component\HttpKernel\HttpKernelInterface|\PHPUnit_Framework_Mo
ckObject_MockObject
*/
protected $kernel;
/**
* The mocked ban IP manager.
*
* @var
\Drupal\ban\BanIpManagerInterface|\PHPUnit_Framework_MockObject_MockObj
ect
*/
protected $banManager;
/**
* The tested ban middleware.
*
* @var \Drupal\ban\BanMiddleware
*/
protected $banMiddleware;
/**
* {@inheritdoc}
*/
protected function setUp() {
parent::setUp();
$this->kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
$this->banManager = $this->getMock('Drupal\ban\BanIpManagerInterface');
$this->banMiddleware = new BanMiddleware($this->kernel, $this->banManager);
}
/**
* Tests a banned IP.
*/
public function testBannedIp() {
$banned_ip = '[Link]';
$this->banManager->expects($this->once())
->method('isBanned')
->with($banned_ip)
->willReturn(TRUE);
$this->kernel->expects($this->never())
->method('handle');
$request = Request::create('/test-path');
$request->server->set('REMOTE_ADDR', $banned_ip);
$response = $this->banMiddleware->handle($request);
$this->assertEquals(403, $response->getStatusCode());
}
//...
}
380 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Método getMock()
Pero, ¿cómo hacemos para disponer de estos objetos desde la clase de Test? Aquí
entran en juego los objetos "mock", que son objetos de prueba que simulan la
instanciación de una clase determinada del sistema. La idea es que podamos pasar
estos objetos como parámetros a las clases que lo requieran.
$this->kernel = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
$this->banManager = $this->getMock('Drupal\ban\BanIpManagerInterface');
$this->banMiddleware = new BanMiddleware($this->kernel, $this->banManager);
}
Una vez que tenemos un objeto mock, tenemos que prepararlo para que, en
determinadas condiciones, devuelva los valores esperados en el test. En el
siguiente ejemplo, creamos un objeto mock en $this->bar.
$this->bar = $this->getMock(SomeClass::class);
$this->bar->method('doSomething')
->willReturn('foo');
$this->assertEquals('foo', $this->bar->doSomething());
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 381
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Test Doubles:
[Link]
Información adicional
Para analizar otros ejemplos de Tests unitarios con PHPUnit, localiza en el núcleo
todos los archivos que contienen " extends UnitTestCase".
382 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Dentro de Simpletest disponemos de dos clases base que extenderemos para crear
la clase de Test:
En esta unidad nos centraremos en el primer caso. Los métodos de la clase base
WebTestBase se pueden consultar en:
[Link]
lass/WebTestBase/8
mymodule/src/Tests/
- /mymodule/src/Tests/[Link]
Dentro del mismo Test, cada caso o prueba a realizar, se programará en un método
independiente, sin argumentos, cuyo nombre empieza por test. Por ejempo:
testUsernameUnique().
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 383
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Ejemplo: ForumIndexTest
/core/modules/forum/src/Tests/[Link]
<?php
namespace Drupal\forum\Tests;
use Drupal\simpletest\WebTestBase;
/**
* Tests the forum index listing.
*
* @group forum
*/
class ForumIndexTest extends WebTestBase {
/**
* Modules to enable.
*
* @var array
*/
public static $modules = array('taxonomy', 'comment', 'forum');
384 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Nota: Para entender mejor los pasos que se siguen en el test, se recomienda activar
el módulo Forum e ir siguiendo los mismos pasos desde el navegador.
/**
* Tests the forum index for published and unpublished nodes.
*/
function testForumIndexStatus() {
// The forum ID to use.
$tid = 1;
// Create the forum topic, preselecting the forum ID via a URL parameter.
$this->drupalGet("forum/$tid");
$this->clickLink(t('Add new @node_type', array('@node_type' =>
'Forum topic')));
$this->assertUrl('node/add/forum', array('query' =>
array('forum_id' => $tid)));
$this->drupalPostForm(NULL, $edit, t('Save and publish'));
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 385
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Se comprueba, con assertTrue(), que el nodo obtenido no está vacío y, por tanto,
que se ha creado en la base de datos correctamente.
Vuelve a la página del foro (/forum/1), y comprueba que se liste el nodo, buscando
por su título (assertText()). La función assertText() busca el texto indicado en
toda la página, limpiando previamente el HTML.
386 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Por último, se accede a la página del foro y se comprueba que el nodo no aparece
en la página (assertNoText()).
Información adicional
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 387
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
mymodule/tests/src/Functional
\Drupal\Tests\BrowserTestBase
[Link]
ass/BrowserTestBase/8
- /mymodule/tests/src/Funtional/[Link]
Dentro del mismo Test, cada caso o prueba a realizar, se programará en un método
independiente, sin argumentos, cuyo nombre empieza por test. Por ejempo:
testFooAddBar().
Métodos assert*()
$this->assertSession()->métodoAssert();
[Link]
388 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
bAssert/8
$assert = $this->assertSession();
$assert->pageTextContains('foo text');
Ejemplo: CronExampleTest
Este ejemplo lo hemos extraído del módulo Cron Example (cron_example), incluido
en Examples for Developers.
/modules/contrib/examples/cron_example/tests/src/Functional/[Link]
<?php
namespace Drupal\Tests\cron_example\Functional;
use Drupal\Tests\examples\Functional\ExamplesBrowserTestBase;
/**
* Test the functionality for the Cron Example.
*
* @ingroup cron_example
*
* @group cron_example
* @group examples
*/
class CronExampleTest extends ExamplesBrowserTestBase {
/**
* An editable config object for access to '[Link]'.
*
* @var \Drupal\Core\Config\Config
*/
protected $cronConfig;
/**
* Modules to install.
*
* @var array
*/
public static $modules = ['cron_example', 'node'];
/**
* {@inheritdoc}
*/
public function setUp() {
parent::setUp();
// Create user. Search content permission granted for the search block to
// be shown.
$this->drupalLogin($this->drupalCreateUser(['administer site
configuration', 'access content']));
$this->cronConfig = \Drupal::configFactory()-
>getEditable('[Link]');
}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 389
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
La propiedad $modules es un array con los módulos que se deben instalar para
ejecutar el Test.
/**
* Create an example node, test block through admin and user interfaces.
*/
public function testCronExampleBasic() {
$assert = $this->assertSession();
390 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$post = [
'num_items' => 5,
'queue' => 'cron_example_queue_1',
];
$this->drupalPostForm(NULL, $post, t('Add jobs to queue'));
$assert->pageTextContains('There are currently 5 items in
queue 1 and 0 items in queue 2');
$post = [
'num_items' => 100,
'queue' => 'cron_example_queue_2',
];
$this->drupalPostForm(NULL, $post, t('Add jobs to queue'));
$assert->pageTextContains('There are currently 5 items in
queue 1 and 100 items in queue 2');
Información adicional
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 391
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
39 Otras funcionalidades
En esta unidad agrupamos una serie de funcionalidades adicionales
Comparativa D8/D7
que no hemos podido englobar en unidades anteriores.
Envío de emails
Se mantiene hook_mail() como medio
En primer lugar, veremos cómo se componen y envían los emails
para componer el mensaje, pero se ha
desde Drupal.
cambiado la forma de enviarlo, que ahora
se hace a través de un servicio.
Veremos cómo programar tareas de cron, que se ejecutarán junto
Cron
con el cron del sistema.
Se mantiene el formato de hook_cron() de
Drupal 7.
Por último, veremos cómo almacer mensajes en el log del sistema,
Logging
y cómo crear un servicio de log personalizado.
Se han eliminado las funciones watchdog()
y hook_watchdog(). Los mensajes se
registran ahora a través de un servicio
logger.
39
Contenidos de la Unidad
39.1 Envío de emails
39.2 Programación de tareas de cron
39.3 Logging API
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 395
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
hook_mail()
[Link]
- $key. Cadena de texto que servirá para identificar al email, ya que una
misma función hook_mail() puede implementar varios emails.
396 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
nder![Link]/interface/MarkupInterface/8
Archivo: /forcontu_email/forcontu_email.module
<?php
use Drupal\Component\Utility\SafeMarkup;
/**
* Implements hook_mail().
*/
function forcontu_email_mail($key, &$message, $params) {
$options = array(
'langcode' => $message['langcode'],
);
switch ($key) {
case 'contact_message':
$username = \Drupal::currentUser()->getDisplayName();
$message['from'] = \Drupal::config('[Link]')->get('mail');
$site_name = \Drupal::config('[Link]')->get('name');
$message['subject'] = t('E-mail sent from @site-name',
array('@site-name' => $site_name), $options);
$message['body'][] = SafeMarkup::checkPlain($params['message']);
break;
}
}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 397
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Formulario de ejemplo
Archivo: /forcontu_email/forcontu_email.[Link]
forcontu_email.message:
path: '/forcontu/email/message'
defaults:
_form: '\Drupal\forcontu_email\Form\ForcontuEmailMessageForm'
requirements:
_role: 'authenticated'
Archivo: /forcontu_email/src/Form/[Link]
<?php
namespace Drupal\forcontu_email\Form;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Mail\MailManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Language\LanguageManagerInterface;
use Egulias\EmailValidator\EmailValidator;
protected $mailManager;
protected $languageManager;
protected $emailValidator;
$this->mailManager = $mail_manager;
$this->languageManager = $language_manager;
$this->emailValidator = $email_validator;
}
$form['message_to'] = [
'#type' => 'email',
398 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$form['message'] = [
'#type' => 'textarea',
'#title' => $this->t('Message'),
'#required' => TRUE,
];
$form['submit'] = [
'#type' => 'submit',
'#value' => $this->t('Submit'),
];
return $form;
}
$email = $form_state->getValue('message_to');
if(!$this->emailValidator->isValid($email)) {
$form_state->setErrorByName('message_to', $this->t('%email
is not a valid email address.', ['%email' => $email]));
}
}
F39.1a
Email
Envío de email desde un
formulario.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 399
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
MailManager
[Link]
/MailManager/8
[Link]
ion/MailManager::mail/8
400 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$module = 'forcontu_email';
$key = 'contact_message';
$to = $form_values['message_to'];
$params = $form_values;
$language_code = $this->languageManager->getDefaultLanguage()->getId();
$send_now = TRUE;
if ($result['result'] == TRUE) {
drupal_set_message($this->t('Your message has been sent.'));
} else {
drupal_set_message($this->t('There was a problem sending
your message and it was not sent.'), 'error');
}
}
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut porta nunc in
odio feugiat sodales. Donec sem urna, interdum in turpis laoreet, tempus
faucibus metus. Quisque vehicula interdum turpis ut ornare. Fusce dictum
augue nec tortor vestibulum, nec malesuada dolor ullamcorper. In id sapien
sit amet neque convallis sodales. Duis vehicula congue efficitur.
En nuestro ejemplo, pasamos todos los valores del formulario a hook_mail() través
de $params. El email implementado en hook_mail() está esperando el valor
$params['message'] con el mensaje indicado en el formulario, para incorporarlo al
texto del mensaje del correo. Por medio de $params podemos compartir
información entre el método mail() y hook_mail().
[Link]
on/FormState::cleanValues/8
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 401
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Función hook_mail_alter()
[Link]
hook_mail_alter (&$message)
/**
* Implements hook_mail_alter().
*/
function forcontu_email_mail_alter(&$message) {
if($message['id'] == 'contact_page_mail'){
$site_name = \Drupal::config('[Link]')->get('name');
$signature = t("\n--\nMail altered by email_example module.",
array(), $options);
$message['body'][] = t("Mail sent out from @site-name",
array('@site-name' => $site_name));
}
}
402 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
Las tareas que se pueden realizar dentro de hook_cron() pueden ser muy
variadas:
hook_cron()
/**
* Implements hook_cron().
*/
function history_cron() {
db_delete('history')
->condition('timestamp', HISTORY_READ_LIMIT, '<')
->execute();
}
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 403
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
<?php
/**
* Implements hook_cron().
*
* Controls the size of the log table, paring it to 'dblog_row_limit' messages.
*/
function dblog_cron() {
// Cleanup the watchdog table.
$row_limit = \Drupal::config('[Link]')->get('row_limit');
// For row limit n, get the wid of the nth row in descending wid order.
// Counting the most recent n rows avoids issues with wid number sequences,
// e.g. auto_increment value > 1 or rows deleted directly from the table.
if ($row_limit > 0) {
$min_row = db_select('watchdog', 'w')
->fields('w', array('wid'))
->orderBy('wid', 'DESC')
->range($row_limit - 1, 1)
->execute()->fetchField();
// Delete all table entries older than the nth row, if nth row was found.
if ($min_row) {
db_delete('watchdog')
->condition('wid', $min_row, '<')
->execute();
}
}
}
404 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
rface/LoggerInterface/8
[Link]
[Link]/class/RfcLogLevel/8
En realidad solo usaremos el método log() cuando el valor de $level sea dinámico
y solo lo podamos conocer en tiempo de ejecución. Cuando vamos a almacenar un
mensaje de un nivel de severidad determinado, usaremos los otros métodos
disponibles en el canal de log:
- emergency($message, $context)
- alert($message, $context)
- critical($message, $context)
- error($message, $context)
- warning($message, $context)
- notice($message, $context)
- info($message, $context)
- debug($message, $context)
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 405
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
El funcionamiento es igual que la llamada a log(), pero sin el parámetro $level, que
se asigna internamente. Veamos algunos ejemplos:
// Ejemplo log()
\Drupal::logger('php')->log($error['severity_level'], '%type:
@message in %function (line %line of %file) @backtrace_string.',
$error);
// Ejemplo notice()
\Drupal::logger('user')->notice('Deleted %ip', ['%ip' => $this-
>banIp]);
// Ejemplo error()
\Drupal::logger('file system')->error('Could not delete temporary
file "%path" during garbage collection', ['%path' => $file-
>getFileUri()]);
En estos ejemplos hemos llamado al servicio de forma global, pero, siempre que
sea posible, inyectaremos el servicio en la clase. En este caso, además del servicio,
obtenemos directamente el canal ($channel) de log. En el siguiente ejemplo, se
inyecta el canal de log 'image'.
<?php
namespace Drupal\image;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\Core\Plugin\PluginBase;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
protected $uuid;
protected $weight = '';
protected $logger;
$this->setConfiguration($configuration);
$this->logger = $logger;
}
$this->logger->notice('...');
406 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Los logs que utilizan el logger por defecto, se almacenan en la tabla watchdog, y
pueden consultarse a través de la interfaz o desde consola, con comandos de Drush
y Drupal Console.
services:
logger.forcontu_logger:
class: Drupal\forcontu_logger\Logger\ForcontuLoggerLog
tags:
- { name: logger }
<?php
namespace Drupal\forcontu_logger\Logger;
use Drupal\Core\Logger\RfcLoggerTrait;
use Psr\Log\LoggerInterface;
/**
* {@inheritdoc}
*/
public function log($level, $message, array $context = array()) {
// Custom log
}
}
$this->logger->notice('Test message');
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 407
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Este documento forma parte del material didáctico del curso Experto en Drupal 8 Back-End
Development. Si deseas adquirir otros materiales complementarios o realizar el curso online y
certificarte como Experto en Drupal 8 Back-End Development, visita [Link] o ponte
en contacto con nosotros a través del correo info@[Link].
Actualizaciones
Este material será actualizado frecuentemente para nuevas versiones. Si has adquirido la versión
digital en [Link], tendrás acceso permanente y gratuito a las nuevas versiones.
Reporte de errores
Ayúdanos a mejorar los libros reportando cualquier error que encuentres. Puedes hacerlo
directamente completando este formulario (sólo para usuarios registrados en [Link]):
[Link]
Esta copia es de uso exclusivo y particular para el usuario especificado, que podrá almacenarlo,
imprimirlo y consultarlo en cuantos dispositivos requiera.
Este documento tampoco podrá ser utilizado en acciones formativas, ya sean online o presenciales,
que no cuenten con la autorización y reconocimiento de Forcontu S.L.
Todos los derechos reservados. El contenido de este documento, tanto en su totalidad como
parcialmente no puede ser reproducido, almacenado o transmitido de cualquier forma o por cualquier
medio ya sea electrónico, mecánico, fotocopiado, grabado o de otra forma, sin la previa autorización
expresa y escrita por parte de Forcontu S.L. Se incluye, en particular, su mera reproducción y/o
puesta a disposición como resúmenes, reseñas o revistas de prensa, fines para los que también será
necesario contar con la correspondiente autorización de Forcontu S.L. Para obtener más información,
póngase en contacto a través de info@[Link].
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
40 Compartir en comunidad
La comunidad de usuarios ha sido determinante para el crecimiento
Comparativa D8/D7
y mejora continua de Drupal. En esta última unidad del curso
explicamos las diferentes formas de participar activamente en la A medida que Drupal ha ido
comunidad de Drupal: reportar errores o incidencias en los módulos, evolucionando, también lo han hecho las
crear y compartir módulos, crear y utilizar parches, colaborar en la herramientas que le dan soporte. En esta
traducción de Drupal, etc. unidad no podemos hablar de diferencias
entre versiones, pero si de una evolución
continua del software y las herramientas
utilizadas para dar soporte al desarrollo de
Drupal.
40
Contenidos de la Unidad
40.1 La Comunidad de Drupal
40.2 Reportar incidencias
40.3 Compartir un proyecto en [Link]
40.4 Crear y aplicar parches
40.5 Colaborar en la traducción de Drupal
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 411
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
En este enlace encontrarás una guía inicial (en inglés) sobre las diferentes formas
de participar en la comunidad.
[Link]
Comenzamos esta unidad con una breve introducción a los eventos, asociaciones
y puntos de encuentro de la comunidad de Drupal.
Eventos
Estos son solo algunos de los eventos que se celebran en torno a Drupal. Busca tu
comunidad local y pregunta por los eventos que se celebrarán próximamente en
tu zona o, porqué no, anímate a organizar un encuentro informal para conocer a
otros usuarios y profesionales de Drupal.
412 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Asociaciones de Drupal
Hay muchos medios para entrar en contacto con otros miembros de la comunidad,
ya sea para buscar información, hacer consultas, resolver dudas, organizar
eventos, etc. Algunos de estos medios son:
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 413
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
414 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Desde la página oficial de cada proyecto (módulo, tema, perfil de instalación, etc.)
podemos contactar con los desarrolladores que lo mantienen a través de la cola
de incidencias (Issues), teniendo en cuenta que toda la comunicación debe
hacerse en inglés.
Existen normas para gestionar la cola de issues, así que siempre es recomendable
leer la información actualizada, ya que puede sufrir cambios:
[Link]
F40.2a
Incidencias (Issues)
Cada proyecto tiene su
propia cola de incidencias,
donde podemos encontrar
los errores reportados por
otros usuarios o publicar los
errores encontrados.
Siempre se deben revisar
las incidencias ya
publicadas antes de realizar
una nueva consulta.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 415
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F40.2b
Cola de incidencias
Listado de incidencias de
un proyecto. Podemos
filtrar las incidencias por
categoría, versión del
módulo e indicando la
cadena a buscar.
Para crear una nueva incidencia usaremos el enlace Create a new issue, que solo
estará disponible si nos hemos logueado previamente en el sistema [F40.2c].
F40.2c
Crear una incidencia
Enlace para crear una
nueva incidencia.
416 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
- Information de la incidencia:
- Detalles de la incidencia:
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 417
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F40.2d
Crear una incidencia
Formulario de creación de
incidencia.
Una vez enviada la incidencia, sé paciente. Recibirás un correo cada vez que algún
usuario publique un comentario en tu incidencia.
Si deseas seguir una incidencia publicada por otro usuario, haz clic en el enlace
Follow que encontrarás a la derecha [F40.2e].
F40.2e
Seguir una incidencia
Enlace Follow para seguir
las actualizaciones de
cualquier incidencia.
[Link]
418 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
La filosofía del trabajo en comunidad es "no compitas, colabora". Por eso, antes de
crear un nuevo proyecto (módulo, tema o perfil de instalación), consulta si ya existe
un proyecto similar. Si es así, tendrá más valor colaborar en el módulo existente
ayudando a mantenerlo y ampliarlo, en lugar de comenzar desde cero nuevas
líneas de trabajo.
[Link]
[Link]
Estándares de codificación
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 419
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Traducción
[Link]
F40.3a
Acceso a Git
Desde la pestaña Git
access, en la edición de
nuestra cuenta de
[Link], podemos
solicitar el acceso al
repositorio de proyectos de
Drupal.
420 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Para utilizar Git tenemos que instalarlo en nuestro equipo. Descarga la última
versión disponible para tu sistema operativo desde [Link]
Una vez instalado, accediendo a la aplicación Git Bash abriremos la consola o línea
de comandos de Git, que utiliza los comandos habituales de linux (ls, cd, mkdir,
etc.).
git config -l
[Link]
[Link]
Aunque el módulo esté en modo Sandbox, estará accesible a través del repositorio
de módulos, seleccionando en el filtro de estado Todos los proyectos o Sólo los
proyectos en Sandbox.
[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 421
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F40.3b
Proyecto en sandbox
Podemos crear proyectos
de prueba o Sandbox, que
estarán disponibles en el
repositorio pero que son
considerados
experimentales.
F40.3c
Crear proyecto
Para crear un proyecto
seleccionamos su tipo
(módulo, tema, perfil de
instalación, etc.), la
categoría, el estado de
mantenimiento y desarrollo
y el título y descripción del
proyecto (en inglés).
Hemos creado el proyecto Forcontu Test Project, que nos servirá en este curso
para realizar pruebas con el repositorio. El módulo está disponible en [F40.3d]:
[Link]
422 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F40.3d
Página del proyecto
Página de un proyecto en
sandbox. El proyecto se
añade automáticamente al
repositorio de versiones Git
de Drupal.
F40.3e
Control de versiones
del proyecto
Desde la pestaña Version
control se muestran las
instrucciones para subir el
proyecto al repositorio.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 423
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
$ cd forcontu_test_project/
F40.3f
Comandos para subir el $ git init
proyecto al repositorio Initialized empty Git repository in
h:/workspace/[Link]/forcontu_test_project/.git/
Comandos que
ejecutaremos desde la $ git add forcontu_test_project.[Link]
consola de Git para crear
el proyecto en local y $ git add forcontu_test_project.module
subirlo al repositorio de
[Link], de forma que $ git add forcontu_test_project.install
queden sincronizados.
$ git commit -m "Initial commit."
[master (root-commit) e9b7b18] Initial commit.
3 files changed, 379 insertions(+), 0 deletions(-)
create mode 100644 forcontu_test_project.[Link]
create mode 100644 forcontu_test_project.install
create mode 100644 forcontu_test_project.module
Una vez añadidos los archivos, con "git commit" creamos una primera versión
(commit) del proyecto.
Con "git remote add origin" establecemos la relación entre el repositorio local y
el repositorio en [Link].
424 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Una vez establecida esta relación, con "git push origin master" estaremos
subiendo los cambios locales (establecidos en el commit inicial) al repositorio en
[Link]. En este punto se requiere autenticación de acceso al repositorio,
que puede hacerse por dos métodos:
F40.3g
Instrucciones para
otros usuarios
Una vez hayamos subido el
proyecto al repositorio, las
instrucciones mostradas en
la pestaña Version control
servirán para que cualquier
usuario pueda descargar el
proyecto, crear parches,
etc.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 425
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
Comenzamos con el comando "git add -A", que busca en la carpeta (y subcarpetas)
todos los cambios que se hayan realizado en el proyecto.
$ git add -A
F40.3h
Commits
Cada cambio subido al
repositorio se denomina
commit. Desde la página
del proyecto podemos
consultar el listado de
commits del proyecto.
426 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F40.3i
Listado de commits
En el listado de commits se
muestran todos los
cambios realizados en el
proyecto. Es por ello que
al subir un cambio
conviene incluir una
descripción corta del
cambio publicado.
Gestión de incidencias
Una vez publicado el proyecto, otros usuarios podrán enviar incidencias a través
de la cola de incidencias (issues). Desde cada incidencia podemos mantener una
conversación activa con otros usuarios, siempre en inglés, para averiguar el origen
de la incidencia o las posibles soluciones [F40.3j].
F40.3j
Gestión de incidencias
Nuestro proyecto también
tiene su propia cola de
incidencias, donde otros
usuarios podrán publicar
errores, solicitar ayuda,
etc.
F40.3k
Cerrar incidencias
Conviene hacer una
correcta gestión de las
incidencias, cerrando
aquellas que ya están
solucionadas.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 427
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
EBOD8BD300055495000774
EBOD8BD300055495000774
F40.4a
Descargar proyecto
En la pestaña Version
control se muestran las
instrucciones para
descargar otros proyectos
desde el repositorio.
Una vez ejecutado el comando "git clone", tendremos disponible en local la última
versión del módulo obtenida del repositorio remoto. Para descargar los archivos no
hemos necesitado autenticarnos, sólo tendremos que hacerlo al subir archivos
[F40.4b].
428 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
Powered by TCPDF ([Link]) EBOD8BD300055495000774
EBOD8BD300055495000774
Las primeras líneas identifican el archivo que está siendo modificado, que en el
ejemplo es token_example/tokem_example.[Link].
Las líneas que comienzan por --- indican que se sustituirán por la línea con +++.
Las líneas que comienzan por + serán añadidas al archivo en el punto en que se
indica.
Las líneas que no incluyen ningún símbolo se mantendrán igual que en el archivo
original.
Los comandos para crear un parche se detallan en la pestaña Version control del
módulo que estamos modificando [F40.4d].
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 429
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
Powered by TCPDF ([Link]) EBOD8BD300055495000774
EBOD8BD300055495000774
F40.4d
Crear un parche
Las instrucciones para
crear un parche con Git se
incluyen en la pestaña
Version control del
módulo, aunque son
comunes para todos los
módulos.
[módulo]-[descripción]-[número-incidencia]-[número-comentario].patch
Por ejemplo, un parche para el módulo Pathauto relacionado con los títulos y que
va a ser publicado en el comentario #95 de la incidencia #12345 debería tener el
nombre:
[Link]
En esta página encontrarás más información sobre las buenas prácticas a la hora
de publicar un parche:
[Link]
Para crear el parche primero modificamos el archivo o archivos del proyecto que
previamente hemos descargado desde el repositorio. El comando "git diff" se
encargará de generar el parche con las diferencias [F40.4e]:
430 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
Powered by TCPDF ([Link]) EBOD8BD300055495000774
EBOD8BD300055495000774
F40.4g
Publicar un parche
Los parches se publican
como archivos adjuntos a
una incidencia.
Aplicar un parche
Aplicar un parche con git es muy sencillo. Primero descargaremos la versión del
módulo para la que se ha creado el parche. El módulo puede descargarse o bien
desde la página del módulo, o bien desde el repositorio, usando Git.
$ rm [[Link]]
Una vez aplicado el parche, subiremos el módulo modificado a nuestro sitio web.
En general, los parches no deben aplicarse directamente en un servidor en
producción o, al menos, deben tomarse las precauciones adecuadas, como realizar
una copia de seguridad del sitio.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 431
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
Powered by TCPDF ([Link]) EBOD8BD300055495000774
EBOD8BD300055495000774
F40.5a
Página de traducción
de un idioma
Desde la página de
traducción de un idioma
podemos unirnos a un
grupo de traducción,
haciendo clic en el botón
Join. Para poder unirnos
debemos estar registrados
en el sitio, teniendo en
cuenta que se utiliza el
mismo usuario de
[Link].
Una vez unidos a un grupo de traducción, podremos ver las pestañas Translate,
Import y Export [F40.5b].
F40.5b
Pestañas Translate,
Import y Export en
[Link]
Una vez que nos hayamos
registrado y unido al grupo
de traducción de un
idioma, podremos acceder
a las pestañas Translate,
Import y Export.
432 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
Powered by TCPDF ([Link]) EBOD8BD300055495000774
EBOD8BD300055495000774
F40.5c
Pestaña Translate
Desde la pestaña Translate
podemos colaborar
incorporando sugerencias
de traducción.
Las traducciones
incorporadas tendrán que
ser validadas por un
moderador, antes de pasar
a formar parte de la
traducción del núcleo o
módulo.
F40.5d
Pestaña Import
Desde la pestaña Import
podemos contribuir con la
traducción de módulos
subiendo lotes de
traducción en archivos .po.
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 433
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
Powered by TCPDF ([Link]) EBOD8BD300055495000774
EBOD8BD300055495000774
F40.5e
Pestaña Export
En la pestaña Export
podemos descargar un
archivo .po con las últimas
traducciones disponibles
de cualquier proyecto.
Como opción adicional
podemos añadir al archivo
las sugerencias de
traducción pendientes de
aprobación.
Cada grupo tiene sus propias normas para moderar la traducción. Los moderadores
son fundamentales para revisar y aprobar las traducciones enviadas por otros
usuarios. Si quieres participar como moderador de las traducciones, debes
solicitarlo a cualquiera de los administradores del grupo. En el grupo de
traducciones de español puedes escribir un comentario en esta página
solicitándolo:
[Link]
434 Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
Powered by TCPDF ([Link]) EBOD8BD300055495000774
EBOD8BD300055495000774
[Link]
Aprende Drupal con Forcontu | Experto en Drupal 8 Back-End Development III 435
Copyright 2011-2017 Forcontu S.L. Todos los derechos reservados. Queda totalmente prohibida su reproducción y difusión.
Copia de uso exclusivo para LUDWRING ANTHONY LICCIEN AZOCAR con Cédula de identidad (CI) 12762471 Código de verificación:
Powered by TCPDF ([Link]) EBOD8BD300055495000774