RelatedByTerms https://www.carloscarrascal.com/ es Related 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&amp;1=27&amp;2=comment&amp;3=comment" token="TA0hR5mKqqgyHVFJ9N2hid4Y-krX49ZXWc4IWg3H7iI"></drupal-render-placeholder> </section> </div> </article> Tue, 03 Oct 2017 22:17:37 +0000 root 27 at https://www.carloscarrascal.com Related 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-&gt;condition('nid', $nid); $subquery-&gt;addField('t1', 'tid'); $query = db_select('taxonomy_index', 't'); $query-&gt;join('node', 'n', 'n.nid = t.nid'); $query-&gt;addTag('relatedbyterms_count'); $query-&gt;addTag('node_access'); $query-&gt;condition('t.tid', $subquery, 'IN'); $query-&gt;condition('t.nid', $nid, '&lt;&gt;'); $query-&gt;condition('n.language', $language-&gt;language); $query-&gt;addField('t', 'nid'); $query-&gt;addExpression('count(\'t.nid\')', 'count'); $query-&gt;orderBy('count, nid', 'DESC'); $query-&gt;groupBy('t.nid'); if ($limit &gt; 0) { $query-&gt;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&amp;1=1&amp;2=comment&amp;3=comment" token="TPDftITiSkK7fDcIvkjj1cDUjEih2r6BVIhw_dm-H4I"></drupal-render-placeholder> </section> </div> </article> Sun, 03 Sep 2017 15:15:23 +0000 root 1 at https://www.carloscarrascal.com