Cách tốt nhất để hiển thị các trường của một nút trong các khu vực khác nhau trong Drupal 8 là gì?
Tôi nghĩ rằng, không có thực hành tốt nhất cho điều đó, thậm chí có thể không phải là một thực hành tốt, nhưng nó không phải là không thể làm, làm theo một vài lựa chọn
Đối với tôi đây là tùy chọn tốt nhất: Bạn có thể tạo một khối tải nút hiện tại và hiển thị node_field mong muốn của bạn. Bằng cách này, và bạn có thể quản lý thông qua UI một cách dễ dàng (Khối của bạn với 'node_type' select và 'field_name' select rất dễ dàng và nhanh chóng để làm điều đó).
Bắt đầu Chỉnh sửa 1
Ở đây tôi thực hiện khối đó, kiểm tra và vui lòng nhận xét kết quả
<?php
/**
* @file
* Contains \Drupal\ module_name\Plugin\Block\NodeFieldBlock.
*/
namespace Drupal\module_name\Plugin\Block;
use Drupal\Core\Block\BlockBase;
use Drupal\Core\Cache\Cache;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\EntityFieldManagerInterface;
use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
use Drupal\field\Entity\FieldConfig;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
/**
* Provides a Filter by vocabulary terms block.
*
* @Block(
* id = "node_field_block",
* admin_label = @Translation("Node Field")
* )
*/
class NodeFieldBlock extends BlockBase implements ContainerFactoryPluginInterface {
/**
* The Entity Type Manager.
*
* @var Drupal\Core\Entity\EntityTypeManagerInterface
*/
protected $entityTypeManager;
/**
* The Entity Field Manager.
*
* @var Drupal\Core\Entity\EntityFieldManagerInterface
*/
protected $entityFieldManager;
/**
* The Entity Display Repository.
*
* @var Drupal\Core\Entity\EntityDisplayRepository
*/
protected $entityDisplayRepository;
/**
* Dependency injection through the constructor.
*
* @param array $configuration
* A configuration array containing information about the plugin instance.
* @param string $plugin_id
* The plugin ID for the plugin instance.
* @param mixed $plugin_definition
* The plugin implementation definition.
* @param \Drupal\Core\Entity\EntityManagerInterface $entity_type_manager
* The Entity Type Manager.
* @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager
* The Entity Field Manager.
* @param \Drupal\Core\Entity\EntityDisplayRepositoryInterface $entity_display_repository
* The Entity Display Repository.
*/
public function __construct(array $configuration, $plugin_id, $plugin_definition,
EntityTypeManagerInterface $entity_type_manager,
EntityFieldManagerInterface $entity_field_manager,
EntityDisplayRepositoryInterface $entity_display_repository) {
parent::__construct($configuration, $plugin_id, $plugin_definition);
$this->entityTypeManager = $entity_type_manager;
$this->entityFieldManager = $entity_field_manager;
$this->entityDisplayRepository = $entity_display_repository;
}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
return new static(
$configuration,
$plugin_id,
$plugin_definition,
$container->get('entity_type.manager'),
$container->get('entity_field.manager'),
$container->get('entity_display.repository')
);
}
/**
* {@inheritdoc}
*/
public function defaultConfiguration() {
return array(
'node_type' => array_keys(node_type_get_names())[0],
'view_mode' => 'default',
'field' => '',
);
}
/**
* {@inheritdoc}
*/
public function blockForm($form, FormStateInterface $form_state) {
$types = node_type_get_names();
$config = $this->configuration;
if ($node_type = $form_state->getValue(array('settings', 'node_type'))) {
$config['node_type'] = $node_type;
}
$form['node_type'] = array(
'#title' => $this->t('Content type'),
'#type' => 'select',
'#options' => $types,
'#default_value' => $config['node_type'],
'#ajax' => array(
'callback' => array(get_class($this), 'updateFieldList'),
'wrapper' => 'edit-node-wrapper',
),
);
$form['options'] = array(
'#type' => 'container',
'#prefix' => '<div id="edit-node-wrapper">',
'#suffix' => '</div>',
);
$form['options']['view_mode'] = array(
'#title' => $this->t('View mode'),
'#type' => 'select',
'#multiple' => FALSE,
'#options' => $this->getViewModes($config['node_type']),
'#default_value' => $config['view_mode'],
);
$form['options']['field_list'] = array(
'#title' => $this->t('Field list'),
'#type' => 'select',
'#multiple' => FALSE,
'#options' => $this->getFieldList($config['node_type']),
'#default_value' => $config['field'],
);
return $form;
}
/**
* {@inheritdoc}
*/
public function blockSubmit($form, FormStateInterface $form_state) {
$this->configuration['node_type'] = $form_state->getValue('node_type');
$this->configuration['view_mode'] = $form_state->getValue(array('options', 'view_mode'));
$this->configuration['field'] = $form_state->getValue(array('options', 'field_list'));
}
/**
* {@inheritdoc}
*/
public function build() {
$config = $this->configuration;
$build = array();
if ($node = \Drupal::routeMatch()->getParameter('node')) {
if ($config['node_type'] == $node->getType()) {
if ($field = $node->get($config['field'])) {
$build['field'] = $field->view($config['view_mode']);
}
}
}
return $build;
}
/**
* {@inheritdoc}
*/
public function getCacheTags() {
if ($node = \Drupal::routeMatch()->getParameter('node')) {
return Cache::mergeTags(parent::getCacheTags(), array('node:' . $node->id()));
} else {
return parent::getCacheTags();
}
}
/**
* {@inheritdoc}
*/
public function getCacheContexts() {
return Cache::mergeContexts(parent::getCacheContexts(), array('route'));
}
/**
* Função que cria uma lista de fields de um node type.
*
* @param string $node_type
* O id do node type.
* @return array
* Retorna a lista de campos do node type.
*/
protected function getFieldList($node_type) {
if (!empty($node_type)) {
$list = $this->entityFieldManager->getFieldDefinitions('node', $node_type);
foreach ($list as $id => $field) {
if ($field instanceof FieldConfig) {
$list[$id] = $field->label();
} else {
unset($list[$id]);
}
}
return $list;
}
return array();
}
/**
* Função que cria uma lista de view modes de um node type.
*
* @param string $node_type
* O id do node type.
* @return array
* Retorna a lista de view mode do node type.
*/
protected function getViewModes($node_type) {
return $this->entityDisplayRepository->getViewModeOptionsByBundle('node', $node_type);
}
/**
* Handles switching the node type selector.
*/
public static function updateFieldList(&$form, FormStateInterface &$form_state, Request $request) {
return $form['settings']['options'];
}
}
Kết thúc chỉnh sửa 1
Hoặc ... đưa trường của bạn vào preprocess_region
và tải một var (điều này rất dễ chứng minh).
function THEME_preprocess_region(&$variables) {
//TODO: change for you region name
if ($variables['region'] == 'sidebar_right') {
if ($node = \Drupal::routeMatch()->getParameter('node')) {
//TODO: change for you node type
if ($node->getType() == 'article') {
//If you need a flag for this type
$variables['is_article'] = TRUE;
//Here is your field
$variables['node_field'] = $node->get('field_descricao')->view();
}
}
}
}
Và sử dụng trong tập tin twig của bạn
{% if node_field %}
{{ node_field }}
{% endif %}
THẬN TRỌNG:
Trong tương lai, bạn không thể xóa trường này, nếu bạn xóa, sẽ phá vỡ trang của bạn. Giải thích: $node->get('field_descricao')
sẽ đánh giá không null sau đó null->view()
= trang bị hỏng. Ngay cả bạn quan tâm đến điều này, ai đó hoặc thậm chí bạn có thể quên điều này và sẽ đau đầu tại sao thông tin đó không hiển thị nữa.