Usando hook_form_alter em filtros de exibição exposta no Drupal 7

12

Estou tendo problemas para usar hook_form_alter()com o Views 3 e o Drupal 7.

Não consigo adicionar uma instrução if para identificar exclusivamente uma exibição; seja o que for que eu coloquei, a declaração if nunca é considerada verdadeira. No entanto, posso usar facilmente o form_id usando o seguinte, então não tenho certeza de onde estou errado!

if ($form_id == 'views_exposed_form') {
}

Como uso hook_form_alter()para alterar exclusivamente uma única visão minha?

SimonK
fonte

Respostas:

25

Você pode obter acesso ao objeto de visualização em hook_form_alter acessando $form_state['view']. Isso permite que você identifique uma visão específica:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
    if ($form_id == 'views_exposed_form') {
        $view = $form_state['view'];
        if ($view->name == 'my_view_machine_name' && $view->current_display == 'display_name') {
            // alter your exposed form here
        }
    }
}
Mirroar
fonte
esta é a melhor solução, uma vez $ form_id não é suficiente para formas expostos (ao contrário de como as outras respostas estado), current_display unfortunetly pode não ser suficiente é algumas situações com conjuntos complexos de pontos de vista sobre mesma página
Rotari Radu
Concordado - esta é a solução mais direcionada. Muito útil se você estiver usando várias visualizações de formulários de filtro expostos.
Sábio
Use drupal_set_message ($ view-> name); & drupal_set_message ($ view-> current_display); para obter seus nomes. Fiquei um pouco confuso pensando que era "views_deals", mas eram apenas "acordos" no meu caso.
Collins
Como podemos fazer a mesma coisa Drupal 8?
Sharique
Melhor usar em mymodule_form_views_exposed_form_alter() vez de mymodule_form_alter, então você pode pular a verificação $form_id.
Berend de Boer
18

O que eu faria é dar um passo atrás e ver se você está registrando esse gancho. Muitas vezes $form_ida mudança.

Processo de depuração:

  • Ativar desenvolvimento
  • Insira dsm ($ form_id) dentro do seu gancho, como costumava fazer com o D6
  • Limpe seu cache

Código de exemplo (interno mymodule.moduleou template.phparquivo) de drupal.org :

<?php
/**
 * Implements hook_form_alter().
 */
function mymodule_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'form_views_exposed_form') {
    drupal_set_message("Form ID is : " . $form_id);
  }
}
?>

Você verá um monte de IDs de formulário impressos, selecione suas visualizações expostas no gancho de formulário e trabalhará a partir daí.

Além disso, com o drupal 7, você pode segmentar formulários específicos por ID diretamente .

Exemplo:

<?php
/**
 * Implements hook_form_alter().
 */
function mymodule_form_views_exposed_form_alter(&$form, &$form_state, $form_id) {
  drupal_set_message("Form ID is : " . $form_id);
}
?>

Observe que, se você estiver usando vários formulários expostos, poderá verificar uma visualização específica examinando $ form ['# id'] na função alter form.

Por fim, se isso não funcionar, eu recomendaria revisar esta fila de problemas: Como alterar o filtro nos filtros expostos através do form_alter hook

chrisjlee
fonte
2

Recentemente, também deparei com esse problema, mas estou usando o módulo de recursos em vez do personalizado. Isso me ajudou a resolver o problema.

/**
 * Implements hook_views_api_alter()
 */
function MY_FEATURE_views_api_alter(&$vars) {
  if (isset($vars['MY_FEATURE'])) {
    $vars['MY_FEATURE']['path'] = drupal_get_path('module', 'MY_FEATURE');
  }
}

E então você pode usar o seu hook_form_views_exposed_form_alter ():

/**
 * Implements hook_form_views_exposed_form_alter().
 */
function MY_FEATURE_form_views_exposed_form_alter(&$form, &$form_state) {
  if($form['#id'] == 'views-exposed-form-search-products-page') {
    $form['price'] = array(
      '#type'    => 'select',
      '#size'    => NULL,
      '#options' => _getPriceOptions(),
    );
  }
}
Vlad Moyseenko
fonte