Saltar al contenido

Drupal – Agregar CRITERIOS DE FILTRO en las vistas programáticamente

Si encuentras algún detalle que no comprendes puedes comentarlo y trataremos de ayudarte lo mas rápido que podamos.

Solución:

Utilice el módulo Devel y dpm($view) y dpm($query) después de poner como “[email protected]” en el campo “valor” que se encuentra en su imagen. Vea el objeto/array estructura de la vista y consulta de la salida de desarrollo.

Luego usa la función hook_views_query_alter(&$view, &$query) en su módulo para apuntar a la condición de filtro de condición WHERE y establecerlo en el valor que desee.

Algo como:

function MYMODULE_views_query_alter(&$view, &$query) 
  global $user;
  dpm($view, __FUNCTION__);
  dpm($query, __FUNCTION__);
  if ($view->name === 'your_view_machine_name') 
    // This will only work as-is if you always have something in the filter by
    // default, I guess. This hook runs always so you could just put
    // '[email protected]' as the email to filter by in views and this
    // will always override it. I'm sure there is a cleaner way to put
    // the filter dynamically at runtime. But i think thats more complex
    // php that customizes a view.
    //
    // The index 2 below is the index of the condition for the email filter.
    // Your $query structure may be different in your dpm() of the View $query.
    $query->where[1]['conditions'][2]['field']['value'] = $user->email;
  

Aquí hay una alternativa:

$view = views_get_view('view_machine_name');
$view->init_display('default');
$view->display_handler->display->display_options['filters']['your_filter_name']['default_value'] = 'your_value';
$view->is_cacheable = FALSE;  
$view->execute();
print $view->render();

Sé que probablemente debería configurar esto usando algún método esotérico y enrevesado, pero si solo desea un acceso rápido y sucio sin perder el tiempo, esto lo llevará allí.

Sería preferible modificarlos en los ganchos en lugar de en el momento del renderizado para no socavar el rendimiento del sitio y el almacenamiento en caché. Me tomó años darme cuenta de que hook_views_pre_build() se dispara demasiado tarde, necesitas hook_views_pre_view().

Encontré una referencia al uso de $view->add_item() pero luché por encontrar ejemplos, a continuación estaba mi solución para filtrar un conjunto de términos de taxonomía para incluir solo ciertos vocabularios:

function MODULENAME_views_pre_view(&$view, &$display_id, &$args) 

  if ($view->name == 'VIEWNAME' && $display_id == 'DISPLAYID') 
    // Add all the terms of a vocabulary to the terms listing widget select field
    $vids = array();
    $vocab = taxonomy_vocabulary_machine_name_load('vocab_name');
    $vids[ $vocab->vid ] = $vocab->vid;

    // Get the existing filters
    $filters = $view->display_handler->get_option('filters');

    if (empty($filters['vid'])) 
      // There is no vid filter so we have to add it
      $view->add_item(
        $view->current_display,
        'filter',
        'taxonomy_term_data',
        'vid',
        array(
          'operator' => 'in',
          'value' => $vids,
          'group' => 1
        )
      );
    
    else 
      // Add to pre-existing filter
      foreach($vids as $vid) 
        $filters['vid']['value'][ $vid ] = $vid;
      
      $view->display_handler->override_option('filters', $filters);
    
  

Editar nota: Este comentario sobre do group me ayudó a descubrir cómo obtener los filtros de vistas usando $view->display_handler->get_option('filters') y luego anularlos usando $view->display_handler->override_option('filters', $filters);.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *