Как правильно использовать hook_insert в Drupal 8 - PullRequest
0 голосов
/ 01 ноября 2018

Я создал специальный модуль для Drupal 8. Я сделал хук, который должен обнаруживать каждый раз, когда создается новый узел, а затем отправлять уведомление подписчику. У меня есть код:

<?php 

/**
* @file
* Contains onesignal_api.module.
* 
*/

use Drupal\Core\Entity\EntityInterface;

/***
* Hook into OneSignal API to send push notifications once a new node is created
*/

function onesignal_api_insert(\Drupal\Core\Entity\EntityInterface $node) {
if($node->isNew()) {
    function sendMessage() {
      $content      = array(
          "en" => 'New Node Created'
      );
      $hashes_array = array();
      array_push($hashes_array, array(
          "id" => "like-button",
          "text" => "Like",
          "icon" => "http://i.imgur.com/N8SN8ZS.png",
          "url" => "http://push-test/"
      ));
      array_push($hashes_array, array(
          "id" => "like-button-2",
          "text" => "Like2",
          "icon" => "http://i.imgur.com/N8SN8ZS.png",
          "url" => "http://push-test/"
      ));
      $fields = array(
          'app_id' => "XXXXXXXXX",
          'include_player_ids' => array("XXXXXX","XXXXX","XXXXXX"),
          'data' => array(
              "foo" => "bar"
          ),
          'contents' => $content,
          'web_buttons' => $hashes_array
      );

      $fields = json_encode($fields);
      print("\nJSON sent:\n");
      print($fields);

      $ch = curl_init();
      curl_setopt($ch, CURLOPT_URL, "https://onesignal.com/api/v1/notifications");
      curl_setopt($ch, CURLOPT_HTTPHEADER, array(
          'Content-Type: application/json; charset=utf-8',
          'Authorization: Basic XXXXXXX'
      ));
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
      curl_setopt($ch, CURLOPT_HEADER, FALSE);
      curl_setopt($ch, CURLOPT_POST, TRUE);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
      curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);

      $response = curl_exec($ch);
      curl_close($ch);

      return $response;
  }

  $response = sendMessage();
  $return["allresponses"] = $response;
  $return = json_encode($return);

  $data = json_decode($response, true);
  print_r($data);
  $id = $data['id'];
  print_r($id);

  print("\n\nJSON received:\n");
  print($return);
  print("\n");

 }//if Node is new
}//func hook signal

Есть что-то, что мне нужно изменить, чтобы заставить это работать? весь код внутри оператора if работает вне оператора if.

Ответы [ 2 ]

0 голосов
/ 05 ноября 2018

Пожалуйста, посмотрите код ниже и добавьте ваш код в соответствии с вашими требованиями.

function onesignal_api_entity_insert (Drupal \ Core \ Entity \ EntityInterface $ entity) {

if ($ entity-> getEntityType () -> id () == 'node') {

    switch ($entity->bundle()) {

       case 'content-type-name':    // if multiple entities 
    }
  }     
} 
0 голосов
/ 02 ноября 2018

Вы, вероятно, хотите реализовать hook_node_presave .

Действует на создаваемом или обновляемом узле до . Сохраняется в базе данных:

function onesignal_api_node_presave(\Drupal\Core\Entity\EntityInterface $node) {
  if ($node->isNew()) {
    // $node is about to be created...
  }
}

@ см. hook_ENTITY_TYPE_presave

...