it-swarm-ko.tech

특정 필드에 대한 사용자 정의보기 필터 핸들러를 추가하는 방법은 무엇입니까?

현재 부울 필드 field_private_content가 있습니다. 해당 필드가 설정되어 있으면 인증 된 사용자에게만 내용이 표시되어야하며 익명의 사용자는 티저와 로그인 양식 만 볼 수 있습니다. 지금까지는 해당 필드에 필터를 추가 한 뷰에서도 잘 작동합니다. 사용자 지정 모듈에서 hook_views_pre_view()을 구현하면 필터가 자동으로 제거됩니다.

function custom_module_views_pre_view(ViewExecutable $view, $display_id, array &$args) {
  // Remove filter on field_private_content != TRUE for authenticated users.
  if ($view->getHandler($view->current_display, 'filter', 'field_private_content') && \Drupal::currentUser()->isAuthenticated()) {
    $view->removeHandler($view->current_display, 'filter', 'field_private_content');
  }
}

그것은 잘 작동하지만보기 ui에서 행동은 분명하지 않습니다. 필자는 기본적으로 언급 된 동작이 있어야하고 올바르게 레이블이 지정 될 수있는 field_private_content 필터의 복제본을 선호합니다. 원래 필터는 원래 동작을 유지해야합니다.

어떻게 달성 할 수 있습니까?

특정 필드에 대한 사용자 정의보기 필터 핸들러를 추가하는 방법은 무엇입니까?

6
LarS

이 작업에는 약간의 노력이 필요하므로 여기서는 주요 부분과 Drupal 8의 사용자 지정보기 필터를 만드는 데 사용한 기사에 대한 참조 만 제공합니다.).

먼저 hook_views_data_alter() 구현 내에서 필터를 선언해야합니다.

$data['node_field_data']['nodes_titles'] = array(
  'title' => t('Node titles'),
  'filter' => array(
    'title' => t('Node titles'),
    'help' => t('Specify a list of titles a node can have.'),
    'field' => 'title',
    'id' => 'd8views_node_titles'
  ),
)

제목 열을 필터링하기 때문에 node_field_data 테이블에서 확장하지만 제목 열을 사용할 실제 필드로 사용합니다. 또한 이번에는 d8views_node_titles로 식별 된 필터링을 처리하기위한 플러그인을 만들고 있습니다. 이제이 클래스를 작성합니다.

src/Plugin/views/filter/NodeTitles.php :

    /**
     * @file
     * Definition of Drupal\d8views\Plugin\views\filter\NodeTitles.
     */

    namespace Drupal\d8views\Plugin\views\filter;

    use Drupal\views\Plugin\views\display\DisplayPluginBase;
    use Drupal\views\Plugin\views\filter\InOperator;
    use Drupal\views\ViewExecutable;

    /**
     * Filters by given list of node title options.
     *
     * @ingroup views_filter_handlers
     *
     * @ViewsFilter("d8views_node_titles")
     */
    class NodeTitles extends InOperator {

      /**
       * {@inheritdoc}
       */
      public function init(ViewExecutable $view, DisplayPluginBase $display, array &$options = NULL) {
        parent::init($view, $display, $options);
        $this->valueTitle = t('Allowed node titles');
        $this->definition['options callback'] = array($this, 'generateOptions');
      }

      /**
       * Override the query so that no filtering takes place if the user doesn't
       * select any options.
       */
      public function query() {
        if (!empty($this->value)) {
          parent::query();
        }
      }

      /**
       * Skip validation if no options have been chosen so we can use it as a
       * non-filter.
       */
      public function validate() {
        if (!empty($this->value)) {
          parent::validate();
        }
      }

      /**
       * Helper function that generates the options.
       * @return array
       */
      public function generateOptions() {
        // Array keys are used to compare with the table field values.
        return array(
          'my title' => 'my title',
          'another title' => 'another title',
        );
      }

    }

플러그인 내에서 Drupal 8 에서 사용자 정의보기 필터 만들기)에 설명 된대로 세 가지 방법을 재정의해야합니다.

init() 안에 필터 옵션 세트의 제목과 옵션 값을 생성하는 콜백을 지정합니다. 이 콜백은 호출 가능해야하며이 경우이 클래스에서 generateOptions() 메소드를 선택했습니다. 후자는 사용자에게 제공 할 옵션 배열을 반환하며,이 키는 쿼리 변경에 사용됩니다. 또는 사용 가능한 제목으로 $this->valueOptions 속성을 채워서 init() 메서드 내에 옵션을 직접 만들 수도 있습니다. 필요한 노드 제목을 제공하는 다양한 로직을 수행 할 수 있기 때문에 콜백을 사용하는 것이 더 깔끔합니다.

query()validate() 메서드를 재정의하는 것은 사용자가 제목을 선택하지 않고 필터를 만든 경우 쿼리 및 유효성 검사가 발생하지 않도록하는 것입니다. 이런 식으로 필터는 0 개의 결과를 반환하는 것이 아니라 결과에 영향을 미치지 않습니다. 다양한 기능을 재정 의하여 요구에 맞게 플러그인을 조정하는 방법을 설명하기위한 단순한 기본 설정입니다.

12
Adrian Cid Almaguer