RelatedByTerms
https://www.carloscarrascal.com/
esRelated By Terms para Drupal 8
https://www.carloscarrascal.com/blog/related-terms-para-drupal-8
<article data-history-node-id="27" class="node node--type-blog-post node--view-mode-rss group-one-column ds-2col-stacked-fluid clearfix">
<div class="group-header">
<div class="field field--name-node-title field--type-ds field--label-hidden field--item"><h1>
Related By Terms para Drupal 8
</h1>
</div>
<div class="field field--name-node-post-date field--type-ds field--label-hidden field--item">Miércoles, Octubre 4, 2017 - 00:17</div>
</div>
<div class="group-left">
<div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items">
<div class="field--item"><a href="/tags/drupal" hreflang="es">Drupal</a></div>
<div class="field--item"><a href="/tags/d8" hreflang="es">D8</a></div>
<div class="field--item"><a href="/tags/relatedbyterms" hreflang="es">RelatedByTerms</a></div>
</div>
<div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Ayer publiqué la primera version estable de la rama 8.x de <a href="https://www.drupal.org/project/relatedbyterms">Related By Terms</a>. La funcionalidad es prácticamente la misma que tiene <a href="https://www.carloscarrascal.com/blog/related-terms-para-drupal-7">la versión de Drupal 7</a>, pero como podréis imaginar, he tenido que reescribir prácticamente todo el módulo. Lo único que se ha salvado, y de milagro es la query que estaba utilizando para obtener los nodos relacionados.</p>
<p>Para refrescar la memoria, este módulo nos da:</p>
<ul>
<li>Un bloque que podemos colocar donde queramos que mostrará una lista de nodos relacionados con el que estamos viendo, ordenados por el número de coincidencias en términos de taxonomías.</li>
<li>Una página de configuración en el panel de administración donde podemos configurar el número de relacionados a mostrar y el <em>Display mode</em> que se usará para pintarlos.</li>
<li>En el caso de la versión para Drupal 8, un servicio que puede ser usado por otros módulos para obtener simplemente la lista de relacionados, para procesarlos de la manera más conveniente.</li>
</ul>
<p>Por supuesto, tengo instalado el módulo en este sitio, es el bloque que podéis ver en la barra lateral derecha debajo del título 'Relacionado'.</p>
<p>Esta es la lista de los nuevos y flamantes componentes del módulo:</p>
<pre>
relatedbyterms/LICENSE.txt
relatedbyterms/README.md
relatedbyterms/relatedbyterms.info.yml
relatedbyterms/relatedbyterms.install
relatedbyterms/relatedbyterms.links.menu.yml
relatedbyterms/relatedbyterms.module
relatedbyterms/relatedbyterms.permissions.yml
relatedbyterms/relatedbyterms.routing.yml
relatedbyterms/relatedbyterms.services.yml
relatedbyterms/config/install/relatedbyterms.settings.yml
relatedbyterms/config/schema/relatedbyterms.schema.yml
relatedbyterms/src/Form/RelatedByTermsForm.php
relatedbyterms/src/Plugin/Block/RelatedByTermsBlock.php
relatedbyterms/src/RelatedByTermsService.php
relatedbyterms/src/RelatedByTermsServiceInterface.php</pre>
<p>Como podéis ver si habéis dado un vistazo al código de la versión 7, aquí hay bastante chicha para un módulo tan sencillo. Vamos a ver qué hace cada cosa:</p>
<ul>
<li>Los archivos <em>README.md</em> y <em>LICENSE.txt</em> no creo que necesiten mucha explicación.</li>
<li>Archivo <em>info.ym</em>l: Información básica del módulo.</li>
<li>El fichero <em>install</em> contiene una simple inicialización de permisos.</li>
<li><em>links.menu.yml</em>: Define el elemento del menú de administración para acceder a la configuración del módulo.</li>
<li>En el archivo <em>.module</em> tan solo hay una implementación de <em>hook_help()</em> para mostrar un texto de ayuda.</li>
<li><em>permissions.yml</em> tiene la definición de un permiso especial para acceder a la configuración.</li>
<li><em>routing.yml</em> define una ruta para la página de administración, le asigna una clase de control para crear el formulario (<em>RelatedByTermsForm</em>) y comprueba que el usuario tenga el permiso necesario para acceder.</li>
<li><em>services.yml</em> sirve para declarar un nuevo servicio <em>relatedbyterms.manager</em>, y le asigna una clase de control, <em>RelatedByTermsService</em>. Este servicio puede ser utilizado por otros módulos para obtener una lista de nodos relacionados a partir de un <em>Nid</em>.</li>
<li>Luego tenemos un directorio install, que guarda los archivos de configuración del módulo.</li>
<li>Y por fin en el directorio <em>src</em>, encontramos:
<ul>
<li><em>RelatedByTermsForm</em>: Controla el formulario de administración del módulo.</li>
<li><em>RelatedByTermsBlock</em>: Para definir el bloque que va a mostrar los contenidos relacionados.</li>
<li><em>RelatedByTermsServiceInterface</em>: Interfaz para la definición de los métodos del servicio.</li>
<li><em>RelatedByTermsService</em>: Clase que define el servicio. Esta clase contiene la lógica de negocio del módulo, y puede ser cargado desde otros módulos.</li>
</ul>
</li>
</ul>
<p>Espero que lo probéis. Cualquier comentario, peticiones, o si veis que he metido la pata en algún sitio, dejad un comentario, poneros en contacto conmigo, o mejor aún, crear un ticket en Drupal.org para el módulo.</p>
<p>Saludos</p>
<p> </p>
</div>
</div>
<div class="group-footer">
<section>
<h2>Añadir nuevo comentario</h2>
<drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&1=27&2=comment&3=comment" token="TA0hR5mKqqgyHVFJ9N2hid4Y-krX49ZXWc4IWg3H7iI"></drupal-render-placeholder>
</section>
</div>
</article>
Tue, 03 Oct 2017 22:17:37 +0000root27 at https://www.carloscarrascal.comRelated By Terms para Drupal 7
https://www.carloscarrascal.com/blog/related-terms-para-drupal-7
<article data-history-node-id="1" class="node node--type-blog-post node--view-mode-rss group-one-column ds-2col-stacked-fluid clearfix">
<div class="group-header">
<div class="field field--name-node-title field--type-ds field--label-hidden field--item"><h1>
Related By Terms para Drupal 7
</h1>
</div>
<div class="field field--name-node-post-date field--type-ds field--label-hidden field--item">Domingo, Septiembre 3, 2017 - 17:15</div>
</div>
<div class="group-left">
<div class="field field--name-field-tags field--type-entity-reference field--label-hidden field--items">
<div class="field--item"><a href="/tags/drupal" hreflang="es">Drupal</a></div>
<div class="field--item"><a href="/tags/dev" hreflang="es">Dev</a></div>
<div class="field--item"><a href="/tags/d7" hreflang="es">D7</a></div>
<div class="field--item"><a href="/tags/relatedbyterms" hreflang="es">RelatedByTerms</a></div>
</div>
<div class="field field--name-body field--type-text-with-summary field--label-hidden field--item"><p>Me ha costado pero por fin he publicado mi primer módulo en Drupal.org. Se llama <a href="https://www.drupal.org/project/relatedbyterms">Related by Terms</a> y básicamente crea un bloque para mostrar contenido relacionado con el nodo que estamos viendo.</p>
<p>Para calcular las relaciones con otros nodos estoy utilizando los términos de taxonomías, de forma que se cuentan las coincidencias en términos del nodo actual, y aparecerán primero en la lista los nodos con mas coincidencias.</p>
<p>La query que estoy usando es así:</p>
<pre>
/**
* Create and prepare the database query.
*
* The query uses a tag called relatedbyterms_count
* that will allow other modules to alter it.
*/
function relatedbyterms_get_query($nid) {
global $language;
$limit = relatedbyterms_get_elements_displayed();
$subquery = db_select('taxonomy_index', 't1');
$subquery->condition('nid', $nid);
$subquery->addField('t1', 'tid');
$query = db_select('taxonomy_index', 't');
$query->join('node', 'n', 'n.nid = t.nid');
$query->addTag('relatedbyterms_count');
$query->addTag('node_access');
$query->condition('t.tid', $subquery, 'IN');
$query->condition('t.nid', $nid, '<>');
$query->condition('n.language', $language->language);
$query->addField('t', 'nid');
$query->addExpression('count(\'t.nid\')', 'count');
$query->orderBy('count, nid', 'DESC');
$query->groupBy('t.nid');
if ($limit > 0) {
$query->range(0, $limit);
}
return $query;
}
</pre>
<p>Como podeis ver se usa la tabla <em>taxonomy_index</em>, donde se mantiene un listado de todos los términos de taxonomía asociados a nodos. Mediante un <em>count()</em> y un <em>groupBy</em> puedo agrupar y contar las coincidencias en términos con otros nodos.</p>
<p>Acabo de publicar la primera versión estable del módulo y ahora estoy trabajando para poder incluirlo en la <a href="https://www.drupal.org/node/2905714#comment-12245312">revisión de seguridad de Drupal</a>.</p>
<p>Estoy abierto a sugerencias o comentarios...</p>
</div>
</div>
<div class="group-footer">
<section>
<h2>Añadir nuevo comentario</h2>
<drupal-render-placeholder callback="comment.lazy_builders:renderForm" arguments="0=node&1=1&2=comment&3=comment" token="TPDftITiSkK7fDcIvkjj1cDUjEih2r6BVIhw_dm-H4I"></drupal-render-placeholder>
</section>
</div>
</article>
Sun, 03 Sep 2017 15:15:23 +0000root1 at https://www.carloscarrascal.com