按分类过滤内容类型的 Drupal 块

Posted

技术标签:

【中文标题】按分类过滤内容类型的 Drupal 块【英文标题】:Drupal block which filter content type by taxonomy 【发布时间】:2021-04-28 14:14:15 【问题描述】:

我正在使用 Drupal 9。我想让管理员能够放置一个块并从块中选择一个分类术语来过滤内容类型。

我通过使用分类“赞助商类型”创建自定义块来完成上述操作,如下面的屏幕截图所示。

我还使用views_embed_view 将分类法作为参数传递并使用Contextual filters 过滤数据

自定义块代码:

<?php

namespace Drupal\aek\Plugin\Block;

use Drupal\Core\Block\BlockBase;
use Drupal\Core\Form\FormStateInterface;

/**
 * Provides a 'SponsorsBlock' block.
 *
 * @Block(
 *  id = "sponsors_block",
 *  admin_label = @Translation("Sponsors"),
 * )
 */
class SponsorsBlock extends BlockBase 


  /**
   * @inheritdoc
   */
  public function defaultConfiguration() 
    return [
        "max_items" => 5,
      ] + parent::defaultConfiguration();
  

  public function blockForm($form, FormStateInterface $form_state) 

    $sponsors = \Drupal::entityTypeManager()
      ->getStorage('taxonomy_term')
      ->loadTree("horigoi");
    $sponsorsOptions = [];
    foreach ($sponsors as $sponsor) 
      $sponsorsOptions[$sponsor->tid] = $sponsor->name;
    
    $form['sponsor_types'] = [
      '#type'          => 'checkboxes',
      '#title'         => $this->t('Sponsor Type'),
      '#description'   => $this->t('Select from which sponsor type you want to get'),
      '#options'       => $sponsorsOptions,
      '#default_value' => $this->configuration['sponsor_types'],
      '#weight'        => '0',
    ];

    $form['max_items'] = [
      '#type'          => 'number',
      '#title'         => $this->t('Max items to display'),
      '#description'   => $this->t('Max Items'),
      '#default_value' => $this->configuration['max_items'],
      '#weight'        => '0',
    ];


    return $form;
  


  /**
   * @inheritdoc
   */
  public function blockSubmit($form, FormStateInterface $form_state) 
    $this->configuration['sponsor_types'] = $form_state->getValue('sponsor_types');
    $this->configuration['max_items'] = $form_state->getValue('max_items');
  


  /**
   * @inheritdoc
   */
  public function build() 
    $selectedSponsorTypes = $this->configuration['sponsor_types'];
    $cnxFilter = '';
    foreach ($selectedSponsorTypes as $type) 
      if ($type !== 0) 
        $cnxFilter .= $type . ",";
      
    

    return views_embed_view('embed_sponsors', 'default', $cnxFilter);
  



我现在的问题是如何限制结果。如果您在上面查看,我添加了一个选项“要显示的最大项目”,但是使用上下文过滤器我找不到任何方法来传递该参数来处理这个问题。

【问题讨论】:

【参考方案1】:

如果您使用views_embed_view(),您将无法访问视图对象。

手动加载您的视图,然后您可以在执行之前设置任何属性:

use Drupal\views\Views;


public function build() 
  $selectedSponsorTypes = $this->configuration['sponsor_types'];
  $cnxFilter = '';
  foreach ($selectedSponsorTypes as $type) 
    if ($type !== 0) 
      $cnxFilter .= $type . ",";
    
  

  $view = Views::getView('embed_sponsors');
  $display_id = 'default';
  $view->setDisplay($display_id);
  $view->setArguments([$cnxFilter]);
  $view->setItemsPerPage($this->configuration['max_items']);
  $view->execute();

  return $view->buildRenderable($display_id);

【讨论】:

以上是关于按分类过滤内容类型的 Drupal 块的主要内容,如果未能解决你的问题,请参考以下文章

Drupal 7 视图 - 按内容类型和分类术语分组

Drupal 视图过滤使用一个分类术语并使用参数添加另一个过滤器

根据drupal中的其他分类术语加载分类内容

drupal7 为视图添加 过滤标准 内容类型

Drupal 视图限制组成员发布的内容

Drupal Views - 按多个分类术语过滤