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!

Additional resources

    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!