Archivo de la etiqueta: Drupal 7

Druplicon

Drupal 7: Controlar completamente los template de Field collection

El muy jodido tiene mas vueltas que una oreja cuando de theming se trata.

NOTA: todos los templates que hay que crear ponlos en tu theme. Lo ideal es dentro del directorio tu_theme/templates/field_collection o algo similar.

Primero creamos el tpl field-collection-view.tpl.php que es el wrapper que hay entre el html del field y el del field collection. Pon esto dentro:

<?php print $element['#children']; ?>

Luego field-collection-item.tpl.php que es el tpl que controla el render de cada uno de los item individuales de la colección:

<?php print render($content); ?>

Por ultimo necesitamos field-field-collection.tpl.php (ojo que mi wordpress junta los dos guiones), un tpl para el field que contiene todo lo que field collection entregue:

<ul class="coleccion de items">
  <?php foreach ($items as $delta => $item): ?>
    <li><?php print render($item); ?></li>
  <?php endforeach; ?>
</ul>

Y listo! ya tenes control a todos los niveles del markup que va a entregar un field collection.

Chau!

Druplicon

Drupal 7 : Crear un template block-bean-type-ENTITY-TYPE.tpl.php para bundles del módulo Bean

Caso de uso. Creaste un bean del tipo “banner” y quieres que el block.tpl.php tenga un marcado específico para este tipo de contenidos. O lo que es lo mismo que decir que quieres tener un block-bean-type-banner.tpl.php

La solución es poner este preprocess:

<?php
/**
 * Implements hook_preprocess_block().
 */
function TU_THEME_O_MODULO_preprocess_block(&$vars) {
  // Añadimos theme suggestions por tipo de bean.
  if ($vars['block']->module == "bean") {
    /** @var $bean Bean */
    $bean = bean_load_delta($vars['block']->delta);
    $vars['theme_hook_suggestions'][] = 'block__bean__type_' . $bean->type;
  }
}

Y ya podés copiar block.tpl.php a tu theme, renombrarlo a block-bean-type-banner.tpl.php, personalizarlo y borrar el cache.

Chau!

Druplicon

Drupal 7: Hacer bypass a page.tpl.php y html.tpl.php programáticamente

¿Y si necesitaras entregar una página sin los CSS ni JS ni el HTML (cabeceras, footer, sidebars) que viene por defecto?

Solo hay que hacer dos cosas:

1. Añadir la propiedad ‘delivery callback’ a tu menu callback

<?php
$items['factura/%node'] = array(
  'title' => 'Entrega una factura',
  'page callback' => 'generar_factura',
  'delivery callback' => 'mi_delivery_page',
  'access callback' => TRUE,
);

2. Añadir esta función.

No hace falta modificarla. Si querés cambiarle el nombre no te olvides de modificar también el nombre en el delivery callback del menú.

<?php
/**
 * Delivery callback.
 *
 * Entrega el contenido así como viene sin pasar ni
 * por page.tpl.php ni por html.tpl.php
 *
 */
function mi_delivery_page($page_callback_result) {
  if (isset($page_callback_result) && is_null(drupal_get_http_header('Content-Type'))) {
    drupal_add_http_header('Content-Type', 'text/html; charset=utf-8');
  }
  global $language;
  drupal_add_http_header('Content-Language', $language->language);
  print $page_callback_result;
  drupal_page_footer();
}

Borra cache y listo.

Chau!

Druplicon

Drupal 7: Quitar un CSS o JS programaticamente

El siguiente hook lo pones en el template.php de tu theme:

<?php
function TU_THEME_css_alter(&$css) {
  $css = array_diff_key($css, array(
    // Añade todos los CSS que quieras quitar antes que se entregue la página.
    drupal_get_path('module', 'NOMBRE_MODULO') . '/PATH/HASTA/EL/CSS/foo.css' => FALSE,
    drupal_get_path('theme', 'NOMBRE_THEME') . '/PATH/HASTA/EL/CSS/foo.css' => FALSE,
  ));
}
function TU_THEME_js_alter(&$js) {
  $js = array_diff_key($js, array(
    // Añade todos los JS que quieras quitar antes que se entregue la página.
    drupal_get_path('module', 'user') . '/user.js' => FALSE,
  ));
}

Está claro que esos hook tienen juego. Puedes mirar cual URL vas a renderizar, o averiguar cualquier otra cosa que te ayude a decidir que CSS’s/JS’s vas a querer quitar.

Chau!

Druplicon

Drupal 7: Habilitar templates para nodos basados en su view mode

Si tenemos un content type llamado “citas” y tenemos mas de un view mode, por ejemplo “resumida” y “detallada“.
Para poder hacer templates tipo “node-cita-resumida.tpl.php” y “node-cita-detallada.tpl.php” simplemente tenemos que poner una linea en el HOOK_preprocess_node().

<?php
/**
 * Implements HOOK_preprocess_node().
 */
function HOOK_preprocess_node(&$variables, $hook) {
  $variables['theme_hook_suggestions'][] = 'node__' . $variables['node']->type . '__' . $variables['view_mode'];
}

Chau!

Drupal 7 + Views: Temear exposed filters como Dios manda

Lo primero que tenes que saber es que podes tomar el control del template que imprime los filtros expuestos de un view (views-exposed-form.tpl.php) simplemente copiandolo a tu theme y poniéndole un nombre con este formato:

views-exposed-form--VIEW_NAME.tpl.php
views-exposed-form--VIEW_NAME--DISPLAY_ID.tpl.php

Ejemplos:
Tengo un view llamado listado_usuarios y dos display: una página “administracion_usuarios” y un bloque “usuarios_por_fecha

(De mas especifico a mas genérico)

Solo para el formulario expuesto del display administracion_usuarios.

views-exposed-form--listado_usuarios--administracion_usuarios.tpl.php

Solo para el formulario expuesto del display usuarios_por_fecha.

views-exposed-form--listado_usuarios--usuarios_por_fecha.tpl.php

Para todos los display que tengan formulario expuesto en este view.

views-exposed-form--listado_usuarios.tpl.php

Cualquier view (CUALQUIERA) que tenga un display llamado administracion_usuarios.

views-exposed-form--administracion_usuarios.tpl.php

Cualquier view con cualquier display.

views-exposed-form.tpl.php

Chau!

Drupal 7: Quitar la descripción “E.g., 19/11/2013″ del field date_popup

El FAPI date_popup (del módulo Date) tiene un poco de mala leche y no se deja quitar la descripción por la vía tradicional. Dicho lo anterior, acá está el hook que nos salva el día:

<?php
/**
 * Implements hook_date_popup_process_alter().
 */
function MODULO_O_THEME_date_popup_process_alter(&$element, &$form_state, $context) {
  unset($element['date']['#description']);
  unset($element['time']['#description']);
}

Chau!

Druplicon

Drupal 7: Integrar Inline entity form perfectamente en el formulario en el que está anidado.

Cuando Inline entity form renderiza la entidad dentro de otro formulario tiende a meterle fieldsets y títulos extra que no son estrictamente parte del formulario de la entidad referida. Como resultado, el formulario anidado queda como tal, como si estuviera anidado, y eso no queda bonito. Estaria mejor que el formulario visualmente se integrase mejor al formulario del nodo al que está referido.

Para lograr esto agarra tu módulo o theme (template.php) y pon esto:

<?php
function TUMODULO_o_THEME_field_widget_inline_entity_form_single_form_alter(&$entity_form, &$form_state) {
  $entity_form['#type'] = 'container';
  $entity_form['form']['product_details']['#type'] = 'container';
  unset(
  $entity_form['#title'],
  $entity_form['#tree'],
  $entity_form['#description'],
  $entity_form['#prefix'],
  $entity_form['#suffix']
  );
}
?>

Básicamente se deshace de los fieldset que aíslan al formulario de la entidad referida del formulario que lo contiene.

El antes y el después:
Entity inline clean
Chau!

Druplicon

Drupal 7: Renderizar una pagina de panels programáticamente

Si tenemos un panel que tiene su propia URL, digamos contactar/!extras y querés renderizar este panel por medio de código. Bueno si ese fuera el caso, hacerlo es bastante simple:

<?php
  module_load_include('inc', 'ctools', 'page_manager/plugins/tasks/page');
  return page_manager_page_execute("contacto", "foo");
?>

En el snippet anterior solo aclarar que page_manager_page_execute([[1]], [[2,3,4,etc]]);

[[1]] este es el nombre del panel sin el prefijo “page-“. Para saber cual es el nombre del panel que quieres, podes ir a admin/structure/pages

[[2,3,4,etc]] este argumento machea con !extras y cualquier otro argumento extra va a ir macheando con el siguiente argumento de la URL.

Chau!