drupal9

Guardando datos de configuración por código en Drupal 9 y 10

En drupal tenemos datos de configuración como los que se guardan en admin/config/system/site-information como el nombre del sitio, el lema, correo electronico, vamos a estudiar como localizar, leer, editar y crear nuestra propia configuración.

Localizando una configuración

Por ejemplo para los datos almacenados en site-information, podemos:

  a. Ir a nuestro editor de código y buscar el archivo .routing.yml en donde se encuentra la ruta admin/config/system/site-information.

  b. Luego ir al controller correspondiente a de dicho routing que para nuestro ejemplo es la clase SiteInformationForm que define dicho formulario y que extiende de ConfigFormBase. Si bajamos veremos que existe un método getEditableConfigNames() 

  /**
   * {@inheritdoc}
   */
  protected function getEditableConfigNames() {
    return ['system.site'];
  }

En este código vemos que se está retornando un array con el nombre de configuración que nos interesa system.site, luego si vamos a admin/config/development/configuration/single/export y en nombre de configuración buscamos system.site, entonces veremos los datos almacenados en site-information como en nombre del sitio, el mail, el slogan, la página frontal, etc.

simple configuration drupal 9 y 10

 

Leyendo una configuración

Para cargar las configuraciones dentro de nuestro código, en los controladores existe un método llamado config que nos devuelve la configuración que le endiquemos.

$config_site = $this->config('system.site');

 Aquí estamos cargando la configuración system.site que vimos por la interfaz y la estamos almacenando en la variable $config_site (pero podría tener cualquier otro nombre), ahora dentro de nuestro controller se vería así:

<?php
namespace Drupal\module_base\Controller;

use Drupal\Core\Controller\ControllerBase;

class ExampleConfigurationController extends ControllerBase
{
  public function configExample() {
    $config_site = $this->config('system.site');
    dpm($config_site);
  }
}

En este caso con el método dpm del módulo devel (debemos tener intalado devel previamente) estamos mostrando el contenido de la variable $config_site:

load config from configuration in drupal

Vemos que obtuvimos el name del site, el mail, el slogan y otros elementos más, por lo que ahora veremos como obtener esos elementos de forma individual con el médodo get().

$config_site->get('mail')

Almacenando este retorno en una variable $mail_site obtendríamos el siguiente código:

<?php
namespace Drupal\module_base\Controller;

use Drupal\Core\Controller\ControllerBase;

class ExampleConfigurationController extends ControllerBase
{
  public function configExample() {
    $config_site = $this->config('system.site');
    $mail_site = $config_site->get('mail');
    dpm($mail_site);
    return ['#markup'=> 'Página de configuración'];
  }
}

Esto imprimirá en pantalla el mail del sitio:

printing mail from configuration in drupal

 

Creando y manipulando nuestra propia configuración

Bien, ahora vamos a crear nuestra propia configuración, para ello debemos crear un módulo personalizado el cual va a guardar la fecha del último nodo que fue publicado o su modificación (siempre y cuando esté publicado). 
Nuestro módulo se llamará status_publish y dentro de él aremos lo siguiente:

  1. Crearemos un archivo status_publish.settings.yml en la ubicación:

    status_publish/config/install/status_publish.settings.yml

  2. Luego en él escribiremos en estructura yml tantos datos como deseemos. Esta estructura tendrá los valores por defecto para nuestra configuración, para nuestro caso sólo almacenaremos la última fecha de actualización last_updated y su valor por defecto será 'default_value'

    last_updated: 'default_value'
  3. Luego desde un archivo status_publish.module almacenaremos crearemos las siguientes lineas.

    /**
     * Implements hook_ENTITY_TYPE_presave() for node.
     */
    function status_publish_node_presave(NodeInterface $node) {
      if ($node->bundle() == 'article' and $node->isPublished()) {
    
      }
    }

    Aquí estamos usando el hook hook_ENTITY_TYPE_presave() que se disparará cuando nodo de tipo articulo sea publicado, o si ya está publicado, entonces también se ejecutará.

  4. Una vez hecho esto, ya que no estamos en un controler como en el caso anterior, sino más bien en un hook, debemos llamar al servicio config.factory para manipular cualquier valor de configuración incluso los que acabamos de crear en el archivo status_publish.settings.yml.

    $config_factory = \drupal::service('config.factory');

    También podríamos haberlo hecho de esta forma:

    $config_factory = \Drupal::configFactory();

    Ambas lineas son equivalentes en cuanto a su funcionalidad y nos proporcionarán una forma para interactuar con la configuración.

  5. Luego debemos decir cual es el nombre de la configuración, para nuestro caso es el nombre del archivo y tenemos los siguientes casos dependiendo de que si sólo deseamos leer o editar la configuración.

    a. Para sólo leer la configuración:

    $status_publish = $config->get('status_publish.settings');
    $status = $status_publish->get('last_updated'); //sólo leyendo el valor de la configuración

    b. Para editar la configuración:

    $editable_config = $config_factory->getEditable('status_publish.settings');
    $current_timestamp = time(); //Obteniendo y asignando la hora actual
    $editable_config->set('last_updated', $current_timestamp)->save(); //Guardando la hora en la configuración.
  6. Para nuestro caso nos interesa guardar la hora actual, por lo que nuestro código quedaría así:

    /**
     * Implements hook_ENTITY_TYPE_presave() for node.
     */
    function status_publish_node_presave(NodeInterface $node) {
      if ($node->bundle() == 'event' and $node->isPublished()) {
        $config_factory = \Drupal::service('config.factory');
        $editable_config = $config_factory->getEditable('status_publish.settings');
    
        $current_timestamp = time();
        $editable_config->set('last_updated', $current_timestamp)->save();
      }
    }

     

Me pareció interesante el artículo

Deseo más información

O también puedes comunicarte con nosotros.

por whatsapp por whatsapp

Añadir nuevo comentario

Me gustaría más información sobre:

CAPTCHA