it-swarm-ko.tech

프로그래밍 방식으로 뷰에서 FILTER CRITERIA 추가

프로그래밍 방식으로 filter criteria를 추가/수정하고 싶습니다.

예를 들어,보기를 위해 동적으로 변경하기 위해 값이 필요한 "이메일 주소"필터를 추가했습니다. 현재 로그인 한 사용자의 이메일 ID로 설정해야합니다.

그것을 달성하는 방법? 자세한 내용은 첨부 된 이미지를 참조하십시오. 도와주세요.

enter image description here

18
Shafiul

"[email protected]"과 같이 그림에서 찾은 "value"필드에 입력 한 후 Devel 모듈과 dpm($view)dpm($query)을 사용하십시오. devel 출력에서 ​​뷰 및 쿼리의 객체/배열 구조를 참조하십시오.

그런 다음 모듈의 hook_views_query_alter(&$view, &$query) 함수를 사용하여 WHERE 조건 필터 조건을 대상으로하고 원하는 값으로 설정하십시오.

다음과 같은 것 :

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;
  }
}
25
tenken

대안은 다음과 같습니다.

$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();

난 당신이 아마도 난해하고 복잡한 방법을 사용하여 이것을 설정해야한다는 것을 알고 있습니다.

7
rix

사이트 성능과 캐싱을 손상시키지 않도록 렌더링 시간이 아닌 후크에서 이들을 변경하는 것이 좋습니다. hook_views_pre_build () 발사가 너무 늦으면 hook_views_pre_view () 가 필요하다는 것을 알기 위해 나이가 들었습니다.

$ view-> add_item () 사용에 대한 참조를 찾았지만 예를 들어 어려움을 겪었습니다. 아래는 특정 용어 만 포함하도록 분류 용어를 필터링하는 솔루션입니다.

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

메모 편집 : 이 코멘트 do 그룹에서 $view->display_handler->get_option('filters')를 사용하여 뷰 필터를 얻는 방법을 알아 냈습니다. $view->display_handler->override_option('filters', $filters);를 사용하여 재정의합니다.

6
Duncanmoo

비슷한 문제가 있었지만 여러 인수를 필터에 전달하려고합니다. "views_get_view"메소드를 사용했지만 뷰에 인수를 전달했습니다. 누군가에게 도움이되기를 바랍니다. 필요에 따라 인수 유형 또는 값을 대체 할 수 있습니다.

고급 뷰 설정 필드 세트에서 컨텍스트 필터를 뷰 자체에 추가했습니다. 첫 번째는 "컨텐츠 : 분류 용어 ID가 있습니다"입니다. 두 번째 것은 "콘텐츠 : nid"이며 "여러 개 허용"을 선택하고 "제외"확인란을 선택합니다 (컨텍스트 필터 팝업의 'more'필드에서).

 args [] = '1'; // 용어 ID 
 args [] = '1 + 2 + 3'; // Node 제외/포함 할 ID 
 
 $ view = views_get_view ($ view_name); 
 $ view-> init (); 
 $ view-> set_display ($ display); 
 $ view-> set_arguments ($ args); 
 $ view-> execute (); 
 $ view- > 결과 

업데이트 : 컨텍스트 필터 값 내에서 PHP 코드를 선택하고 전달 된보기 인수를 반환해야 할 수도 있습니다. 예 :

 반환 $ view-> args [1]; 
3
Seb

Drupal 8에서 ViewExecutable::setHandler($display_id, $type, $id, $item)을 사용하여 프로그래밍 방식으로 필터를 설정할 수 있습니다.

2
vlledo

다음은 Drupal 8에서 프로그래밍 방식으로 필터 기준을 추가하는 방법에 대한 예입니다.

/**
 * @param ViewExecutable $view
 * @param QueryPluginBase $query
 *
 * Sets a custom custom filter criteria (takes current language into account)
 */
function MODULE_views_query_alter(ViewExecutable $view, QueryPluginBase $query) {
  if ($view->storage->id() === 'my_view_id') {
    $query->addWhere(0, 'node__field_custom_criteria.field_custom_criteria_value', \Drupal::languageManager()->getCurrentLanguage()->getId(), '=');
  }
}

위의 쿼리는 field_custom_criteria 필드는 현재 선택된 언어와 같습니다.

자세한 내용은 문서에서 찾을 수 있습니다. hook_views_query_alter

1
estrar

@ Duncanmoo 's answer above 에 근거하여 가장 훌륭하다고 생각한 다음 필터를 내 견해에 추가했습니다. 참조 분류 체계를 기준으로 필터링하지만 참조 엔티티 또는 NID를 기준으로 필터링하려면 다음을 수행하십시오.

function [MYMODULE]_views_pre_view(&$view, &$display_id, &$args) {
  if (($view->name == '[your view name]') && ($display_id == '[your display id]')) {
    // Get referenced service - example for entity reference.
    $node = menu_get_object();
    $node_wrapper = entity_metadata_wrapper('node', $node->nid);
    $referenced_service = $node_wrapper->field_service_ref->value();
    // Add service id as a filter to view.
    $filters = $view->display_handler->get_option('filters');
    if (empty($filters['field_service_ref_target_id'])) {
      // Only display operations nodes that reference the same service.
      $view->add_item(
        $display_id,
        'filter',
        'field_data_field_service_ref',
        'field_service_ref_target_id',
        array(
          'operator' => '=',
          'value' => ['value' => $referenced_service->id],
          'group' => 1
        )
      );
    }
    // Add nid as a filter to view - example for NID filter
    if (empty($filters['nid'])) {
      // Don't include current operation in list of related operations.
      $view->add_item(
        $display_id,
        'filter',
        'node',
        'nid',
        array(
          'operator' => '!=',
          'value' => ['value' => $node->nid],
          'group' => 1
        )
      );
    }
  }
}
1
kbrinner