Como posso alterar o valor de um filtro e alterar a saída antes da exibição da exibição?

15

Ao usar o Drupal 7 e o Views 3, qual é a maneira correta de alterar um valor de filtro do Views para afetar o conteúdo que está prestes a ser renderizado?

Eu tentei de tudo mencionado aqui para D6.

Embora algumas pessoas tenham feito isso funcionar, Merlin afirma que modificar as opções de exibição é a maneira incorreta de conseguir isso, mas ele é vago em sua resposta sobre o que fazer ( http://drupal.org/node/789710#comment- 2927556 ).

Eu tentei:

function pages_views_pre_view($view){
    $view = views_get_view('north_carolina');
    $view->set_display('default');

    $view->display_handler->options['filters']['province']['value'] = 'Georgia';
    dsm($view->display_handler->options['filters']['province']);
}

Notas:

1) Eu tenho uma exibição criada chamada north_carolinaque possui dois tipos de exibição - uma página e um bloco (página_1 e bloco_1).

2) meus filtros são os mesmos nos meus displays, então estou tentando alterar o display 'padrão' para que ele afete todos eles.

3) O valor padrão do meu filtro é 'Carolina do Norte' (que eu defini na interface do Views), mas observe que estou tentando alterá-lo para 'Georgia'

4) Se eu executar o DSM imediatamente após, vejo que o filtro foi alterado, no entanto, meus resultados ainda mostram os resultados da 'Carolina do Norte'. O cache está desativado e eu continuo com a mesma coisa depois de executar drush cc all.

Eu também tentei executar o mesmo código através de hook_views_pre_builde hook_views_pre_execute.

Alguma sugestão?

EDITAR:

Conforme sugerido, pode ser útil ter informações adicionais. Aqui está um despejo da exibição:

$view = new view();
$view->name = 'north_carolina';
$view->description = '';
$view->tag = 'default';
$view->base_table = 'node';
$view->human_name = 'North Carolina';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['title'] = 'test nc block';
$handler->display->display_options['use_more_always'] = FALSE;
$handler->display->display_options['access']['type'] = 'perm';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'full';
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['row_plugin'] = 'fields';
/* Field: Content: Title */
$handler->display->display_options['fields']['title']['id'] = 'title';
$handler->display->display_options['fields']['title']['table'] = 'node';
$handler->display->display_options['fields']['title']['field'] = 'title';
$handler->display->display_options['fields']['title']['label'] = '';
$handler->display->display_options['fields']['title']['alter']['word_boundary'] = FALSE;
$handler->display->display_options['fields']['title']['alter']['ellipsis'] = FALSE;
/* Sort criterion: Content: Post date */
$handler->display->display_options['sorts']['created']['id'] = 'created';
$handler->display->display_options['sorts']['created']['table'] = 'node';
$handler->display->display_options['sorts']['created']['field'] = 'created';
$handler->display->display_options['sorts']['created']['order'] = 'DESC';
/* Filter criterion: Content: Published */
$handler->display->display_options['filters']['status']['id'] = 'status';
$handler->display->display_options['filters']['status']['table'] = 'node';
$handler->display->display_options['filters']['status']['field'] = 'status';
$handler->display->display_options['filters']['status']['value'] = 1;
$handler->display->display_options['filters']['status']['group'] = 1;
$handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;
/* Filter criterion: Location: Province */
$handler->display->display_options['filters']['province']['id'] = 'province';
$handler->display->display_options['filters']['province']['table'] = 'location';
$handler->display->display_options['filters']['province']['field'] = 'province';
$handler->display->display_options['filters']['province']['value'] = 'North Carolina';
$handler->display->display_options['filters']['province']['exposed'] = TRUE;
$handler->display->display_options['filters']['province']['expose']['operator_id'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['label'] = 'State';
$handler->display->display_options['filters']['province']['expose']['operator'] = 'province_op';
$handler->display->display_options['filters']['province']['expose']['identifier'] = 'province';
$handler->display->display_options['filters']['province']['expose']['remember_roles'] = array(
  2 => '2',
  1 => 0,
  3 => 0,
  4 => 0,
);

/* Display: Block */
$handler = $view->new_display('block', 'Block', 'block_1');
$handler->display->display_options['block_description'] = 'test nc block';

Observe que esses manipuladores são fornecidos pelo módulo de locais. Especificamente para o filtro "Localização: Província", recebi um formulário preenchido automaticamente. Quando eu digito na Carolina do Norte, ela aparece e eu tenho que escolher isso. No entanto, observe na instrução SQL que exibições gera que ele usa a abreviação de dois caracteres para state:

SELECT node.title AS node_title, node.nid AS nid, node.created AS node_created
FROM 
{node} node
LEFT JOIN {location_instance} location_instance ON node.vid = location_instance.vid
LEFT JOIN {location} location ON location_instance.lid = location.lid
WHERE (( (node.status = '1') AND (location.province = 'NC') ))
ORDER BY node_created DESC
LIMIT 10 OFFSET 0
blue928
fonte

Respostas:

8

Pode ser difícil descobrir a parte exata do objeto de visualizações a ser modificado. Normalmente exporto a visualização primeiro e olho o código gerado para começar.

O snippet abaixo não foi modificado e está funcionando conforme o esperado em um dos meus locais de produção. Espero que seja o suficiente para levá-lo na direção certa (obviamente, isso está em um módulo personalizado chamado offer_select). Se você pode fornecer o código da visualização exportada, alguém poderá dar uma olhada.

//Alter the End date filter on the offer views
function offer_select_views_pre_view(&$view) {
  if ($view->name == 'active_offers') {
    $view->display['default']->handler->options['filters']['field_end_value']['value']['value'] = time();
  }
}

--UPDATE--
Para sua visão específica, instalei o módulo Localização e criei alguns nós no NC e alguns na Geórgia e importei sua visão para teste. No meu módulo personalizado (nomeado dev), comecei com este código (com o devel instalado):

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']);
  }
}

A partir daí, continuei adicionando os valores óbvios exibidos no krumo à matriz até chegar aqui:

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    dpm($view->display['default']->handler->options['filters']['province']['value']);
  }
}

Que simplesmente imprimiu North Carolinaem Krumo. Nesse ponto, mudei de imprimir o valor para defini-lo assim:

function dev_views_pre_view(&$view) {
  if ($view->name == 'north_carolina') {
    $view->display['default']->handler->options['filters']['province']['value'] = 'Georgia';
  }
}

E pronto. Isso fez o truque.

Adam Balsam
fonte
Legal. Quando tiver uma chance, vou brincar com a sua opinião e ver se consigo encontrar uma resposta mais concreta.
precisa
@ blue928 veja acima. Atualizei minha resposta com uma resposta específica para suas perguntas e instruções gerais sobre como cheguei lá.
Adam Balsam
isso funcionou muito bem. Nota sobre a resposta correta: Parte do meu problema é que não precisei chamar views_get_view ou definir a exibição.
blue928
2

Caso alguém tenha esse tópico exibido enquanto procurava pela mesma solução no D8 (como eu fiz):

A nova API permite manipular esses parâmetros de maneira muito mais clara. Veja esta seção para referências.

Pequeno exemplo

function dev_views_pre_view(ViewExecutable &$view, $display_id, array &$args) {
  if ($display_id === 'my_unique_display_name') {
      $args[0] = 'desired_value';
  }
}
Der Zinger
fonte