Archivos de Categoría: Drupal 8 - Paginas 4

Listar árbol de taxonomías en idioma determinado con Drupal 8

Si queremos sacar un árbol ordenado de las taxonomías en Drupal 8 debemos hacerlo de la siguiente forma:

  $terms = \Drupal::service('entity_type.manager')->getStorage("taxonomy_term")
                                                  ->loadTree('tags', $parent = 0, $max_depth = NULL, $load_entities = FALSE);

El problema es que siempre nos lo sacará en el idioma por defecto, no hay opción de sacarlo en un idioma determinado, así que la única opción es cargar primero las traducciones en un array y luego recorrer los resultados de la función anterior para ir asociando las traducciones según el orden:


// cargamos en un array las taxonomias con sus traducciones
$query = \Drupal::entityQuery('taxonomy_term');
$query->condition('vid', "tags");
$tids = $query->execute();
$terms = \Drupal\taxonomy\Entity\Term::loadMultiple($tids);
$terminos = array();
foreach ($terms as $tid=>$term) {
   $terminos[$tid] = $term->getTranslation($idioma)->getName();
}

// cargamos el arbol de taxonomias
$terms = \Drupal::service('entity_type.manager')->getStorage("taxonomy_term")
                                                ->loadTree('tags', $parent = 0, $max_depth = NULL, $load_entities = FALSE);
$resultado = array();
foreach($terms as $term){
  $resultado[] = array('tid' => $term->tid, 'name'=>$terminos[$term->tid], 'depth'=>$term->depth);
}

Tips&Tricks de Drupal 8

Ultimamente me estoy peleando más con Drupal 8 asi que aqui dejo una chuletero rapido:

Obtener el detalle de un nodo a partir de su id:

$node = \Drupal::entityManager()->getStorage('node')->load($id);

En caso de querer recuperar el nodo actual:

$node = \Drupal::request()->attributes->get('node');

Y a partir de ese nodo, obtener los datos:

$nid = $node->id();
$tipo = $node->getType();
$titulo = $node->getTitle();
$campo =  $node->get('field_campo')->getValue()[0]['value'];
$imagen = $node->field_imagen->entity->getFileUri();

// obtenerlos en un idioma especifico 
$titulo_ingles = $node->getTranslation('en')->getTitle();

Obtener el nombre de una taxonomía a partir de su id:

$term = \Drupal\taxonomy\Entity\Term::load($id);
$taxonomia = $term->getName();

Obtener el idioma actual:

$idioma = \Drupal::languageManager()->getCurrentLanguage()->getId();

Acceder a la configuración del site, como por ejemplo para sacar el nombre de este (util si estas desarrollando un Drupal en multisite):

$site_config = \Drupal::config('system.site');
$site_name = $site_config->get('name');

Realizar una consulta a pelo en la base de datos:

// sacando varios resultados
$result = db_query('SELECT name
                    FROM s_taxonomy_term_field_data 
                    where langcode = :idioma', array(':idioma'=>'es'))->fetchAll();

// sacando un unico resultado
$imagen = db_query('SELECT uri FROM s_file_managed where fid = :id', array(':id'=>$id))->fetchField();

Guardar un registro en el log (tabla watchdog de la base de datos)

// el valor 'clave_referencia_log' nos sirve para identificar el mensaje en la tabla 
\Drupal::logger('clave_referencia_log')
    ->info("Mensaje guardado en el log, llamada desde la función" . __FUNCTION__ );

Deshabilitar cache de Twig en Drupal 8

Mientras se desarrolla un tema de Drupal 8, es un fastidio estar borrando la cache cada vez que cambias una plantilla por lo que lo mejor es deshabilitar la cache, lógicamente solo durante el desarrollo. Para ello hay que seguir los siguientes pasos:

1. Copiar el fichero sites/example.settings.local.php como sites/default/settings.local.php

cp sites/example.settings.local.php sites/default/settings.local.php

2. En el fichero sites/default/setting.php descomentar las líneas

if (file_exists(__DIR__ . '/settings.local.php')) {
include __DIR__ . '/settings.local.php';
}

3. En el fichero sites/default/settings.local.php descomentar las líneas

$settings['cache']['bins']['render'] = 'cache.backend.null';

$settings['cache']['bins']['dynamic_page_cache'] = 'cache.backend.null';

4. En el fichero sites/development.services.yml añadir las siguientes líneas (con esto además habilitamos el modo depuración por lo que al ver el código fuente del html podremos ver las plantillas que va cargando):

parameters:
twig.config:
debug : true
auto_reload: true
cache: false

5. Por ultimo cargar la página http://TU_URL/core/rebuild.php para que los cambios surjan efecto

Lógicamente con esto la ejecución de las páginas es un poco más lenta pero por lo menos no tienes que estar borrando la cache todo el rato. Finalmente para volver a habilitar la cache bastará con eliminar el fichero sites/default/settings.local.php