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);
.