Drupal, Quitar fields de un Content Type

Obviamente que usando el editor de content types en drupal es muy sencillo agregar o quitar fields de una manera visual, pero eso no nos sirve cuando trabajamos en equipo y tenemos multiples entornos.

Sabido también es que features es nuestro aliado para estos casos en Drupal 7, el gran problema que tiene es que feature es muy piola para fields nuevas pero no tanto para eliminar fields que no usamos mas, features no tiene forma de saber que una field debe ser borrada en otro entorno. Por esto es que si queremos eliminar fields de un content type debemos hacerlo via código con un hook_update.

El código para borrar una field es bien sencillo, sería algo asi.

  if (field_info_field('field_my_field_name')) {
    field_delete_field('field_my_field_name');
  }

Eso hará el trabajo, peeeeeero, tengan en cuenta que una field posee instancias, y por cada content type que la utiliza (recuerden que las fields se pueden reutilizar) existe una instancia. El problema del snippet anterior es que al borrar la field la borra de todos los content types y tal vez nosotros solo deseemos borrar la field de un solo content type. Si este es su caso el sinnipet a utilizar es el siguiente

  if ($instance = field_info_instance('node', 'field_my_field_name', 'node_type_name')) {
    field_delete_instance($instance);
  }

Esto eliminará la field field_my_field_name del tipo de contenido node_type_name. Si otro content type utiliza field_my_field_name la tendrá disponible. Si nadie mas utiliza la field esta será eliminada por completo.

Recomendación, utilicen siempre el segundo caso dado que con este no hay forma de equivocarse y borrar una field en otro content type accidentalmente.

Mas info en

https://api.drupal.org/api/drupal/modules%21field%21field.crud.inc/function/field_delete_instance/7

Share

Drupal – Como quitar acentos y otros caracteres especiales de las urls generadas por Pathauto

Drupal posee un subsistema que permite generar alias de urls a fin de contar con url limpias, es decir, en vez de tener “node/30” podemos tener “article/this-article-rocks”, mas SEO friendly y más Human friendly.

Existe un módulo llamado pathauto el cual permite definir patrones para generar estas urls limpias automáticamente. Este módulo por defecto, si tenemos el lenguaje español habilitado, tratará de generar urls limpias usando acentos y otros caracteres latinos que como todos bien sabemos no son lo ideal en el universo de la internet, por ende este post trata acerca de como sacar los acentos de los alias de urls generados por pathauto.

Para esto deberán bajar el módulo transliteration, este modulo integrará una opción en el formulario de configuración de pathauto para que se conviertan todos esos caracteres especiales a caracteres el alfabeto ANSI 96.

Descarguen Transliteration desde aquí https://www.drupal.org/project/transliteration

Luego instalen el modulo en su sitio Drupal.

Con el módulo habilitado vayan a /admin/config/search/path/settings para configurar path auto. Verán dos opciones que deberán habilitar

> Transliterate prior to creating alias
> Reduce strings to letters and numbers

Drupal Pathauto Acentos

Al terminar deberán borrar todos los alias existentes y regenerarlos, ojo si su sitio esta en producción e indexado por google, pueden llegar a tener muchos 404.

Para borrar admin/config/search/path/delete_bulk

Drupal Delete all aliases

 

Actualizar admin/config/search/path/update_bulk

Regenerate Alias

Share

Drupal : Renderizar una Region de un Theme dentro de una tpl de Nodo

Necesitaba renderizar una region del tema dentro de la tpl de node, la idea era tener una zona para configurar bloques customizables por pagina. Googleando un poco me encuentro con una solución usando el hook preprocess node. Básicamente usando block_get_blocks_by_region.

function mytheme_preprocess_node(&$variables) {

  // Get a list of all the regions for this theme
  foreach (system_region_list($GLOBALS['theme']) as $region_key => $region_name) {

    // Get the content for each region and add it to the $region variable
    if ($blocks = block_get_blocks_by_region($region_key)) {
      $variables['region'][$region_key] = $blocks;
    }
    else {
      $variables['region'][$region_key] = array();
    }
  }
}

Y luego dentro del node.tpl.php esto para renderizar en ese lugar los bloques

print render($region['sidebar_first']);

No funcionó, yo había seteado los bloques por contexto, cuando pruebo por el sistema de bloques del core funcionó. Ahí me di cuenta que el problema estaba en que context no se integra con la función block_get_blocks_by_region. Buscando un poco mas me encuentro con esta alternativa que usa contexto.

  function MYTHEMENAME__preprocess_node(&$vars) {
    if ($plugin = context_get_plugin('reaction', 'block')) {
      $vars['my_region_name'] = $plugin->block_get_blocks_by_region('my_region_name');
    }
  }

Esto tampoco me funcionó directamente, seguía sin renderizarme el bloque, pero esta vez por que no había content.

Buscando otra vez me encuentro que recomiendan usar drupal_static_reset(‘context_reaction_block_list’); para refrescar el cache y regenerar los bloques aclarando que puede ser un performance killer, así que hice lo siguiente.

function THEME_render_region_blocks() {
  static $once = false;
  static $result = '';
  if ($once == false && $result == '') {
    $once = true; //Required to avoid recursive infinite loop rendering.
    drupal_static_reset('context_reaction_block_list');
    $plugin = context_get_plugin('reaction', 'block');
    $node_internal = $plugin->block_get_blocks_by_region('node_internal');
    $result = drupal_render($node_internal);
  }
  return $result;
}

Asi puedo renderizar la region, solo una vez y cachearla por la ejecución, y evito un loop infinito que se generaba al renderizar.

En el preprocess node me quedo algo así:

function THEME_preprocess_node(&$vars) { 
 $vars['internews'] = dt_get_internews();
}

 

Algunas referencias

http://www.webomelette.com/add-region-node-template
http://drupal.stackexchange.com/questions/20054/can-regions-be-printed-within-a-node-template
https://www.drupal.org/node/1306172
http://www.raisedeyebrow.com/blog/2012/07/displaying-drupal-context-regions-node-templates
http://kahthong.com/2012/08/embed-drupal-block-region-node-page
https://www.drupal.org/node/2107877

Share

Drupal Custom Formatters

En Drupal cuando construimos un content type y añadimos fields al mismo, dependiendo el tipo de field, podemos elegir como dicha field va a mostrarse y donde se mostrará. Para seleccionar donde se mostrará y como tenemos que ir a la solapa de “Manage Display” en el editor del content type.

El orden se setea con drag an drop y dependiendo de la field podemos seleccionar como la field va a mostrarse usando un formatter. Los formaters leen el valor de la field y aplican un tema para renderizarla, el tema es que los formatters son límitados y los requerimientos no.

Si necesitamos aplicar un renderizado particular muchas veces caemos en la primera opción, editar la template, para que se muestren los valores como queremos. Una alternativa un poco mas elegante y que nos proveerá mas flexibilidad en el futuro es crear nuestros propios formatters.

Para implementar un formatter debemos utilizar los siguientes hooks.

Los fundamentales

hook_field_formatter_info : Meta Información para que podamos usar el formatter del editor.
hook_field_formatter_view : Para definir el renderizado del formatter

Los formatters pueden configurarse, estos para definir las opciones del formatter

hook_field_formatter_settings_summary : Muestra en el Manage Display, en la field, las settings.
hook_field_formatter_settings_form : Define el form de setting para la field, requiere el anterior para funcionar.

Recuerden que las settings son por cada field en el content type que usen el formatter, no son globales, y pueden variar de display a display (Default, Teaster, Etc).

Uno de yapa

hook_field_formatter_prepare_view : Para levantar mas información en la field si se necesita.

Les dejo un par de links que tienen ejemplos

http://www.failover.co/blog/drupal-7-custom-field-formatter-hooks-overview

http://www.paulbooker.co.uk/dru……-custom-drupal-field-formatter-existing-field

http://www.whenwhowhere.com/tech-blog/create-custom-field-formatter-drupal-7

https://api.drupal.org/api/drupal/modules%21field_ui%21field_ui.api….

https://api.drupal.org/api/drup…._field_formatter_view/7

https://api.drupal.org/api/dru….tion/hook_field_formatter_info/7

 

Share

Drupal Training – Viernes 15 de Noviembre – 19hs

Este viernes para prendernos de la iniciativa global de Drupal Trainings , desde 42mate decidimos ofrecer un traninig de 3 hs introductorio a Drupal, gratuito.

El lugar será el Salon de Usos multiples de Intecnor en el Anexo de la UTN, Av. Laprida y French, comenzando a partir de las 19hs hasta las 22hs (sean puntales asi arrancamos a tiempo).

La idea del training es presentar Drupal 7, sus elementos de trabajo Nodos, Bloques, Menus, Módulos y Themes haciendo un pequeño ejemplo practico todos juntos, así que no olviden llevar su laptop con Apache, PHP y MYSQL instalado; si no tienen no se preocupen, trabajaremos en grupo.

La invitación es con cupos limitados asi que a anotarse rápido en este form.

Gracias a Luis Eiman, a la UTN y a Intecnor que nos facilitan las instalaciones.

Share