logo

Dodatni tipovi blokova (EBT) - Novo iskustvo rada sa Layout Builder-om❗

Dodatni tipovi blokova (EBT) – stilizovani, prilagodljivi tipovi blokova: slajdšouvi, kartice sa tabovima, kartice, akordeoni i mnogi drugi. Ugrađena podešavanja za pozadinu, DOM Box, javascript dodatke. Iskusite budućnost kreiranja rasporeda već danas.

Demo EBT moduli Preuzmite EBT module

❗Dodatni tipovi pasusa (EPT) – Novo iskustvo rada sa pasusima

Dodatni tipovi pasusa (EPT) – analogni skup modula zasnovan na pasusima.

Demo EPT moduli Preuzmite EPT module

Scroll
22/05/2025, by Ivan

Ova stranica prikazuje primere raznih POST zahteva za JSON:API modul.

POST zahtevi se koriste za kreiranje novih resursa. Ako želite da izmenite resurse, treba da koristite PATCH zahteve.

JSON:API specifikacija (a samim tim i JSON:API modul) podržava kreiranje samo jednog resursa po POST zahtevu. Za Drupal, to znači da nije moguće (samo ovim modulom) kreirati više entiteta u jednom zahtevu. Ovo može biti potrebno ako želite da kreirate referencirane entitete istovremeno sa roditeljskim entitetom. Dok JSON:API ne podržava takvo ponašanje, moduli kao što je Subrequests mogu pomoći u tim zahtevima.

Omogućavanje kreiranja resursa

Posetite /admin/config/services/jsonapi
i čekirajte opciju "Accept all JSON:API create, read, update, and delete operations." (Prihvati sve JSON:API operacije: kreiranje, čitanje, izmenu i brisanje).

Create, Read, Update, Delete methods
Enable Create, Read, Update, Delete methods

Autentifikacija

Obično se za POST zahteve koristi neka vrsta autentifikacije. Svi primeri ispod koriste Basic Authentication sa korisničkim imenom i lozinkom postojećeg korisnika na sajtu koji ima dozvolu da kreira zadati sadržaj.

Omogućite HTTP Basic Authentication (basic_auth) modul, podesite dozvole za API korisnika (i ulogu) i podesite kodirano korisničko ime i lozinku u 'Authorization' zaglavlje zahteva.

Zaglavlje iz primera na ovoj stranici zahteva Drupal korisnika sa korisničkim imenom 'api' i lozinkom 'api'.

Zaglavlja

Sledeća zaglavlja su obavezna za sve POST zahteve kako bi JSON:API pravilno obradio zahtev i dao odgovor.

  • Accept: application/vnd.api+json
  • Content-Type: application/vnd.api+json

Sledeće zaglavlje je potrebno za funkcionisanje primera:

  • Authorization: Basic YXBpOmFwaQ==

Curl

Pretpostavimo da su vaši podaci u fajlu payload.json.

curl \
    --user api:api \
    --header 'Accept: application/vnd.api+json' \
    --header 'Content-type: application/vnd.api+json' \
    --request POST http://drupal.d8/jsonapi/node/article \
    --data-binary @payload.json

Osnovni POST zahtev

URL: http://example.com/jsonapi/node/article

Telo zahteva

{
  "data": {
    "type": "node--article",
    "attributes": {
      "title": "My custom title",
      "body": {
        "value": "Custom value",
        "format": "plain_text"
      }
    }
  }
}

Odgovor

HTTP 201 (Created) odgovor. Telo odgovora sadrži JsonApi odgovor kreiranog entiteta.

POST zahtev sa relacijama

URL: http://example.com/jsonapi/node/article

Polja sa referencama na entitete moraju biti postavljena kao relationships, ne kao attributes. Ako to ne uradite, dobićete poruku o grešci "The following relationship fields were provided as attributes" sa spiskom problematičnih polja.

Ključ id mora sadržati UUID, a ne ID entiteta, na primer: faba301b-bdf5-4658-abc1-e173b815984f.

Telo zahteva

{
  "data": {
    "type": "node--article",
    "attributes": {
      "title": "Article by admin",
      "body": {
        "value": "Custom value",
        "format": "plain_text"
      }
    },
    "relationships": {
      "uid": {
        "data": {
          "type": "user--user",
          "id": "{{UUID of user 1}}"
        }
      },
      "field_taxonomy_term_reference": {
        "data": {
          "type": "taxonomy_term--{{bundle}}",
          "id": "{{UUID of the term}}"
        }
      }
    }
  }
}

Odgovor

HTTP 201 (Created) odgovor. Telo odgovora sadrži JsonApi odgovor kreiranog entiteta.

POST metoda korišćenjem REST API-ja

Prvo napravite custom modul sa REST resursom i omogućite ga tako što ćete otići na /admin/config/services/rest

<?php

namespace Drupal\rest_examples\Plugin\rest\resource;

use Drupal\node\Entity\Node;
use Drupal\rest\Plugin\ResourceBase;
use Drupal\rest\ResourceResponse;
use Drupal\Core\Session\AccountProxyInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\StringTranslation\StringTranslationTrait;

/**
 * Provides a resource to post nodes.
 *
 * @RestResource(
 *   id = "rest_resource_post_example",
 *   label = @Translation("Rest Resource Post Example"),
 *   uri_paths = {
 *     "create" = "/rest/api/post/node-create"
 *   }
 * )
 */
class RestResourcePostExample extends ResourceBase {

  use StringTranslationTrait;

  /**
   * A current user instance.
   *
   * @var \Drupal\Core\Session\AccountProxyInterface
   */
  protected $currentUser;

  /**
   * Constructs a Drupal\rest\Plugin\ResourceBase object.
   *
   * @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 array $serializer_formats
   *   The available serialization formats.
   * @param \Psr\Log\LoggerInterface $logger
   *   A logger instance.
   * @param \Drupal\Core\Session\AccountProxyInterface $current_user
   *   A current user instance.
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, array $serializer_formats, LoggerInterface $logger, AccountProxyInterface $current_user) {

    parent::__construct($configuration, $plugin_id, $plugin_definition, $serializer_formats, $logger);

    $this->currentUser = $current_user;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static(
      $configuration,
      $plugin_id,
      $plugin_definition,
      $container->getParameter('serializer.formats'),
      $container->get('logger.factory')->get('rest_examples'),
      $container->get('current_user')
    );
  }

  /**
   * Responds to POST requests.
   *
   * Creates a new node.
   *
   * @param mixed $data
   *   Data to create the node.
   *
   * @throws \Symfony\Component\HttpKernel\Exception\HttpException
   *   Throws exception expected.
   */
  public function post($data) {

    // Use current user after pass authentication to validate access.
    if (!$this->currentUser->hasPermission('administer site content')) {

      // Display the default access denied page.
      throw new AccessDeniedHttpException('Access Denied.');
    }

    foreach ($data as $key => $value) {

      $node = Node::create(
        [
          'type' => $value['nodetype'],
          'title' => $value['title'],
          'body' => [
            'summary' => '',
            'value' => $value['body'],
            'format' => 'full_html',
          ],
        ]
      );

      $node->enforceIsNew();
      $node->save();

      $this->logger->notice($this->t("Node with nid @nid saved!\n", ['@nid' => $node->id()]));

      $nodes[] = $node->id();

    }

    $message = $this->t("New Nodes Created with nids : @message", ['@message' => implode(",", $nodes)]);

    return new ResourceResponse($message, 200);

  }

}

Primer JSON podataka za kreiranje čvorova:

[
    {
        "nodetype": "article",
        "title": "Training",
        "body": "Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vivamus vestibulum sagittis sapien. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.\n\nEtiam vel augue. Vestibulum rutrum rutrum neque. Aenean auctor gravida sem.\n\nPraesent id massa id nisl venenatis lacinia. Aenean sit amet justo. Morbi ut odio."
    },
    {
        "nodetype": "page",
        "title": "Team Building",
        "body": "Integer tincidunt ante vel ipsum. Praesent blandit lacinia erat. Vestibulum sed magna at nunc commodo placerat.\n\nPraesent blandit. Nam nulla. Integer pede justo, lacinia eget, tincidunt eget, tempus vel, pede.\n\nMorbi porttitor lorem id ligula. Suspendisse ornare consequat lectus. In est risus, auctor sed, tristique in, tempus sit amet, sem."
    },
    {
        "nodetype": "article",
        "title": "Services",
        "body": "Proin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.\n\nAenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum.\n\nCurabitur in libero ut massa volutpat convallis. Morbi odio odio, elementum eu, interdum eu, tincidunt in, leo. Maecenas pulvinar lobortis est."
    },
    {
        "nodetype": "page",
        "title": "Product Management",
        "body": "Cras mi pede, malesuada in, imperdiet et, commodo vulputate, justo. In blandit ultrices enim. Lorem ipsum dolor sit amet, consectetuer adipiscing elit.\n\nProin interdum mauris non ligula pellentesque ultrices. Phasellus id sapien in sapien iaculis congue. Vivamus metus arcu, adipiscing molestie, hendrerit at, vulputate vitae, nisl.\n\nAenean lectus. Pellentesque eget nunc. Donec quis orci eget orci vehicula condimentum."
    },
    {
        "nodetype": "article",
        "title": "Business Development",
        "body": "Nullam porttitor lacus at turpis. Donec posuere metus vitae ipsum. Aliquam non mauris.\n\nMorbi non lectus. Aliquam sit amet diam in magna bibendum imperdiet. Nullam orci pede, venenatis non, sodales sed, tincidunt eu, felis.\n\nFusce posuere felis sed lacus. Morbi sem mauris, laoreet ut, rhoncus aliquet, pulvinar sed, nisl. Nunc rhoncus dui vel sem."
    }
]

Curl komanda za POST zahtev :

curl \
    --user uname:password \
    --header 'Accept: application/json' \
    --header 'Content-type: application/json' \
    --request POST http://example.com/rest/api/post/node-create \
    --data-binary @post_data.json

Članak sa Drupal dokumentacije.