webmaster

Módulo personalizado | Creación de plantilla

Video de Youtube
URL de Video remoto
Texto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

     Hoy hemos decidido que estamos dispuestos a seguir aprendiendo Drupal, porque nos apasiona obtener nuevos conocimientos, que solucionarán posibles retos en nuestro futuro próximo, o porque nos encanta ampliar nuestras posibilidades, tanto a nivel laboral como personal. Ya que la puesta en marcha de proyectos web, podrían representar el inicio hacia una carrera prometedora.

     Ahora que ya tenemos claro Cómo crear un módulo en Drupal 9, en esta ocasión nos vamos a concentrar, en la creación de una plantilla personalizada, con el objetivo de tomar el control sobre la presentación de los datos relacionados con el mismo. Para lograr nuestro propósito, tendremos que implementar uno de los "hooks" o funciones prefabricadas de Drupal que nos permitirán lograr toda clase de objetivos, en este caso será function hook_theme, la que se encargará registrar las implementaciones de un tema o "theme", dentro de nuestro tema o módulo personalizado.

     En este capítulo vamos a crear un módulo personalizado, al que añadiremos un controlador, que nos imprimirá en pantalla una página y posteriormente, también añadiremos mediante la function hook_theme en el archivo ( MIMODULO.module ) los datos y configuraciones que nos permitirán pasar por parámetros el título y otros contenidos que mostraremos en ella. 

     Finalmente, añadiremos el archivo routing ( MIMODULO.routing.yml ), para poder acceder a esta página una vez haya sido activado nuestro módulo personalizado. Este ejemplo te permitirá conocer la manera en que podrás implementar plantillas personalizadas en tus módulos.  

Requisitos

Cómo crear un módulo en Drupal 9

Cómo crear módulos con su Controlador y Plantilla en Drupal 9  

     Paso 1 Creación de tu módulo:

          Lo primero que deberías saber es cómo crear un módulo personalizado. Esencialmente para este ejemplo, lo que necesitarás será una carpeta con el nombre de tu módulo y dentro el archivo con el nombre del módulo y la extensión, eje.: "mimodulo.info.yml"

     Paso 2 Creación del archivo .module para implementar la function_hook_theme():

          En el archivo MIMODULO.module es donde podremos implementar los hooks o funciones de php en Drupal, en este ejemplo utilizaremos la function hook_theme, que se encarga de registrar las implementaciones del tema dentro de un módulo o tema personalizado, esto quiere decir, que las implementaciones declaradas por este hook o función especifican cómo un arreglo o array de renderización particular debe ser renderizada como HTML.

     Los párametros que utilizaremos en este ejercicio, estarán dentro de un array que nos devolverá la función y son, el nombre de la función y dentro de de ella, las variables que pasaremos posteriormente al controlador, para crear la página que imprimiremos una vez activado el módulo.

     Dentro de las variables, a su vez, tendremos un array de items, donde colocaremos todos las noticias que queremos presentar en la página una vez renderizada y el título de la página que será del tipo String.

<?php

/**
 * Implement hook_theme().
 */
function listado_noticias_theme($existing, $type, $theme, $path) {
    return [
      'listado_noticias' => [
        'variables' => ['items' => [], 'title' => '' ]
      ]
    ];
}

     Paso 3 Creación del Controlador o Controller:

          El Controlador o Controller es quien nos permitirá crear la página que se mostrará, una vez activado nuestro módulo, al renderizar los datos que hemos definido previamente en nuestra  function hook_theme.

          Para que pueda generarse nuestra página, vamos a añadir a nuestra clase controlador, un método al que llamaremos "page()", y dentro tendremos dos arrays, uno que contendrá el listado de noticias que vamos a recorrer usando nuestra function hook_theme, y otro con los datos que obtendremos al conectar con la información recibida desde la function hook_theme.

Custom Module Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

          Una vez creada nuestra clase controller con el nombre ListadoNoticiasController.php, dentro tendremos la siguiente estructura de código.

<?php

namespace Drupal\listado_noticias\Controller;

use Drupal\Core\Controller\ControllerBase;

class ListadoNoticiasController extends ControllerBase {

  public function page(){

    $items = [
      ['title' => 'Noticia 1'],
      ['title' => 'Noticia 2'],
      ['title' => 'Noticia 3'],
      ['title' => 'Noticia 4'],
    ];

    return [
      '#theme' => 'listado_noticias',
      '#items' => $items,
      '#title' => 'Listado de noticias'
    ];

  }

}

          El primer array, es un array de objetos, ya que cada noticia podrá tener tantos elementos como queramos especificar, para este ejemplo, sólo añadiremos el título, pero puedes añadir tantos como necesites, siempre tomando en cuenta la estructura ( "clave" => "valor" ), ya que los objetos, en realidad también son arrays.

$items = [
  ['title' => 'Noticia 1'],
  ['title' => 'Noticia 2'],
  ['title' => 'Noticia 3'],
  ['title' => 'Noticia 4'],
];

          El segundo array, que tendremos dentro de nuestro método "page()", es el que nos devolverá nuestro método al llamarlo, contendrá los parámetros necesarios para renderizar los datos recibidos desde la function hook_theme, y que harán posible la impresión en pantalla, de nuestros contenidos en formato de una página, al activar el módulo.

          En el primer parámetro del array, estamos llamando a nuestra función tema, que configuramos usando la function hook_theme, el segundo parámetro son los items, que hemos definido como una de las variables que pasamos y el último, será el título de la página, que también definimos mediante la función.

          Esto hará posible, que posteriormente podamos recorrer el primer array de items y mostrarlos en la plantilla correspondiente, que todavía no hemos creado. 

return [
  '#theme' => 'listado_noticias',
  '#items' => $items,
  '#title' => 'Listado de noticias'
];

     Paso 4 Creación de la ruta para acceder a la página renderizada:

          Una vez terminada la configuración de los datos que vamos a presentar en nuestra página, al invocar el método "page()", necesitaremos un modo de acceso, mediante url, para que podamos acceder a esta página y ver sus datos.

          En esta tarea nos ayudará el archivo listado_noticias.routing.yml , dentro de este archivo vamos a definir la url hacia nuestra página, el namespace para que drupal pueda encontrar en nuestro controlador el método que mostrará los datos y finalmente los permisos asociados a nuestro contenido, que serán los permisos por defecto, para que cualquier usuario que entre a la web, pueda verlo sin problemas.

          Es muy importante respetar los espacios al escribir los datos dentro del archivo rounting, se recomienda evitar la tecla tab para hacerlo y en su lugar, es mejor la barra espaciadora del teclado, contando con dos espacios a cada nueva línea que vayamos añadiendo.

listado_noticias.listado:
  path: '/listado-noticias'
  defaults:
    _controller: '\Drupal\listado_noticias\Controller\ListadoNoticiasController::page'
  requirements:
    _permission: 'access content'

     Paso 5 Creación de la plantilla:

          La última fase de este desarrollo, antes de activar el módulo, será la creación de nuestra plantilla, para dar formato a la presentación de los datos, una vez activado nuestro módulo.

          Para los nombres de las plantilla, se debe utilizar el guión medio "-", en lugar del guión bajo "_", y el nombre que debemos utilizar será el mismo de nuestra función tema, que hemos declarado en el function hook_theme.

          Por lo tanto, el nombre que tendremos que utilizar en este ejemplo será "listado-noticias.html.twig", además, colocaremos nuestras plantillas dentro de una carpeta llamada templates, siguiendo con la estructura habitual de drupal para todos sus módulos.

          Ahora que ya tenemos la plantilla creada, sólo resta imprimir los valores usando las dobles llaves, ej.: {{ title }} y en el caso de las noticias, crearemos un "ciclo for", para poder recorrer el array de items y acceder a todos sus datos relacionados.

<h3>{{ title }}</h3>
   <ul>
     {% for noticia in items %}
       <li>{{ noticia.title }}</li>
     {% endfor %}
   </ul>

          Ya podemos activar nuestro módulo y luego al acceder a la url que hemos definido dentro del archivo  listado_noticias.routing.yml, veremos nuestra página con todos los datos que habíamos configurado.

Custom Module Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

Opigno LMS | Creación de entrenamiento

Video de Youtube
URL de Video remoto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

     Dentro de las distribuiciones de Drupal (Listas para utilizar), Opigno ocupa un lugar destacado, ya que cubre la mayoría de las necesidades dentro de cualquier tipo de proceso de formación, básica, media o avanzada. En otras palabras, es un LMS o Learning Management System, que permite la creación de múltiples sistemas de formación, ideal para academías, universidades en línea, la formación interna de los empleados, entre otras.

     La plataforma Opigno es compatible con las versiones de Drupal 8 y posteriores en incluye funcionalidades avanzadas, como la configuración de cursos interactivos, su propia red social, mensajería interna, foros o la integración de fomación en tiempo real, a través de video llamadas.

     En este artículo, haremos un recorrido sobre los pasos para crear un Entrenamiento, que incluye varios módulos, cómo añadir actividades interactivas relacionadas con los módulos y algunas de las opciones de evaluación; para que puedas hacerte una idea sobre su potencial y lo fácil que podría resultar su implementación en tus proyectos.

     Qué significa Entrenamiento en Opigno

     Lo primero que deberíamos tener en cuenta, es que en Opigno, cuando se menciona crear un Entrenamiento, Formación o Ruta de aprendizaje, realmente, se refiere lo que conocemos como "Curso de formación a nivel global", que a su vez, estará compuesto por uno o varios Cursos, con sus respectivos Módulos y Actividades, correspondientes a cada uno de los Temas, que se tratarán durante su desarrollo.

     Por ejemplo, si queremos crear un Entrenaminento o formación sobre "Reparación de ordenadores", añadiremos tantos Cursos o Temas como necesitemos, con sus respectivos módulos, actividades, material de apoyo y/o evaluaciones, ofreciendo a los alumnos las diferentes opciones y posiblidades de completar cada una de las Fases o Cursos durante el Entrenamiento.

   Cómo crear un Entrenamiento en Opigno

     Para crear un Entrenamiento o Formación, podremos elegir uno de las siguientes opciones:

     Opción 1 - Menú Catálogo

     Haciendo clic en el menú superior, en la opción Catálogo y a continuación, presionando el botón, Crear nueva formación, que encontraremos en la parte derecha de la pantalla.

Opigno LMS Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

   Opción 2 - Desde el menú Administración

     Desde el menú Administración, hacemos clic en en enlace Entrenamiento y, a continuación, podremos crear o importar un entrenamiento.

Opigno LMS Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

Opigno LMS Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Cualquiera de las dos alternativas, nos permitirán añadir un nuevo entrenamiento dentro de la plataforma Opigno. Y nos abrirá la primera pantalla.

 Pantalla 1 - Descripción del entrenaniento

     En la que tendremos que añadir la descripción, objetivos, categoría, entre otras información relacionadas con el entrenamiento.

     Una vez accedamos a la pantalla de configuración de nuestro entrenamiento, podremos comenzar añadiendo una descripción general, acerca del contenido y objetivo del Entrenamiento.

Opigno LMS Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Una vez terminemos de completar todos los campos de la primera pantalla de configuración para nuestro entrenamiento (Categorías, Duración, Certificado, etc), podremos pasar a la siguiente parte haciendo clic en el botón siguiente, que veremos en la parte inferior derecha de la pantalla. 

     Si hemos activado el módulo Commerce de Opigno, podremos configurar el precio del curso, como parte de la descripción del entrenamiento, antes de continuar.

Opigno LMS Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

Pantalla 2 - Administración del Grupo y opciones

     En esta siguiente pantalla, definiremos los grupos que podrán acceder a nuestro entrenemiento, añadir un primer elemento (Curso o Módulo), o si la formación será guiada por un instructor.

Opigno LMS Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     No podremos continuar a la siguiente pantalla, a menos que no hayamos añadido algo de contido, como un módulo o un curso o cualquiera de las configuraciones disponibles.

Opigno LMS Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

Añadir nuestro primer Elemento (Curso)

     Aprovecharemos para añadir desde esta pantalla, nuestro primer elemento, que en este caso será un Curso. Para esto, haremos clic en el botón añadir Elemento y a continuación, seleccionaremos el tipo Curso, desde el menú de opciones que se mostrará a nuestra derecha.

     Podremos crear un nuevo curso, o seleccioar un curso existente que añadiremos a nuestro entrenamiento.

Opigno LMS Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     A continuación, podremos añadir una descripción del curso, alguna imagen de portada que se mostrará en los listados del entrenamiento, el certificado para el curso, en caso de tenerlo y si queremos activar el sistema de isingnias acumulativas.

     Tan pronto como hayamos terminado con los datos de nuestro curso, haremos clic en el botón guardar de la parte inferior y veremos cómo se mostará en el listado de curso de nuestro entrenamiento, con un aspecto parecido al de la siguiente imagen:

Opigno LMS Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Al igual que en la pantalla anterior, no podremos seguir avanzando, a menos que seleccionemos al menos una de las entidades como obligatoria; por lo tanto, marcaremos nuestro curso curso como obligatorio y presionaremos el botón siguiente de la parte inferior de la pantalla.

Opigno LMS Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Ahora que ya hemos marcado nuestro curso como obligatorio, podremos añadir el o los módulos a nuestro curso. De igual manera, tendremos la opción para añadir nuevos módulos o reutilizar módulos existentes, creados previamente.

Opigno LMS Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Cuando hayamos añadido los módulos del curso, podremos verlos dentro de los listados, tanto para agregarlos al curso actual, como para reutilizarlos en varios cursos relacionados.

Opigno LMS Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Para que nuestro Entrenamiento esté completo, una vez añadido los curso y módulos, sólo nos resta agregar las actividades relacionadas. Para ello el procedimiento es el mismo que en los anteriores elementos, podemos añadir nuevas actividades o reutilizar las que hayan sido creadas previamente y para ello, presionaremos el botón de añadir elemento, desde la pestaña lateral del curso o dentro del módulo, con la opción Editar o Actualizar.

Opigno LMS Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

Contenta CMS | Instalación con Drupal 9 utilizando Lando

Video de Youtube
URL de Video remoto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

 Aunque ya hemos aprendido en el artículo Conectando Gatsby con Drupal 9, como instalar y configurar, Drupal 9 para utilizarlo como Backend, en un desarrollo Headless combinándolo con algún framework javascript como Gatsby, React, Vue.js, etc. En esta ocasión, aprenderemos a instalar la Distribución Contenta de Drupal 9, utilizando Lando.

     Contenta CMS es una distribución optimizada para el desarrollo Drupal Headless, por lo que ya tiene activados los módulos necesarios para que sólo tengamos que ocuparnos de las configuraciones que correspondan al Frontend, fuera de Drupal.

     Al igual que hemos hecho en otros casos, vamos a crear una carpeta e inicializaremos Lando, para generar el archivo de configuración .lando.yml, que nos permitira ejecutar el comando de descarga, sin la necesidad de instalar nada más en nuestro servidor, también daremos permisos de lectura y escritura a la carpeta, para evitar posibles errores durante la instalación. 

sudo mkdir contenta-drupal

sudo chmod -R 777 contenta-drupal

cd contenta-drupal

lando init

     Al ejecutar el comando lando init, veremos en la consola, las preguntas relacionadas con la configuración de nuestro proyecto, seleccionaremos carpeta actual, la carpeta web, drupal 9 y elegiremos un nombre para nuestra aplicacion.

Curso Drupal 9 Headless | www.drupaladicto.com - Consultor especializado en drupal y symfony

Curso Drupal 9 Headless | www.drupaladicto.com - Consultor especializado en drupal y symfony

Curso Drupal 9 Headless | www.drupaladicto.com - Consultor especializado en drupal y symfony

     El resultado de estos comando será un archivo .lando.yml con el siguiente aspecto:

name: contenta-drupal
recipe: drupal9
config:
  webroot: web

     A continuación podremos comenzar la descarga de Contenta CMS y creará la carpeta "vaciame" con el siguiente comando:

lando composer create-project contentacms/contenta-jsonapi-project vaciame --stability dev --no-interaction --no-install

     Una vez terminada la descarga de los archivos de contenta, sacaremos el contenido de vaciame, y colocaremos todo en nuestrra carpeta raíz contenta-drupal, de esta forma, podremos seguir ejecutando los comandos de lando, que nos permitirán terminar la configuración de Drupal, gracias al archivo lando.yml que hemos creado al principio y a las dependencias definidas en el archivo composer.json de Contenta CMS. Por último borraremos la carpeta vaciame, antes de continuar con los comandos restantes.

     Si abrimos el explorador de archivos de windows o ejecutamos el comando de linux ls, para listar los archivos que hemos descargado, podremos comporobar que existen dos carpetas llamadas scripts, con el mismo contenido, tanto en nuestra carpeta contenta-drupal como en vaciame; para evitar conflictos a la hora de mover los archivos, nos aseguraremos de borrar uno de ellos antes de realizar la tarea.

     Con los siguientes comandos de linux, sacaremos todos los archivos, y por útimo, borraremos la carpeta vaciame:

mv vaciame/* .
mv vaciame/.* .
rm -rf vaciame

     Ahora que ya tenemos todos los archivos en el lugar correspondiente, podremos continuar con la instalación de Contenta, para ello ejecutaremos el comando que terminará de descargar las dependencias de Drupal 9:

lando composer install

 

Curso Drupal 9 Headless | www.drupaladicto.com - Consultor especializado en drupal y symfony

   Tan pronto como haya terminado la descarga de las dependencias de Contenta CMS, podremos instalar nuestro sitio, para ello, ejecutraremos un comando de drush, disponible desde lando, pero antes asegúrate de darle permisos otra vez a la carpeta, ya que como he mencionado en otros artículos, al ejecutar Composer, los permisos se reescriben y podrían darnos errores durante la instalación, el comando que vamos a ejecutar es el siguiente:

lando drush si --db-url=mysql://drupal9:drupal9@database/drupal9

Curso Drupal 9 Headless | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Al terminar la instalación, veremos los datos de acceso para nuestro usuario adminsitrador de Contenta, también verás en la siguiente imágen el resultado, en caso de no haber dado permisos a la carpeta, antes de iniciar la instalación con drush.

Curso Drupal 9 Headless | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Si todo ha ido correcto, ejecutaremos un borrado de la cache de drupal y podremos acceder a nuestro sitio.

lando drush cr

Para saber la url de tu sitio web, puedes ejecutar el comando info de lando:

lando info

Curso Drupal 9 Headless | www.drupaladicto.com - Consultor especializado en drupal y symfony

Varbase Drupal 9 | Instalación y Primeros pasos

Video de Youtube
URL de Video remoto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

     ¿Te imaginas poder instalar y configurar una web con Drupal 9, sin tener que ir investigando y descargando varios módulos o themes, para que el resultado sea lo más parecido a lo que estabas pensando?, pues esto ya es posible hace mucho tiempo, a través de las "Distribuciones de Drupal".

     ¿Qué son las distribuciones de Drupal?, son paquetes de instalación, que permiten acelerar el proceso de construcción para sitios generados con Drupal; las distribuciones suelen incluir varios módulos y themes, específicos u optimizados para simplificar cualquier proceso de configuración.

     Existen varias distribuciones conocidas, como son Commerce Kickstart, que nos permite instalar una tienda con los productos y contenidos básicos para conocer el funcionamiento de Drupal Commerce, Open Social, que permite instalar una red social con múltiples funcionalidades preconfiguradas. Si quieres saber más sobre las distribuciones de Drupal 9, visita su Página Oficial.

   Varbase - La más potentes de las distribuciones Drupal

     Varbase es una distribución de Drupal mejorada repleta de funcionalidades adaptativas y módulos esenciales, que aceleran su desarrollo y le brindan configuraciones estandarizadas, lo que facilita su vida.
     La esencia de Varbase se encuentra dentro del concepto básico que lo inició; DRY (Dont Repeat Yourself). Varbase maneja eso por usted, aliviándolo de repetir todos los módulos, funciones y configuraciones que se incluyen en cada proyecto de Drupal.

     En resumen, la idea es que, al utiilzar Varbase para desarrollar nuestras webs con Drupal, ahorraremos bastante tiempo desarrollo, exploración de posibles soluciones, compatibilidades y dependencias. Si quieres conocer más acerca de Varbase, te invito a visitar su Página Oficial

   Varbase Drupal - Requisitos

      Debido a las funcionalidades incluidas y mejoradas en esta distribución, para que podamos ponerla en marcha necesitaremos cumplir con unos requisitos mínimos, que son tener un entorno en contemos con los gestores de paquetes Composer, para trabajar con las depedencias php relacionadas con Drupal y Npm, para las dependencias relacionadas con Node.js.

   En nuestro caso, utilizaremos el Subsistema WSL2, dentro de Windows 11 ó 10, de esta manera podremos trabajar en un entorno de Linux, sin necesidad de configurar máquinas virtuales o tener un ordenador a parte del nuestro.     

     Si todavía no sabes o no haz tenido que utilizar WSL2, tienes toda la información y video incluido En este artículo, haz clic aquí

     Por otro lado, Varbase ya viene optimizado para trabajar con Lando, lo cual nos facilitará todavía más las labores de instalación, ya que su configuración es mucho más sencilla, al trabajar con contenedores Docker, en lugar de tener que configurar un servidor completo con LAMP.

   Cómo instalar Lando en Ubuntu 20.04 utilizando WSL2 en Windows 11

          Como ya es costumbre, hemos creado un usuario "NOROOT", para ejecutar nuestros comandos SUDO, sin riesgos de cargarnos nada por error dentro de nuestra distribución de Ubuntu 20.04. Si todavía no sabes cómo Haz Clic aqui. Una vez iniciada la sesión con nuestro usuario ejecutaremos los siguientes comandos para realizar la instalación de Lando.

sudo wget https://github.com/lando/lando/releases/download/v3.0.26/lando-v3.0.26.deb
sudo dpkg -i --ignore-depends=docker-ce lando-v3.0.26.deb

   Varbase Drupal - Instalación y primeras configuraciones

     Paso 1 - Descarga de los archivos usando composer y Lando

     Como mencioné al principio de este artículo, la distribución Varbase de Drupal, ya viene optimizada para ser usada con Lando, lo que significa que podremos descargarla y modificar su configuración si hiciera falta. 

     Para la instalación necesitaremos utilizar composer, pero, como queremos hacer todo con lando, o sea, la descargar de los archivos también, lo que haremos es, primero crear la carpeta con un archivo lando por defecto, y una vez ejecutemos el comando lando init, podremos iniciar la descarga usando:

lando composer create-project Vardot/varbase-project:~9 YOUR_PROJECT --no-dev --no-interaction

     Luego, en cuanto la descarga de los archivos para Varbase haya terminado, podremos borrar nuestro archivo .lando.yml y mover todos los descargados, hacia la carpeta principal, ya que encontraremos dentro su propio archivo de configuración para lando, adaptado a la instalación de Varbase.

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Una vez hayas configurado lando dentro de tu carpeta, es posible que tengas que darle permisos antes de inicializarlo y poder ejecutar lando init

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

    En cuanto des los permisos a la carpeta, podrás volver a ejecutar los comandos para inicializar lando dentro de ella, y a continuación, descarar los archivos de Varbase, usando el comando lando composer ...

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     En el momento en que termina la descara de los archivos, al ejecutar el comando anterior, podremos comprobar que dentro de nuestra carpeta, tendremos el .lando.yml, que se añadió al ejecutar lando init y luego la carpeta con el nombre YOUR_PROJECT, o cualquier otro que hayas puesto, con todos los archivos necesarios para comenzar con la instalación de Varbase.

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Ahora, nos tocará borrar el archivo original en nuestra carpeta Raiz llamado .lando.yml y sacar a esta ubicación, todo lo que haya dentro de la carpeta YOUR_PROJECT. Para ello, como estamos utilizando Linux dentro de un entorno Windows, podremos abrir el explorador de archivos y moverlos manualmente, sin necesidad de comandos Linux.

sudo rm -Rf YOUR_PROJECT

y luego podremos comprobar que ya no existe ejecutando el comando de linux

ls 

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

    Ahora que ya tenemos dentro de la carpeta de nuestro proyecto, todos los archivos que necesitaremos para la instalación inicial de Varbase drupal, ejecutaremo el comando de reconstrucción de Lando y de esta forma prevenimos de posibles fallos, antes de ejecutar los comando posteriores:

lando rebuild

 

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

   Revisión y configuraciones previas a la instalación final

     Llegados a este punto, ya podríamos acceder a las urls que se nos muestran en la consola, pero antes podremos realizar algunos cambios, como el nombre que se generará para nuestro proyecto o la versión de node, para que sea compatible con la versión actual de Varbase Drupal.

     Para ello, abriremos el archivo de configuración de lando, llamado .lando.yml, utilizando el IDE que prefieras y realizaremos los cambios correspondientes, antes de ejecutar el instalador de Varbase.

 

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Con los cambios realizados en el archivo de configuración, volveremos a ejecutar el comando de reconstrucción de lando.

lando rebuild

     Y podremos comprobar que ahora se habrán descargado otras dependencias, además del cambio en el nombre de nuestro proyecto.

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Lo último que necesitaremos antes de iniciar el instalador de drupal, es descargar las dependencias descritas en el composer.json, para ello ejecutaremos el comando siguiente:

lando composer update

 

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Con esto se descargaran los achivos que necesitará drupal, como vendor, sus módulos y los de varbase entre otros.

     Para finalizar la descarga, al igual que pasa cuando descargamos los archivos de drupal commerce, nos pedirá que escribamos el token de nuestro repositorio de Git.

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Se iniciará la descarga de todas las dependencias que hacen falta, y a continuación ya podremos acceder e inicar el instalador de Varbase Drupal.

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Para volver a ver los datos relacionados con nuestra instalación, URLS, BASE DE DATOS, ETC, ejecutaremos el comando info de lando.

lando info

 

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Si ahora accedemos a la url de nuestro proyecto con http, veremos el instalador, pero si seleccionamos la que tiene certificado de seguridad, veremos la típica advertencia. En ambos casos, podremos iniciar el instalador de Varbase.

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     A continuación, completaremos los campos del instalador, con lo que nos muestra en la consola, al ejecutar el comando lando.info. Recuerda que en opciones avanzadas, en lugar de dejar localhost, pondremos el valor del hostname de lando, al y como muestra la imagen. 

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     La siguiente pantalla es muy parecida a las de cualquier intalación de Drupal, donde colocaremos los datos del usuario administador, el correo del sitio, el pais, etc.

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Las novedades de utilizar la distribución Varbase Drupal, comienzan a partir de la siguiente pantalla, ya que nos encontramos con la opción para decidir si queremos instalar un sitio multi-idioma, directamente desde aquí; si lo seleccionamos, comenzará la descarga automática de las dependencias y módulos necesarios para este propósito.

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     En este caso vamos a dejarlo como está, sin marcar la opción de multi-idioma para pasar a la siguiente pantalla. A partir de aquí es donde podemos apreciar el verdadero potencial de esta instalación, ya que tendremos múltiples opciones que nos permitirán acceder a funcionalidades, como un Carrusel, listo para utilizar con solo cargar las imágenes arrastrándolas, un buscador o la opción de inicio de sesión utilizando nuestro correo electrónico. Todo listo para utilizar y publicar tu web en un tiempo record, con todo optimizado para que sea rápida y atractiva.

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     En la última pantalla, justo antes de finalizar la instalación, Varbase Drupal nos permite seleccionar entre cargar los componentes necesarios para crear un sitio web completo, en el caso de que seamos desarrolladores con conocimientos previos de Drupal, para ahorrarnos tiempo y además, una guía de estilos para que saquemos el mejor partido a la apariencia de esta magnífica distribución, lista para utilizar.

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Por si todavía queremos más, justo cuando termina la instalación de Varbase Drupal, nos da un tour bastante gráfico, acerca de las opciones más típicas, para poder comenzar de inmediato con la configuración de nuestro sitio.

Varbase Drupal 9 Lando | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Ahora que ya sabes lo suficiente, para poder instalar y configurar tu sitio Drupal, utilizando la distribución Varbase, es tu turno de mover ficha y explorar un poco más a fondo y sacarle el verdadero provecho, ofreciendo a tus clientes resultados mucho más atractivos y en menos tiempo.

...

Drupal Distributions | Instalaciones de Drupal listas para utilizar

Contenidos programáticamente | Creación en Drupal 9

Video de Youtube
URL de Video remoto
Texto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

     A lo largo de los años, Drupal ha ganado la inmerecida fama de que es un CMS muy complejo y difícil de aprender, pero en realidad, todo dependerá de tu capacidad para experimentar con nuevas herramientas y tu actitud de superar cualquier reto que se te presente; verás que no resulta tan complicado, si dedicas el tiempo necesario y tienes la suficiente paciencia contigo.

     Si todavía no lo conoces, te animo a que empieces desde hoy mismo con este curso gratis de Drupal 9 paso a paso en español y en un par de semanas te llevarás la grata sorpresa de lo mucho que puedes lograr si pones verdadero empeño.

   LO QUE NECESITAS ANTES DE EMPEZAR CON ESTE EJERCICIO:

  1. Tener Drupal funcionando ya sea con un servidor local tipo Xampp o con contenedores de Docker.
     
  2. Haber instalado al menos estos dos módulos esenciales Backup and Migrate y Admin Toolbar
     
  3. (Opcional) Conocimientos básicos sobre Cómo crear un módulo personalizado

     Una vez hayas terminado de configurar todo lo anterior y te sientas con todas las ganas para comenzar, el próximo paso sería hacer tu primera copia de seguridad; de esta forma, te asegurarás de que puedes recuperar la última versión estable de tu desarrollo si hubiera cualquier tipo de fallo durante el proceso.

Así que, para crear esta primera copia de nuestra base de datos estable, nos iremos a la ventana del módulo Backup and migrate usando la siguiente ruta en el navegador o mediante los botones del menú superior "/admin/config/development/backup_migrate" y crearemos la primera copia estable.

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

Tan pronto como veamos el mensaje de confirmación de que se ha realizado la copia correctamente, nos toca continuar con el proceso de creación del tipo de contenido y posteriormente su colocación en un módulo personalizado, para que podamos reutilizarlo en cualquier otro proyecto o que nos sirva de base para contenidos más complejos.

PASO 1 CREACIÓN DEL TIPO DE CONTENIDO:

Empezaremos con el proceso de crear nuestro tipo de contenido, añadiéndole los campos correspondientes, funcionalidades y estructura. Es importante que tengas muy claro si tu contenido tendrá dependencias de otros contenidos como vocabularios, referencias a otros contenidos o formularios, etc. La idea es que tu tipo de contenido, tal y como lo definas esté disponible para cualquier otra web de Drupal 8 o 9 o que te sirva como punto de partida para desarrollar otros contenidos más complejos partiendo de una base predefinida.

En este ejercicio, vamos a crear un tipo de contenido llamado "Servicio", al que añadiremos dos campos ( Imagen servicio y Descripción del servicio ), de esta forma podrás apreciar mejor todos los elementos relacionados según el tipo de campo que prefieras emplear.

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

PASO 2 CREACIÓN DEL MÓDULO PERSONALIZADO:

     Básicamente, vamos a crear una carpeta con el nombre de nuestro módulo, y la colocaremos dentro de la carpeta "modules/custom", para mantener mejor ordenado el desarrollo de nuestra web. Te recomiendo que utilices el mismo nombre que tendrá tu tipo de contenido y luego añadiremos el archivo "TUMODULO.info.yml", que es necesario para que Drupal lo reconozca como módulo, acompañado de dos carpetas adicionales "config" + "install", donde tendremos que colocar todos los demás archivos relacionados con la definición de nuestro contenido.

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

PASO 3 EXPORTACIÓN Y CREACIÓN DE ARCHIVOS:

     Aquí es donde viene la novedad y verdadera ventaja, de utilizar este método para la creación de tus contenidos en un módulo personalizado, en lugar de tener que programar todo desde cero, disminuyendo así considerablemente la generación de errores e investigación de posibles fallos de estructura y ejecución, como en versiones anteriores de Drupal.

     La idea consiste en utilizar la exportación de configuración, incluida en la interfaz de usuario a partir de Drupal 8, para no tener que memorizar un montón de líneas de código, tabulaciones específicas y otras características obligatorias. Haciendo que tus desarrollos puedan ponerse en marcha en el menor tiempo posible.

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

     Como en cualquier desarrollo, la clave está en los detalles. Debes prestar mucha atención de no saltarte ningún paso del procedimiento, durante la creación y todo saldrá según lo que esperas.

     LO QUE SIEMPRE DEBES VERIFICAR:

     1.- El tipo de contenido: El primer archivo que debes añadir a tu módulo, siempre dentro de la carpeta "config/install" es el que define tu tipo de contenido, por ejemplo, el desplegable te mostrará todos los elementos disponibles, si tu contenido a exportar es un nodo, debes elegir "Tipo de contenido" o "Content Type", pero también podrías exportar cualquier otro elemento, por lo tanto, podrás usar "Tipo de parrafo" o "Paragraphs Type", "Bloque personalizado" o "Custom Block", etc.

     El proceso siempre debería ser igual, primero creas el archivo con el nombre sugerido en la parte inferior de la ventana de exportación y lo guardas en la dentro de la carpeta "config/install" de tu módulo personalizado.

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

A continuación, como sugerencia, en la primera línea de cada archivo, pega el nombre sugerido como comentario, o sea, poniéndole una almohadilla delante, de esta forma ayudarás a Drupal a identificar el archivo y a ti de guía para confirmar si haz cambiado el nombre del archivo por error.

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

     Por último, copia todo el código que está justo debajo del UUID en la interfaz y pégalo en cada uno de tus archivos, dejando algo de espacio a partir del comentario que haz pegado al principio.
 

     2.- Todos los contenidos tienen obligatoriamente tres archivos fundamentales:

  • core.entity_form_display.node.servicio.default.yml: Que define el formulario que se utilizará para crear el contenido.
  • - core.entity_view_display.node.servicio.default.yml: Que define la forma de presentación del contenido.
  • node.type.servicio.yml: Define el tipo de contenido.

El resto de archivos que formarán tu módulo, serán los campos que vienen por defecto o que han sido creados por ti, como taxonomías, patrones de url, campos referenciados a otros contenidos, etc.

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

     3.- Cada campo tiene dos archivos uno que define sus propiedades específicas, empieza por "field.field", ejemplo "field.field.node.servicio.field_descripcion_del_servicio.yml" y otro que define la manera en que serán guardados los datos, empieza por "field.storage", ejemeplo "field.storage.node.field_descripcion_del_servicio.yml"

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

Custom Module Drupal  | www.drupaladicto.com - Consultor y formador especializado en Drupal y Symfony

     Por lo tanto al crear el archivo para cada campo asegúrate de hacerlo con sus correspondencias, antes de pasar a los archivos del siguiente campo, así tendrás más control si quieres modificar los nombres que crea Drupal a los campos por defecto y evitas errores por falta de algún archivo equivalente. 
 

     4.- No olvides añadir dependencias. Siempre que vayas a crear contenidos siguiendo este método, añade al menos una dependencia en el archivo info.yml de tu módulo, eso facilitará que te acostumbres mejor a la estructura de creación de este archivo.

PHPUnit en Drupal 8 | Prueba del navegador

Texto

En este tutorial abarcaremos los conceptos básicos de las pruebas del navegador PHPUnit en Drupal 9. ¡Al final, deberías poder escribir tu primera prueba del navegador!

     Para este ejemplo, usaremos el módulo Rules, ya que podemos incluir algunas pruebas funcionales del navegador. Luego, el tutorial explicará cómo probar la interfaz de usuario de Rules, para asegurarse de que funcione correctamente.

     Prerrequisitos:

     Una instalación de Drupal 8 funcionando:

     - Cómo instalar cualquier versión Drupal 8 usando Composer
 

     - Cómo Instalar LAMP usando WSL2 en Windows 10 (1era Parte)

     Composer instalado:

     - Cómo instalar Composer 2 en Ubuntu 20.04

      Módulos instalados:

       RulesAdmin ToolbarPathauto

    Configuración para el tutorial

        Primero, necesitaremos asegurarnos de que el módulo  Rules esté instalado (descárguelo y agréguelo a su carpeta de módulos). PHPUnit es parte de las dependencias de Composer del núcleo de Drupal, así que asegúrese de haber ejecutado la instalación de composer en tu Drupal 8. Familiarícese con la ejecución de pruebas PHPUnit y asegúrese de habilitar BROWSERTEST_OUTPUT_DIRECTORY e printerClass en su archivo phpunit.xml como se explica en esa página.

   ¿Qué debería probar con BrowserTestBase?

        BrowserTestBase le ofrece una forma de probar comportamientos e interacciones basados en la web. Por ejemplo, si desea verificar que se requiere un determinado permiso antes de que un usuario pueda visitar una determinada página, debe crear un usuario sin ese permiso e intentar visitar la página, y luego comparar el resultado con otro intento con ese permiso. 

        BrowserTestBase satisface la necesidad de realizar pruebas de alto nivel basadas en solicitudes de integraciones entre varios subsistemas en Drupal. Por lo general, las pruebas de BrowserTestBase no deberían requerir temas o configuración específicos del sitio, aunque es posible escribir pruebas con esos requisitos. Otras herramientas como Behat podrían usarse para pruebas de comportamiento específicas del sitio.

        Finalmente, BrowserTestBase reemplaza el WebTestBase heredado basado en Simpletest. Si está migrando desde Simpletest de Drupal, le resultará relativamente fácil convertir las pruebas de WebTestBase a BrowserTestBase.

   Cómo funcionan las pruebas del navegador de Drupal

      La mayor parte de Drupal es una funcionalidad orientada a la web, por lo que es importante tener una forma de ejercitar estas funciones. Las pruebas del navegador crean una instalación completa de Drupal y un navegador web virtual y luego usa el navegador web virtual para guiar la instalación de Drupal a través de una serie de pruebas, tal como lo haría si lo estuviera haciendo a mano.

   Acerca del escenario de prueba del módulo Rules

        El módulo Reglas proporciona una interfaz de usuario para los administradores donde pueden crear reglas. Consiste en múltiples páginas y formularios que queremos probar, los cuales están protegidos con permisos de usuario para que solo los administradores puedan acceder a ellos. El escenario de prueba más simple está en rules/tests/src/Functional/UiPageTest.php.

    Descubriendo lo que necesitamos probar

        Si instala el módulo Reglas, puede seguir manualmente los pasos y ver lo que cree que debe probarse. Si todavia no haz trabajado con Rules, te enseño todo lo que necesitas asaber en este artículo Cómo crear nuestra primera regla con Rules

        Visite Configuración> Flujo de trabajo> Reglas donde debería ver una página que dice "Aún no hay una regla de reacción". en la tabla de reglas. Puede agregar reglas y configurarlas, pero como primer paso, queremos probar que esta página de descripción general del administrador realmente existe y dice que aún no hay reglas.

   Escribir un archivo de prueba

       Ahora es el momento de crear nuestras pruebas, que haremos en la carpeta rules / tests / src / Functional. PHPUnit encontrará automáticamente los archivos de prueba del navegador en la carpeta tests / src / Functional de un módulo.

     Hay cuatro pasos básicos involucrados en la creación de una prueba:

  • Crear la estructura (simplemente crear una clase que herede de \ Drupal \ Tests \ BrowserTestBase o una clase de prueba de navegador similar)
  • Inicializar el caso de prueba con cualquier creación o configuración de usuario que deba realizarse
  • Crear pruebas reales dentro del caso de prueba
  • Y, por supuesto, intentar desesperadamente averiguar por qué nuestra prueba no funciona de la manera que esperamos y depurar la prueba (y quizás el módulo)

     Para empezar con la creación de nuestro archivo de pruebas, necesitaremos extender la clase BrowserTestBase.

namespace Drupal\Tests\rules\Functional;

use Drupal\Tests\BrowserTestBase;

/**
 * Tests that the Rules UI pages are reachable.
 *
 * @group rules_ui
 */
class UiPageTest extends BrowserTestBase {

     Como siguiente paso, debemos especificar la lista de módulos que deben habilitarse para la ejecución de prueba. En nuestro caso, esto es, por supuesto, las Rules.

  /**
   * Modules to enable.
   *
   * @var array
   */
  protected static $modules = ['node', 'rules'];

   Luego viene el setUp() opcional . Aquí es donde debemos hacer todo lo que sea necesario para que esta instancia de Drupal funcione como queremos. Tenemos que pensar: "¿Qué tuve que hacer para pasar de una instalación de Drupal de stock a donde puedo ejecutar esta prueba?". No todos los casos de prueba necesitarán esto, pero aquí hay un ejemplo en el que preparamos un tipo de contenido (tomado de las reglas ConfigureAndExecuteTest):

  /**
   * {@inheritdoc}
   */
  protected function setUp(): void {
    parent::setUp();

    // Create an article content type that we will use for testing.
    $type = $this->container->get('entity_type.manager')->getStorage('node_type')
      ->create([
        'type' => 'article',
        'name' => 'Article',
      ]);
    $type->save();
    $this->container->get('router.builder')->rebuild();
  }

   Tenga en cuenta que si implementa el método setUp(), empiece por ejecutar el método parent::setUp() como en el ejemplo.

   Crear prueba específica: la página de reglas de reacción 

     Ahora necesitamos crear pruebas específicas para ejercitar el módulo. Simplemente creamos métodos de nuestra clase de prueba, cada uno de los cuales realiza una prueba en particular. Todos los métodos deben comenzar con 'prueba' en minúsculas. Cualquier método con visibilidad pública que comience de esta manera será reconocido automáticamente por PHPUnit y se ejecutará cuando se solicite.

     Nuestra primera prueba comprobará la página en admin/config/workflow/rules:

  /**
   * Tests that the reaction rule listing page works.
   */
  public function testReactionRulePage() {
    $account = $this->drupalCreateUser(['administer rules']);
    $this->drupalLogin($account);

    $this->drupalGet('admin/config/workflow/rules');
    $this->assertSession()->statusCodeEquals(200);

    // Test that there is an empty reaction rule listing.
    $this->assertSession()->pageTextContains('There is no Reaction Rule yet.');
  }

   setUp() y pruebas individuales

     Cada función de prueba tendrá una instancia de Drupal completamente nueva para ejecutar pruebas. Esto significa que lo que haya creado en una función de prueba anterior ya no estará disponible en la siguiente.

     Considere este ejemplo, tomado de Rules UIPageTest.php -extraction:

namespace Drupal\Tests\rules\Functional;

class UiPageTest extends RulesBrowserTestBase {

 /**
   * Modules to enable.
   *
   * @var array
   */
  protected static $modules = ['rules'];

  /**
   * {@inheritdoc}
   */
  protected function setUp() {
    parent::setUp();
    // ....
  }
  public function testReactionRulePage() {
    $account = $this->drupalCreateUser(['administer rules']);
    $this->drupalLogin($account);
    // .....
  }

  public function testCreateReactionRule() {
    $account = $this->drupalCreateUser(['administer rules']);
    $this->drupalLogin($account);
    // .....
  }

  public function testCancelExpressionInRule() {
    // Setup a rule with one condition.
    $this->testCreateReactionRule();
    // .....
  }

}

     Aqui ambos testReactionRulePage() y testCreateReactionRule deben crear su propia $account, porque ambas pruebas se ejecutan en sus propias instancias de Drupal y el Drupal de la última función no tiene cuentas a menos que se cree.

     Sin embargo, otras pruebas (posteriores) pueden depender del contenido creado en otras funciones de prueba si ejecutan esas funciones por separado, como lo hace testCancelExpressionInRule ().

     Por otro lado, la función setUp() se ejecuta antes de cada función de prueba, por lo que también puede usarlo para preparar el entorno de prueba.

   drupalGet() y Assertions

       El código anterior hizo una solicitud GET muy simple en la página admin / config / workflow / rules. Carga la página, luego verifica el código de respuesta y afirma que encontramos el texto apropiado en la página.

       La mayoría de las pruebas seguirán este patrón:

  1. Haga un $ this-> drupalGet ('some / path') para ir a una página
  2. Use $ this-> clickLink (..) para navegar por enlaces en la página
  3. Use $ this-> getSession () -> getPage () -> fillField (...); para completar los campos del formulario
  4. Envíe formularios con $ this-> getSession () -> getPage () -> pressButton (...); o use $ this-> submitForm (...); (o use el método obsoleto drupalPostForm ())
  5. Haga una o más afirmaciones para comprobar que lo que vemos en la página es lo que deberíamos ver.

   Rellenar formularios

    $page = $this->getSession()->getPage();

    $page->fillField('form_element', 'value');
    $page->selectFieldOption('form_element', 'value')

   Assertions (Afirmaciones)

       Hay decenas de posibles assertions. A continuación se muestran algunos ejemplos. Cuando vaya más allá de este tutorial, querrá mirar la clase \ Behat \ Mink \ WebAssert y su hijo de Drupal \ Drupal \ Tests \ WebAssert para leer más sobre ellos.

    $this->assertOptionSelected('form_element', 'value');
    $this->assertFieldByName('form_element');

    $web_assert = $this->assertSession();

    $web_assert->addressEquals('node/1');
    $web_assert->pageTextContains("Expected text");
    $web_assert->pageTextNotContains("Unexpected text");

   Ejecutando la prueba

     Usaremos la línea de comando para ejecutar la prueba. Esto se documenta con más detalle en la ejecutando la página de pruebas PHPUnit.

     Ejecutemos solo el método testReactionRulePage () de UiPageTest:

cd core
../vendor/bin/phpunit --filter testReactionRulePage ../modules/rules/tests/src/Functional/UiPageTest.php
PHPUnit 4.8.11 by Sebastian Bergmann and contributors.

.

Time: 25.14 seconds, Memory: 6.00Mb

OK (1 test, 5 assertions)

HTML output was generated
http://drupal-8.localhost/sites/simpletest/browser_output/Drupal_Tests_rules_Functional_UiPageTest-13-411368.html
http://drupal-8.localhost/sites/simpletest/browser_output/Drupal_Tests_rules_Functional_UiPageTest-14-411368.html
http://drupal-8.localhost/sites/simpletest/browser_output/Drupal_Tests_rules_Functional_UiPageTest-15-411368.html

   ¡Sí, nuestra prueba ha pasado! También generó un par de archivos de salida HTML, donde puede ver las páginas que visitó el navegador durante la prueba. Las páginas se escriben en archivos vinculados como, por ejemplo, arriba, por lo que puede inspeccionarlos después de que se haya ejecutado la prueba.

   Una prueba de demostración fallida

      Realmente no nos enseña mucho tener un examen que tenga éxito. Veamos uno que falla.

     Modificaremos la prueba para provocar una falla en la prueba; afirmaremos que la página contiene un texto diferente, que por supuesto no está allí.

  /**
   * Tests that the reaction rule listing page works.
   */
  public function testReactionRulePage() {
    $account = $this->drupalCreateUser(['administer rules']);
    $this->drupalLogin($account);

    $this->drupalGet('admin/config/workflow/rules');
    $this->assertSession()->statusCodeEquals(200);

    $this->assertSession()->pageTextContains('some text not actually on the page');
  }

   Ejecute la prueba y vea el resultado:

../vendor/bin/phpunit --filter testReactionRulePage ../modules/rules/tests/src/Functional/UiPageTest.php 
PHPUnit 4.8.11 by Sebastian Bergmann and contributors.

E

Time: 24.38 seconds, Memory: 6.00Mb

There was 1 error:

1) Drupal\Tests\rules\Functional\UiPageTest::testReactionRulePage
Behat\Mink\Exception\ResponseTextException: The text "some text not actually on the page" was not found anywhere in the text of the current page.

/home/klausi/workspace/drupal-8/vendor/behat/mink/src/WebAssert.php:787
/home/klausi/workspace/drupal-8/vendor/behat/mink/src/WebAssert.php:262
/home/klausi/workspace/drupal-8/modules/rules/tests/src/Functional/UiPageTest.php:37

FAILURES!
Tests: 1, Assertions: 5, Errors: 1.

HTML output was generated
http://drupal-8.localhost/sites/simpletest/browser_output/Drupal_Tests_rules_Functional_UiPageTest-16-425496.html
http://drupal-8.localhost/sites/simpletest/browser_output/Drupal_Tests_rules_Functional_UiPageTest-17-425496.html
http://drupal-8.localhost/sites/simpletest/browser_output/Drupal_Tests_rules_Functional_UiPageTest-18-425496.html

     Vaya, algo salió mal y nuestra prueba lo detectó. ¡Hurra!

   Cuándo usar t () en las pruebas del navegador

       ¡Nunca! No, ni en los mensajes de afirmación, ni para las etiquetas de los botones, ni para el texto que afirma en la página. Siempre desea probar la cadena literal en la página, no desea probar el sistema de traducción de Drupal.

   Depurar las pruebas del navegador

      Como ya se mencionó, es muy importante habilitar la salida de depuración en la prueba del navegador para que pueda ver las páginas visitadas por el navegador. Si una prueba falla, PHPUnit detiene la ejecución de la prueba donde falla, lo que significa que el último de los enlaces de salida HTML es la página donde ocurrió el error.

     También puede utilizar la función dump () (proporcionada por el componente Symfony VarDumper), ya sea en su método de prueba o en el código del sitio que se está ejecutando. Esto tiene la ventaja sobre el uso de print o print_r () que su salida no se detecta como un error de prueba.

     También puede usar el método ddm () del módulo Devel para generar un archivo de registro. Configure la ubicación del archivo de registro en su código de prueba de esta manera:

    $config = $this->config('devel.settings');
    $config->set('debug_logfile', '/path/to/file/drupal_debug.txt')->save();
    $config->set('debug_pre', FALSE)->save();

   Escribir una clase base para ampliarla con otras clases de prueba.

      Puede encontrar que algunos de sus códigos de prueba duplican la funcionalidad compartida. En este caso, es posible que desee crear una clase base que luego se amplíe con sus diversas clases de prueba. Al hacer esto, hay 2 cosas importantes a tener en cuenta.

  1. La clase de prueba base debe ser abstracta
  2. La clase de prueba base debe terminar con la palabra Base

     Ejemplo de Clase de prueba base: my_module/Tests/src/Functional/myModuleTestBase.php

<?php

namespace Drupal\Tests\my_module\Functional;

/**
 * To be extended by other test classes.
 */
abstract class myModuleTestBase extends BrowserTestBase {
  protected function setUp() {
    parent::setUp();
    // etc
  }
}

     Ampliando la clase base: my_module/Tests/src/Functional/myModuleSomethingTest.php

<?php

namespace Drupal\Tests\my_module\Functional;

/**
 * Test something about my module.
 *
 * @group my_module
 */
class myModuleSomethingTest extends myModuleTestBase {

  protected function setUp() {
    parent::setUp();
  }

  public function testSomething() {
    // do the test.
  }
}

   SQLite

     El uso de una base de datos SQLite hace que las pruebas sean más rápidas que con un DBMS como MySQL. Porque la base de datos está contenida en solo 1 archivo. Asegúrese de que Drupal no esté usando su conexión de base de datos predeterminada desde el archivo settings.php.

     Una solución sencilla es comprobar el HTTP_USER_AGENT. Ej.:

if ($_SERVER['HTTP_USER_AGENT'] !== 'Drupal command line') {

  $databases['default']['default'] = [
    'database' => 'MY-DATABASE',
    'username' => 'root',
    'password' => 'root',
    'prefix' => '',
    'host' => '127.0.0.1',
    'port' => '',
    'namespace' => 'Drupal\\Core\\Database\\Driver\\mysql',
    'driver' => 'mysql',
    'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
  ];

}

     En su archivo phpunit.xml especifique su conexión de base de datos SQLite (el archivo no debe existir antes):

<env name="SIMPLETEST_DB" value="sqlite://localhost/sites/default/files/db.sqlite"/>

     De lo contrario, obtendrá errores como este:

Exception: PDOException: SQLSTATE[HY000] [2002] Connection refused

   Usar datos de sesión

     Puede inspeccionar los datos de la sesión para la solicitud más reciente de la siguiente manera:

    $session_data = $this->container->get('session_handler.write_safe')->read($this->getSession()->getCookie($this->getSessionName()));
    $session_data = unserialize(explode('_sf2_meta|', $session_data)[1]);

Fuente: https://www.drupal.org/docs/automated-testing/phpunit-in-drupal/phpunit-browser-test-tutorial

PHPUnit | Ejecución de pruebas

Video de Youtube
URL de Video remoto
Texto

     Configuración para ejecutar pruebas PHPUnit

     Antes de entrar en materia sobre el uso de Test Unitarios de Php, en Drupal 8 o 9, tendremos que familiarizarnos con esta actividad, conociendo sus fundamentos y las configuraciones iniciales.

     Prerrequisitos:

       - Asegúrate de que las dependencias de Composer estén instaladas

          Si haz realizado tu instalación de Drupal, utilizando composer desde el repositorio de Drupal.org, y quieres asegurarte de tener además, todas las dependencias necesarias para los test unitarios, puedes hacerlo escogiendo una de las siguientes opciones:

  1. Instalar Composer y ejecutar composer install (o actualizar tu Drupal 8 ó 9 existente, ejecutando composer update)
     
  2. Utilizar una versión de desarrollo (por ejemplo, 9.0.x-dev) en lugar de la que tienes en tu sitio actual.
     
  3. Instale las dependencias de desarrollo que necesita manualmente en el directorio de vendor de Drupal o en otro lugar.

     Yo voy a realizar una instalación de Drupal 8, nueva, utilizando la plantilla drupal/recommended-project, para eso en mi consola, ejecutaré el siguiente comando:

composer create-project drupal/recommended-project:^8 mi_drupal

     Si al instalar tu Drupal, haz utilizado la plantilla de Composer drupal/recommended-project, las dependencias de desarrollo pueden ser instaladas utilizando en tu proyecto una vez instalado, nos colocaremos en la carpeta root de Drupal y ejecutaremos el siguiente comando:

composer require --dev 'drupal/core-dev:^8.9'

 

    Si has instalado Drupal, utilizando git, entonces, instala composer y a continuación ejecuta el siguiente comando para que se descarguen las dependencias:

composer install

   Recuerda que las dependencias de desarrollo, nunca deben instalarse en una producción o en un servidor de acceso público, por razones de seguridad. Ver el announcement about our dev dependency packaging changes para más información.

   Las pruebas de Javascript tienen dependencias adicionales; consulta Running PHPUnit Javascript tests.

   Cómo configurar PHPUnit

   PHPUnit almacena la configuración en el archivo llamado phpunit.xml, ubicado dentro de la carpeta raíz de tu Drupal. Drupal viene con una versión de muestra de esto, puedes encontrarlo dentro de la carpeta core/phpunit.xml.dist, así podrías copiar este archivo para comenzar con tus pruebas.

 

   El lugar de tu archivo de configuración dependerá de tu flujo de trabajo:

  • El ejecutable PHPUnit espera encontrar el archivo de configuración phpunit.xml, dentro de tu carpeta raíz. Esto se puede anular con la opción -c.
     
  • Si estás utilizando Composer para administrar el núcleo de Drupal, la actualización del núcleo sobrescribirá el núcleo / carpeta y eliminará su archivo phpunit.xml

     Una vez hayamos copiado, desde el core/phpunit.xml.dist y renombrado nuestro archivo phpunit.xml, lo abriremos para añadir los siguientes cambios:

  • Añadiremos el valor a la variable SIMPLETEST_BASE_URL con la url de nuestro sitio.
     
  • Configuraremos la variable SIMPLETEST_DB para que apunte a la URL de la base de datos de nuestro Drupal.
     
  • Si estas colocando phpunit.xml en algún lugar que no sea core, tendrás que cambiar el valor del atributo 'bootstrap' de la etiqueta phpunit para reflejar la nueva ubicación.
     
  • Para pruebas funcionales y del kernel, establezca el BROWSERTEST_OUTPUT_DIRECTORY

     El resultado debería verse así:

<phpunit bootstrap="tests/bootstrap.php" colors="true"
         beStrictAboutTestsThatDoNotTestAnything="true"
         beStrictAboutOutputDuringTests="true"
         beStrictAboutChangesToGlobalState="true"
         printerClass="\Drupal\Tests\Listeners\HtmlOutputPrinter">

<php>
  <!-- Set error reporting to E_ALL. -->
  <ini name="error_reporting" value="32767"/>
  <!-- Do not limit the amount of memory tests take to run. -->
  <ini name="memory_limit" value="-1"/>
  <!-- Example SIMPLETEST_BASE_URL value: http://localhost -->
  <env name="SIMPLETEST_BASE_URL" value="http://drupal8.localhost"/>
  <!-- Example SIMPLETEST_DB value: mysql://username:password@localhost/databasename#table_prefix -->
  <env name="SIMPLETEST_DB" value="mysql://drupal8:drupal8@localhost/drupal8"/>
  <!-- Example BROWSERTEST_OUTPUT_DIRECTORY value: /path/to/webroot/sites/simpletest/browser_output -->
  <env name="BROWSERTEST_OUTPUT_DIRECTORY" value="/var/www/sites/simpletest/browser_output"/>
</php> 
</phpunit>

 

   Una vez hecho todo esto, podremos ejecutar cualquier prueba, sin tener que volver a realizar toda esta configuración. 

   Busque y reemplace rápidamente los valores con sed desde la línea de comando. Los valores de ejemplo son para Lando y se supone que estamos ubicados dentro de la carpeta principal de Drupal, al igual que el archivo de configuración phpunit.xml. Ajústalo para igualarlo a tu configuración:

$ cd core
$ cp phpunit.xml.dist phpunit.xml
$ sed -i 's|name="SIMPLETEST_BASE_URL" value=""|name="SIMPLETEST_BASE_URL" value="http://d8dev\.lndo\.site"|g' phpunit.xml
$ sed -i 's|name="SIMPLETEST_DB" value=""|name="SIMPLETEST_DB" value="mysql://drupal8:drupal8@database/drupal8"|g' phpunit.xml
$ sed -i 's|name="BROWSERTEST_OUTPUT_DIRECTORY" value=""|name="BROWSERTEST_OUTPUT_DIRECTORY" value="../sites/simpletest/browser_output"|g' phpunit.xml

     Creando un directorio para la salida HTML

        Las pruebas funcionales pueden generar las páginas HTML que ve el código de ejecución de la prueba. Estos se generan como archivos HTML sin formato. Para proporcionar una ubicación en la que escribirlos, crearemos un directorio llamado sites/simpletest y nos aseguraremos de que el servidor web pueda escribirlo. Está bien hacer que este directorio sea "world-writable", ej.:

mkdir -p sites/simpletest/browser_output
chmod -R 777 sites/simpletest

 

     Locate the PHPUnit binary

       La ubicación relativa del binario PHPUnit depende de cómo instale Drupal.

  • Si hemos instalado Drupal usando un paquete, ejecutaremos composer update, el directorio vendor está dentro de la raíz de Drupal (adyacente a 'core'). Las instrucciones en esta página asumen que esta es su configuración.
  • Si lo hicimos usando composer require drupal/drupal , terminas con un directorio de proveedores fuera de la raíz de Drupal (arriba del 'core'). Es posible que debamos ajustar la ruta a PHPUnit en los comandos que se dan en esta página:
    vendor/bin/phpunit se convertirá en ../vendor/bin/phpunit and ../vendor/bin/phpunit se convertirá en ../../vendor/bin/phpunit.

     Dependiendo de su flujo de trabajo de desarrollo, puede resultarle útil crear un link simbólico a PHPUnit desde / usr / local / bin ( cd /usr/local/bin; ln -s /var/www/html/vendor/bin/phpunit), o parecido, o añadir vendor/bin a tu PATH.

    Comprobando que se verifiquen las aserciones en tiempo de ejecución

        Al ejecutar pruebas de phpunit, es importante asegurarnos de que se verifiquen, las declaraciones de aserción en tiempo de ejecución. Consulte la nota sobre la ejecución de pruebas localmente en el  change notice about runtime assertions , para más información al respecto.

     Ejecutando pruebas

        Todos los comandos de ejemplo en este documento asumen que estamos dentro del directorio raíz  y nuestro archivo ejecutable de configuración phpunit.xml, se encuentra dentro de la carpeta core.

     Al ejecutar \Drupal\Tests\datetime\Unit\Plugin\migrate\field\DateFieldTest, por ejemplo, su comando se vería así:

../vendor/bin/phpunit modules/datetime/tests/src/Unit/Plugin/migrate/field/DateFieldTest.php

     Su ruta al ejecutable phpunit puede ser diferente a la anterior.

     Ejecute todas las pruebas unitarias de PHPUnit

        Para ejecutar las pruebas unitarias en OS X, Linux u otros sistemas * nix:

../vendor/bin/phpunit --testsuite=unit

     Nota: Todas las pruebas, incluidas las ubicadas en [drupalroot]/modules o [drupalroot]/sites/*/modules, se ejecutan desde la carpeta principal con el comando:

../vendor/bin/phpunit

 

     Debemos tomar en cuenta, que no necesita tener una instalación de Drupal en funcionamiento, para ejecutar pruebas unitarias basadas en PHPUnit de esta manera. Las pruebas de PHPUnit están aisladas de Drupal y no las necesitan para ejecutarse.

     En Windows, el enlace simbólico almacenado en vendor/bin/phpunit no funcionará. Debemos usar la ruta completa al ejecutable PHPUnit:

../vendor/phpunit/phpunit/phpunit

     Problemas de permisos

        Las pruebas funcionales deben invocarse con un usuario del mismo grupo que el usuario del servidor web. Puede configurar Apache (o Nginx) para que se ejecute como su propio usuario del sistema o ejecutar pruebas como un usuario privilegiado.

        Para desarrollar localmente, un enfoque sencillo, pero también menos seguro, es para ejecutar pruebas como su propio usuario del sistema. Para lograrlo, cambie el usuario Apache predeterminado para que se ejecute como su usuario del sistema. Normalmente, necesitaría modificar en Linux `/etc/apache2/envvars` o en Mac el `/etc/apache2/httpd.conf`

Fuente: https://www.drupal.org/node/2116263

Entity API | Introducción en Drupal 8/9

Video de Youtube
URL de Video remoto

Breve repaso sobre Programación Orientada a Objetos (OOP)

     La Programación Orientada a Objetos (OOP, Object Oriented Programming) es una manera de organizar el código que permite a los desarrolladores agrupar tareas similares en clases. Con esta implementación nuestro código se hace más fácil de mantener y evita repeteciones innecesarias (DRYDon't Repeat Yourself).

     Una de las ventajas de OOP es que si modificamos parte de la información en el script, normalmente sólo hace falta cambiarla en un sitio para actualizar el código. Por ejemplo si se ha usado un sistema de bases de datos como MySQL utilizando PDO (PHP Database Objects)  y queremos cambiar a otro, los métodos que utilizaremos para las sentencias serán los mismos.

     Una clase se puede ver como el esquema de una casa y un objeto como la casa ya construida. Esto significa que en la clase se define su estructura, sus medidas y características y las relaciones entre ellas y el objeto es la casa construida con todos los datos y organización definidos en ella. Se pueden construir las casas (objetos) que se quieran con esa estructura (clase), y cada una tendrá sus propias familias y decoración.

     Para definir una clase se utiliza la palabra reservada class, seguida del nombre de clase y dos llaves, entre las cuales se guardará toda la información del esquema. Esta información se guarda en propiedades (así es como se les llama a las variables dentro de las clases), métodos (funciones dentro de las clases) y constantes.

     El nombre de la clase puede ser cualquier etiqueta válida siempre que no sea una palabra reservada de PHP. Un nombre válido comienza con una letra o guión bajo, seguido de una cantidad arbitraria de letras, números o guiones bajos.

class NombreClase {
    // Declaración de una propiedad
    public $variable = 'Un valor cualquiera';
    // Declaración de un método
    public function mostrarVariable(){
        echo $this->variable;
    }
}

$this es una pseudo-variable que está disponible cuando una clase se instancia. La clase instanciada es un objeto, y $this hace referencia a ese objeto. Vamos a ver un ejemplo en el que se ve más claro a qué hace referencia $this:

class ClaseA {
    function funcionA()
    {
        if(isset($this)){
            echo '$this está definido, su clase es: ';
            // La función get_class devuelve el nombre de la clase de un objeto:
            echo get_class($this) . "<br>";
        } else {
            echo '$this no está definido <br>';
        }
    }
}
class ClaseB {
    function funcionB() {
        // Se llama estáticamente a la función A, pero ésta no es estática
        // Si E_STRICT está activado generará un aviso
        ClaseA::funcionA();
    }
} 

     Para crear una instancia de una clase, se utiliza la palabra new. Un objeto será creado siempre, a no ser que el objeto tenga un constructor definido y lance una excepción como error. Las clases han de definirse antes de instanciarse.

    Introducción a Entity API en Drupal 8/9

         Entity System es la API para la manipulación de entidades (CRUD: crear, leer, actualizar, eliminar). La validación de entidades tiene su propia API (que podría validar una entidad guardada a través de REST, en lugar de un formulario, por ejemplo).

     El sistema de entidades Drupal 8

          En Drupal las entidades son clases con sus respectivos métodos

 

 

Entidades Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Ambos tipos están definidos y documentados en interfaces.

     Entidad de configuración y entidad de contenido

     Los tipos de entidad en el núcleo vienen en dos variantes.

     Entidad de configuración (Configuration Entity): Utilizado por el sistema de configuración. Admite traducciones y puede proporcionar valores predeterminados personalizados para las instalaciones. Las entidades de configuración se almacenan dentro de la tabla de la base de datos de configuración común como filas.

     Entidad de contenido (Content Entity): Consiste en campos configurables y base, y puede tener revisiones y traducciones de soporte. Las entidades de contenido se almacenan en una tabla de base de datos personalizada como filas. El nombre de la tabla es el mismo que el de la entidad de contenido "id", y las columnas se definen mediante el método "baseFieldDefinitions" de la entidad.

     Paquetes (Bundles)

        Los paquetes son diferentes variantes de un tipo de entidad. Por ejemplo, con el tipo de entidad de nodo, los paquetes son los diferentes tipos de nodo, como 'artículo' y 'página'.

        Normalmente, un paquete está representado por una entidad de configuración, aunque existen otros modelos en los módulos contrib. Entonces, en el ejemplo de nodo, el tipo de nodo 'artículo' es en sí mismo una entidad de configuración. La configuración almacena las diferencias entre los tipos de entidades de contenido, como la configuración y los campos. Al crear un nuevo tipo de entidad que tiene entidades de paquete, creará tanto una Entidad de contenido que administrará los detalles y operaciones del contenido, como una Entidad de configuración que manejará las diferencias entre los tipos de entidad de contenido.

     Anotaciones (Annotations):

          Al crear un nuevo tipo de entidad, deberá utilizar el sistema de anotaciones integrado en el núcleo. Las anotaciones parecen comentarios de docblock encima de la clase, pero el núcleo de Drupal las analiza y almacena en caché. En muchos sentidos, las anotaciones reemplazan algunos de los ganchos de estilo más antiguos utilizados en Drupal 7.

     Analizador de anotaciones (Annotation parser):

        Las anotaciones se leen y analizan en tiempo de ejecución mediante un motor de anotaciones. Drupal 8 usa el analizador de anotaciones de Doctrine, que lo convierte en un objeto que PHP puede usar.

       Sintaxis: la sintaxis de la anotación está rodeada por @ClassName (), se compone predominantemente de pares clave / valor y puede contener matrices que usan llaves. Las claves de nivel superior no deben estar entre comillas, mientras que las claves de matriz deben hacerlo. Cada par clave / valor debe estar en su propia línea, y esa línea debe terminar con una coma. Ciertas funciones se pueden ejecutar en valores, en particular la función @Translation ().

      Ejemplo de sintaxis de anotación que no funciona:

/**
 * @ContentEntityType(
 *   id = "my_entity_type_id",
 *   label = @Translation("My entity type label"),
 *   example_pair = "this_examples_value",
 *   example_array = {
 *     "array_key" = "array_value",
 *     "some_other_key" = "some_other_value",
 *   },
 * )
 */

Anotaciones comunes de nivel superior

 

 

Entidades Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Manipuladores o (Handlers)

     Los controladores se definen en la anotación de la entidad como una matriz. Apoyan a la entidad al mapear ciertas partes de su ejecución a otras clases de PHP. Esas clases "manejarán" las partes asignadas de la ejecución de la entidad.

     Almacenamiento (Storage): maneja la carga, el guardado y la eliminación de la entidad. De forma predeterminada, las entidades de contenido usan Drupal \ Core \ Entity \ Sql \ SqlContentEntityStorage mientras que las entidades de configuración usan Drupal \ Core \ Config \ Entity \ ConfigEntityStorage. Puede definir un controlador de almacenamiento para ampliar los métodos de almacenamiento predeterminados de su entidad. Es posible que desee hacer esto para proporcionar métodos adicionales para recopilar los ID de revisión de la entidad o determinar el número de traducciones que tiene una entidad.

     Ejemplo: "storage" = "Drupal\node\NodeStorage",

     Formulario (Form): en la anotación de controladores de cualquier entidad, hay varios controladores de formularios que asignan los formularios de agregar, editar y eliminar de la entidad a otras clases de PHP.

     Ejemplo:

"form" = {
  "add" = "Drupal\block\BlockForm",
  "edit" = "Drupal\block\BlockForm",
  "delete" = "Drupal\block\Form\BlockDeleteForm",
}

     Alternativamente, puede definir un formulario "predeterminado" para manejar tanto el formulario de "agregar" como el de "editar" en lugar de definirlos por separado. Vale la pena señalar que el formulario "eliminar" casi siempre será manejado por una clase separada de los otros formularios. Esto se debe a que el formulario de eliminación es generalmente un "formulario de confirmación" que simplemente pregunta si el usuario está seguro de que desea eliminar la entidad.

     Creador de vistas (View builder): este controlador proporciona una clase que manejará la salida de la entidad cuando la vea el usuario final. Por ejemplo, al visitar un nodo en un sitio de Drupal 8, la salida de la entidad es manejada por la clase NodeViewBuilder.

     Ejemplo: "view_builder" = "Drupal\node\NodeViewBuilder",

     Generador de listas (List builder ): la clase del generador de listas manejará la lista de entidades con fines administrativos. Esta clase definirá el contenido de los encabezados, filas y operaciones cuando visite la página de administración de entidades para la entidad. Por ejemplo, al visitar el URI / admin / content de su sitio Drupal, el contenido de la tabla lo proporciona la clase de constructor de listas de la entidad Node.

   Ejemplo: "list_builder" = "Drupal\node\NodeListBuilder",

   Proveedor de ruta (Route provider): un controlador opcional que, si se implementa, genera rutas para la administración de su entidad. La implementación de este controlador puede reemplazar la necesidad de rutas de entidad definidas en el archivo routing.yml de su módulo. Tenga en cuenta que route_provider funciona junto con los enlaces definidos en su entidad (consulte el ejemplo a continuación en la sección Enlaces). La anotación route_provider es una matriz.
     Ejemplo:

"route_provider" = {
  "html" = "Drupal\Core\Entity\Routing\AdminHtmlRouteProvider",
}

     Acceso (Access): el controlador de acceso se puede usar para verificar dinámicamente los permisos de su entidad. Es una asignación a una clase que implementa EntityAccessControlHandlerInterface. Core proporciona una implementación de esta interfaz como EntityAccessControlHandler, pero para un control confiable sobre su entidad, querrá extender esa clase con la suya propia.

     Datos de vistas (Views data): el controlador views_data permite que una entidad amplíe el módulo Vistas con datos personalizados proporcionados por su entidad. Esto puede ser para agregar baseFieldDefinitions de su entidad como campos de Vistas, unir tablas en relaciones de entidad u otras alteraciones de datos relacionadas con Vistas.

     Ejemplo: "views_data" = "Drupal\node\NodeViewsData",

     Esquema de almacenamiento (Storage schema): el controlador storage_schema se puede implementar para modificar aún más la configuración de almacenamiento de la base de datos de la entidad. Por ejemplo, agregar índices de tabla adicionales.

     Ejemplo: "storage_schema" = "Drupal\node\NodeStorageSchema",

     Traducción (Translation): el controlador de traducción se puede utilizar para modificar la forma en que los formularios de su entidad interactúan con las traducciones.

     Ejemplo: "translation" = "Drupal\node\NodeTranslationHandler",

  Ejemplo completo de Manipuladores (handlers):

     El núcleo de Drupal proporciona controladores que puede usar listos para usar, pero en muchos casos querrá extender estas clases con las suyas propias para un mayor control y personalización de su entidad. Este ejemplo muestra una anotación de controladores más completa, utilizando las clases principales que puede ampliar.

handlers = {
  "view_builder" = "Drupal\Core\Entity\EntityViewBuilder",
  "list_builder" = "Drupal\Core\Entity\EntityListBuilder",
  "access" = "Drupal\Core\Entity\EntityAccessControlHandler",
  "views_data" = "Drupal\views\EntityViewsData",
  "storage" = "Drupal\Core\Entity\Sql\SqlContentEntityStorage",
  "storage_schema" = "Drupal\Core\Entity\Sql\SqlContentEntityStorageSchema",
  "translation" = "Drupal\content_translation\ContentTranslationHandler",
  "form" = {
    "default" = "Drupal\Core\Entity\ContentEntityForm",
    "add" = "Drupal\Core\Entity\ContentEntityForm",
    "edit" = "Drupal\Core\Entity\ContentEntityForm",
    "delete" = "Drupal\Core\Entity\ContentEntityDeleteForm",
  },
  "route_provider" = {
    "html" = "Drupal\Core\Entity\Routing\AdminHtmlRouteProvider",
  },
},

     Enlaces:

         Los enlaces se definen en la anotación de entidad con la sintaxis de matriz. Los enlaces tienen un conjunto específico de claves cuyo valor son URI donde se puede administrar el tipo de entidad o entidades individuales de ese tipo. Tanto las entidades de contenido como las de configuración pueden tener estos enlaces definidos.

     Ejemplo:

id = "node",
handlers = {
  "route_provider" = {
    "html" = "Drupal\Core\Entity\Routing\AdminHtmlRouteProvider"
  }
},
links = {
  "canonical" = "/node/{node}",
  "add-page" = "/node/add",
  "add-form" = "/node/add/{node_type}",
  "edit-form" = "/node/{node}/edit",
  "delete-form" = "/node/{node}/delete",
  "collection" = "/admin/content",
},

     La creación de estos enlaces no crea automáticamente las rutas para esos URI. Para que estos enlaces sean accesibles, nuestro módulo deberá implementar su propio archivo routing.yml o usar un controlador "route_provider" en la anotación de la entidad.

     Enlaces y proveedor de rutas (Links & Route Provider):

     Los enlaces anteriores que trabajan junto con un "route_provider" harán que las siguientes rutas nombradas estén disponibles para Drupal.

 

Entidades Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Uso de enlaces:

          Se puede acceder a estos enlaces con el método toUrl () de una entidad:

$view_url_object = $entity->toUrl();  // Default is 'canonical'
$edit_url_string = $entity->toUrl('edit-form')->toString();

Fuente: Página oficial de Drupal

Tipos de entidad en Drupal 9

Video de Youtube
URL de Video remoto
Texto

Si no ves el video, puedes refrescar el navegador, presionando (Ctrl+Shift+R | Ctrl+F5 o Shift+F5), o abrirlo directamente desde el Canal de Youtube... HAZ CLIC AQUI

     Siguiendo con el aprendizaje sobre la API de Drupal, hoy nos toca hablar sobre los Tipos de entidades.

     En Drupal 7, las entidades eran objetos stdClass genéricos.

     A partir de Drupal 8, las entidades ahora son objetos de tipo específico, y cada tipo de entidad define una clase que se utilizará para las instancias de la entidad dada.

Tipos de entidad Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Requerimientos:

          Las clases de entidad (Entity classes), deben colocarse en el subespacio de nombres de entidad del módulo que proporciona el tipo de entidad, p. Ej. \ Drupal \ [nombre_módulo] \ Entidad. Esto significa que los archivos PHP de clase de entidad se pueden encontrar en el directorio src / Entity de un módulo.

Tipos de entidad Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

          El docblock de la clase debe contener una anotación EntityType que defina los metadatos para las entidades de ese tipo. Estos incluyen cosas como la etiqueta del tipo de entidad, controladores, tablas, etc. Para obtener una lista documentada de todas las propiedades de metadatos disponibles, consulte la clase \Drupal\Core\Entity\Annotation\EntityType Haz clic aquí.

Tipos de entidad Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

     Nomenclatura del Tipo de entidad:

          Los nombres de tipo de entidad deben tener el prefijo del nombre del módulo si el tipo de entidad y el nombre del módulo no son los mismos. No es necesario prefijar la clase del tipo de entidad en sí, ya que vive dentro del espacio de nombres del módulo de definición, siempre que sea lo suficientemente significativo por sí mismo. Por ejemplo, el tipo de entidad para los términos de taxonomía se denomina taxonomy_term y el nombre de la clase es Drupal \ taxonomy \ Entity \ Term.

     Interfaces:

          Drupal 8 recomienda que escriba funciones y métodos con interfaces en lugar de clases. Por ejemplo, para las entidades genéricas utilizaremos los métodos y propiedades de EntityInterface como en hook_entity_insert(EntityInterface $entity) y para trabajar con nodos específicos, utilizaremos los métodos y propiedades de NodeInterface como en hook_node_insert(NodeInterface $node).

Tipos de entidad Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

Tipos de entidad Drupal | www.drupaladicto.com - Consultor especializado en drupal y symfony

         Los campos / propiedades de las entidades suelen ser muy breves, centrados en el almacenamiento y no muy autodescriptivos. Además, las entidades de contenido no usan propiedades definidas para sus campos (incluidos los campos base como el título del nodo) en absoluto.

          Por lo tanto, el enfoque recomendado es proporcionar una interfaz con nombres de métodos documentados. Algunas reglas a seguir al hacerlo:

  • Los métodos suelen tener un prefijo get / set / is o similar: getSomething (), setSomething ($ value), isSomething ().
     
  • Solo agregue métodos para cosas que se supone que debe cambiar otro código. No se supone que se cambie la fecha de último cambio de los nodos ($node->changed), por lo que hay $node->getChangedTime(), pero no el método $node->setChangedTime().
     
  • Utilice nombres de métodos autodescriptivos, por ejemplo, el método para acceder a $node->status se llama $node->isPublished().

     Capacidad de rastreo o Visibilidad (Discoverability):

          Para averiguar qué tipos de entidad proporciona un módulo, consulte las clases en el subespacio de nombres de Entidad de ese módulo que tienen una anotación @EntityType, que también contiene el nombre en la clave de anotación de id.

          Al intentar encontrar dónde se define un tipo de entidad dado, lo primero que debe buscar es el prefijo del tipo de entidad. Si un módulo no sigue esa convención de nomenclatura, se puede encontrar buscando id = "$type". Si se conoce la clase o interfaz en lugar del tipo de entidad, entonces el namespace indica de dónde proviene.

Fuente: https://www.drupal.org/docs/drupal-apis/entity-api/entity-types