Как добавить несколько изменяемых предложений внутрь Ноды. Д8.

Аватар пользователя kompospec kompospec 8 февраля в 4:07

Есть Нода. Есть свой модуль.
Хочу чтоб в зависимости от Гет-запроса выдавалась различная запись внутри вывода Ноды.
Вопрос:
Как добавлять при выводе в Ноду различный контент. Именно просто добавлять. Записывать в БД ничего не нужно.

Хук какой или ещё как?

Спасибо.

Лучший ответ

Аватар пользователя OldWarrior OldWarrior 8 февраля в 7:48
1

kompospec wrote:... Как добавлять при выводе в Ноду различный контент. Именно просто добавлять. Записывать в БД ничего не нужно.

Хук какой или ещё как?

hook_entity_view

Добавить программное (виртульное) поле, а-ля:

<?php
...
function 
my_module_node_view(array &$build, \Drupal\Core\Entity\EntityInterface $node, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display$view_mode) {
  
// Например, если тип ноды = MY_NODE_TYPE (если нужно).
  
if ($node->bundle() == 'MY_NODE_TYPE') {
    
// Например, только при режиме дисплея 'full' (если нужно).
    
if ($view_mode == 'full') {
      
$request = \Drupal::request();
      if (
$request->query->has('nik')) {
        
$nik $request->query->get('nik');
        
$build['my_data'] = [
          
'#type'   => 'markup',
          
'#markup' => $nik == 'Привет чувак!' 'Ти кто такой? Мимо ходи.'
        
];
      }
    }
    
// Можно ещё при необходимости поэкспериментировать с кешем.
    
$build['#cache'] = ['max-age'=> 0];
  }
}
...
?>

Далее это виртуальное поле 'my_data' можно ещё темизировать в twig'е (если нужно).

Комментарии

Аватар пользователя OldWarrior OldWarrior 8 февраля в 7:48
1

kompospec wrote:... Как добавлять при выводе в Ноду различный контент. Именно просто добавлять. Записывать в БД ничего не нужно.

Хук какой или ещё как?

hook_entity_view

Добавить программное (виртульное) поле, а-ля:

<?php
...
function 
my_module_node_view(array &$build, \Drupal\Core\Entity\EntityInterface $node, \Drupal\Core\Entity\Display\EntityViewDisplayInterface $display$view_mode) {
  
// Например, если тип ноды = MY_NODE_TYPE (если нужно).
  
if ($node->bundle() == 'MY_NODE_TYPE') {
    
// Например, только при режиме дисплея 'full' (если нужно).
    
if ($view_mode == 'full') {
      
$request = \Drupal::request();
      if (
$request->query->has('nik')) {
        
$nik $request->query->get('nik');
        
$build['my_data'] = [
          
'#type'   => 'markup',
          
'#markup' => $nik == 'Привет чувак!' 'Ти кто такой? Мимо ходи.'
        
];
      }
    }
    
// Можно ещё при необходимости поэкспериментировать с кешем.
    
$build['#cache'] = ['max-age'=> 0];
  }
}
...
?>

Далее это виртуальное поле 'my_data' можно ещё темизировать в twig'е (если нужно).

Аватар пользователя OldWarrior OldWarrior 8 февраля в 14:38

А также в семёрке нет быстрых/удобных методов обращения к параметрам GET-запроса, а также удобного контроля за кешем build-массива и ещё 100500 вещей, которые облегчают жизнь. Если же из этого кода убрать комментарии и ненужные проверки (которые здесь приведены как опциональные конструкции), то получите ну может чуть более, чем заветные 2 строчки. Да и в кол-ве ли строчек суть? Или же боитесь переработать?

И вообще: может, хватит уже тосковать и ныть о "простоте" D7?

Аватар пользователя voviko voviko 8 февраля в 23:13

Это не слишком. Это правильно.
Я вот не поленился, и кино для вас заснял,хотя я тот еще стример и с первого раза не получилось..
И на самом деле надо изучать и развиваться.
Ничего сложного в этом нет. Если вы назвали себя разработчикам, то и делайте всё как разработчик.
ЗЫ. С вас 1 euro если воспользуетесь модулем. На развитие drupal!

">https://www.youtube.com/watch?v=4YFGfFZNTyw[/youtube]

extra_field_oneeuro

Аватар пользователя zvse zvse 8 февраля в 14:29

всё круто, кроме кэша.
Вместо max-age лучше добавить:
<?php $build['#cache']['contexts'][] = 'url.query_args';?>

Аватар пользователя OldWarrior OldWarrior 8 февраля в 14:42

Там специально поставил комментарий, что с кешем можно поэкспериментировать при необходимости. Кеширование по времени со значением 0 (т.е. кеш отключен) взято за дефолтную опцию. А так - да, можно кешировать хоть по контексту URL, хоть по тегам, хоть по сессии или ещё как угодно. Тут уже на усмотрение ТС, хотя он, как мне кажется, даже не будет заморачиваться с такими "несущественными" моментами. )

Аватар пользователя kompospec kompospec 8 февраля в 15:07

zvse wrote:
В семерке это делается абсолютно также как описано выше

Прям в Боди Ноды:

<?php
if($_GET['nik']==1) print 'привет чувак';
else print 
'Ти кто такой? Ходи отсюда';
?>
Аватар пользователя OldWarrior OldWarrior 8 февраля в 15:12

"...Годы страданий начались с тех пор, когда в город приехал новый художник Феофан Копытто.

Первая его работа вызвала в городе большой шум. Это был портрет заведующего гостиничным трестом. Феофан Копытто оставил станковистов далеко позади. Заведующий гостиничным трестом был изображен не масляными красками, не акварелью, не углем, не темперой, не пастелью, не гуашью и не свинцовым карандашом. Он был сработан из овса. И когда художник Копытто перевозил на извозчике картину в музей, лошадь беспокойно оглядывалась и ржала.

С течением времени Копытто стал употреблять также и другие злаки. Имели громкий успех портреты из проса, пшеницы и мака, смелые наброски кукурузой и ядрицей, пейзажи из риса и натюрморты из пшена.

Сейчас он работал над групповым портретом. Большое полотно изображало заседание окрплана. Эту картину Феофан готовил из фасоли и гороха. Но в глубине души он остался верен овсу, который сделал ему карьеру и сбил с позиций диалектических станковистов.

– Овсом оно, конечно, способнее! – воскликнул Остап. – А Рубенс-то с Рафаэлем дураки – маслом старались! Мы тоже дураки, вроде Леонардо да Винчи..."

Аватар пользователя kompospec kompospec 8 февраля в 15:10

OldWarrior wrote: А также в семёрке нет быстрых/удобных методов обращения к параметрам GET-запроса

Смешно. $_GET['nik'] - может быть что-то проще?

Аватар пользователя OldWarrior OldWarrior 10 февраля в 5:43

'markup' здесь - это просто частный пример. Это такой же элемент, как и другие элементы рендер-массивов или FAPI. Можете вместо него вывести 'table' или 'link' или 'textfield'. Да, это не поле в общем смысле, но и в build-массиве и, соответственно, в Twig'е оно доступно так же, как и типичные поля Друпала. Потому и написано "виртуальное".