Drupal 7의 노출 된 뷰 필터에서 hook_form_alter 사용


12

hook_form_alter()Views 3 및 Drupal 7에서 사용 하는 데 문제가 있습니다.

뷰를 고유하게 식별하기 위해 if 문을 추가 할 수 없습니다. 내가 무엇을 넣든 if 문은 결코 사실이 아닙니다. 그러나 다음을 사용하여 form_id를 쉽게 사용할 수 있으므로 어디에서 잘못 가고 있는지 확실하지 않습니다!

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

hook_form_alter()내 단일 뷰를 고유하게 변경 하려면 어떻게해야 합니까?

답변:


25

에 액세스하여 hook_form_alter 내에서 뷰 객체에 액세스 할 수 $form_state['view']있습니다. 이를 통해 특정 뷰를 식별 할 수 있습니다.

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
        }
    }
}

이것은 $ form_id가 노출 된 폼에 충분하지 않기 때문에 (다른 답변의 상태와는 달리) 불행히도 current_display로 충분하지 않을 수 있습니다. 같은 페이지에 복잡한 뷰 세트가있는 경우도 있습니다
Rotari Radu

합의-이것은보다 표적화 된 솔루션입니다. 다중보기 노출 필터 양식을 사용하는 경우 매우 유용합니다.
Sage

drupal_set_message ($ view-> name)을 사용하십시오. & drupal_set_message ($ view-> current_display); 당신의 이름을 얻을 수 있습니다. 나는 그것이 "views_deals"라고 생각하면서 약간 혼란 스러웠지만, 제 경우에는 단지 "거래"였습니다.
Collins

Drupal 8과 같은 일을 어떻게 할 수 있습니까?
Sharique

mymodule_form_views_exposed_form_alter() 대신에 사용하는 것이 좋습니다 . mymodule_form_alter확인을 건너 뛸 수 있습니다 $form_id.
Berend de Boer

18

내가 할 일은 한 걸음 물러서서이 후크를 등록하고 있는지 확인하는 것입니다. 종종 $form_id변화.

디버깅 과정 :

  • 개발을 켭니다
  • D6과 같이 dsm ($ form_id)을 후크 안에 삽입하십시오.
  • 캐시를 비 웁니다

drupal.org의 예제 코드 (내부 mymodule.module또는 template.php파일) :

<?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);
  }
}
?>

당신은 많은 양식 ID가 인쇄 된 것을 볼 수 있습니다.보기 양식 노출 후크를 선택하고 거기서부터 작업하십시오.

또한 drupal 7을 사용하면 ID 별로 특정 양식을 직접 타겟팅 할 수 있습니다 .

예:

<?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);
}
?>

노출 된 양식을 여러 개 사용하는 경우 form alter 함수에서 $ form [ '# id']를 검사하여 특정보기를 확인할 수 있습니다.

마지막으로, 그래도 작동하지 않으면이 문제 큐를 검토하는 것이 좋습니다. 노출 된 필터에서 필터를 변경하는 방법


2

최근 에이 문제에 부딪 쳤지 만 사용자 지정 기능 대신 기능 모듈을 사용하고 있습니다. 이 문제를 해결하는 데 도움이되었습니다.

/**
 * 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');
  }
}

그리고 당신은 당신의 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(),
    );
  }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.