Drupal 8怎样创建一个当前文章所含术语相关的文章列表区块

By admin, 14 二月, 2015

An example of view block with related nodes based on 'tags'.
1. Create a block (take a look at screenshots below)
2. Add a relationship: Taxonomy term: Content using: Tags
3. Add contextual filter: (field_tags) Content: Nid

When the filter value is NOT available
Provide default value -> Content ID from URL

check: Exclude
this contextual filter will remove current node from the view
4. Add contextual filter: Taxonomy term: Term ID

When the filter value is NOT available
Provide default value -> Taxonomy term ID from URL
check: Load default filter from term page
check: Load default filter from node page, that's good for related taxonomy blocks
choose the vocabulary (tags in this case)
Multiple-value handling -> Filter to items that share any term

When the filter value IS available or a default is provided
Specify validation criteria -> Basic validation

check: Allow multiple values
5. Define the fields (only titles in this case)
6. Make the view display only distinct items

Other -> Query settings:
check: Distinct
check: Pure distinct




Restricted HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id> <img src>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.


8 years 8 months 之前



namespace Drupal\howto\Plugin\Block;
use Drupal\Core\Block\BlockBase;
 * Provides Similar content by taxonomy terms Block
 * @Block(
 *   id = "similar_content_block",
 *   admin_label = @Translation("Similar Content"),
 * )
class SimilarContentBlock extends BlockBase {
   * {@inheritdoc}
  public function build() {
    $node = \Drupal::routeMatch()->getParameter('node');
    if ($node) {
      $nid = $node->id();
      $result = db_query_range('SELECT DISTINCT n.nid, n.title
          FROM node__field_tags t1
          INNER JOIN node__field_tags t2
          ON t1.entity_id = :nid AND t1.field_tags_target_id = t2.field_tags_target_id
          INNER JOIN node_field_data n
          ON t2.entity_id = n.nid
          WHERE n.nid != :nid
          ORDER BY n.created DESC', 0, 5,
          array(':nid' => $nid))->fetchAll();
      if (count($result) > 0) {
        $html = '<div class="block-views">';
        foreach ($result as $row) {
          $html .= '<div class="views-row">' . \Drupal::l($row->title,
              \Drupal\Core\Url::fromUri('entity:node/' . $row->nid)) .
        $html .= '</div>';

        return array(
            '#markup' => $html,
            '#cache' => array('contexts' => array('url')),
    return array();