如何解决按分类过滤内容类型的 Drupal 块
我正在使用 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'],];
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);
}
}
我现在的问题是如何限制结果。如果您查看上面的内容,我添加了一个选项“要显示的最大项目数”,但是使用上下文过滤器我找不到任何方法来传递该参数来处理此问题。
解决方法
如果您使用 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);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。