API Drupal 8

Здесь я постараюсь собрать некоторые решения типовых задач связанных с API Drupal(текущая версия ядра 8.3.*).

Ссылки:

Документация на drupal.org.

API функции.

Хуки Drupal 8.

Список опубликованных материалов(статей) на сайте.

Вывод осуществляем в на странице созданной в пользовательском модуле(подробнее здесь).

use Drupal\Core\Controller\ControllerBase;
use Drupal\node\Entity\Node;

class MyModuleArticleController extends ControllerBase {
public function helloWorld() {
    $output = array();

    $output['#title'] = 'HelloWorld page title'; //заголовок статьи
   
//вызываем массив node типа artiсle
    $nids = \Drupal::entityQuery('node')
  ->condition('type', 'article') 
  ->execute();
$nodes = \Drupal::entityTypeManager()
  ->getStorage('node')
  ->loadMultiple($nids);


//цикл перебора массива с выводом названий статей на страницу сайта
$titles = '';
foreach ($nodes as $node) {
$title = $node->getTitle();

$titles = $titles . '<p>' . $title . '</p>';
}

//var_dump($titles);
   
    $output['#markup'] = t($titles)

 return $output;
  }

 

Переопределение функции ядра(хук).

Переопределение функция ядра drupal это действие, которое часто становится необходимым. В списке ссылок(в начале статьи) вы можете найти список хуков для drupal 8. В моем случае переопределяться будет функция вызываемая при сохранении типа материала(статья). Это может потребоваться, например, кросспостинге данной статьи.

Ссылка на API hook_ENTITY_TYPE_presave.

Данная функция проверяет наличие пользовательского поля в статье, и при его наличие, выполняет какое-либо действие. Вообще, я использовал эту функцию для тестирования выводил в сохраненной статье вместо контента строчку, в зависимости от срабатывания условия. При необходимости добавления контента в поле "body" этой функцией нужно осуществлять по-другому, так как происходит нарушения шаблона статьи, в следствии чего начинают отображаться( а не выполняться) html теги.

use Drupal\node\Entity\Node;
use Drupal\node\NodeInterface;

function mymodule_node_presave(NodeInterface $node) {
if ($node->bundle() == 'article') {
   $value_field = $node->get('field_me')->value;
   if($value_field == null){
   $node->set('body','value_field is null');
    } else {
       if ($value_field == true){
       // Какое-то, нужное вам, действие
        $node->set('body', 'value_field is true' );
       } else {
         $node->set('body', 'value_field is false');
         }
      }
} 

 

hook_node_insert(NodeInterface $node){...}  (вместо слова hook пишут имя модуля, в котором функция определяется).

Данный хук срабатывает уже после сохранения сущности(node). Зачастую необходимо использовать именно ее, так как только на этом этапе доступно значение nid . Используя предыдущую функцию значение nid получить нельзя.

 

public function preSave() {...} .

Также часто используемая функция, не является полноценным хуком. Вообще это метод, которые определяется в классе унаследованным от FieldItemBase. Например, использовать эту функция можно при создании класса, который определяет тип пользовательского поля. При создании поля данного пользовательского типа с помощью этой функции можно запомнить имя этого поля.

 

Разное:

GET запрос:

$client = \Drupal::httpClient();
$request = $client->get($linc_post);
$response = $request->getBody();

******************************

Редирект на сторонний ресурс:


 

use Drupal\Core\Routing\TrustedRedirectResponse;
      $probe_url = new TrustedRedirectResponse($vk_url);
      $form_state->setResponse($probe_url);

***************************

Передача значения переменной с одной страницы сайта на другую:

Там, откуда происходит передача:

$_SESSION['my_content'] = $var_export;

Там, куда идет передача:

$var_import = $_SESSION['my_content'];

****************************
доступ к данным ноды:
 

use Drupal\node\Entity\Node;

$node->getTitle(); //заголовок
$title = $node->get('field_name')->value; //получить значение поля

$nid = $node->id(); // id ноды

// получение ссылки на картинку добавленное в поле image в ноде
$uri = $node->get('field_image')->entity->uri->value;
$url = file_create_url($uri);

$type_of_node = $node->bundle() //возвращает тип ноды
//$type_of_node == 'article'

*******************************
Поля

Получить массив всех полей:

$field_types = \Drupal::service('plugin.manager.field.field_type')->getDefinitions();

Получить массив всех полей ноды(тип article):

$entityManager = \Drupal::service('entity_field.manager');
$fields = $entityManager->getFieldDefinitions('node', 'article');

Получение значения поля:

\Drupal::config('name_module.name_storage')->get('name_module.name_field');

********************************
//получить домен сайта:
 

$site = 'http://' . \Drupal::request()->getHost();

*******************************
полезные php функции

urlencode($new_linc) //кодирует русские символы для отправки через url

*********************************