Завантаження з зовнішнього скрипту


10

Я намагаюся створити екземпляри сутності Drupal із зовнішнього скрипту, який не є частиною Drupal або модуля Drupal.

Для Drupal 7 потрібно було drupal_bootstrapзавантажити необхідні залежності від Drupal. Однак після довгого пошуку я знайшов для Drupal 8 записку, яка drupal_bootstrapзастаріла для Drupal 8 .

І справді, я отримую

Виклик невизначеної функції drupal_bootstrap ()

коли я намагаюся викликати його після включення як в

define('DRUPAL_ROOT', __DIR__ .'/../drupal');
require_once DRUPAL_ROOT . '/core/vendor/autoload.php';
require_once DRUPAL_ROOT . '/core/includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

Тож як я можу використовувати API Drupal 8 із зовнішнього сценарію ?!


Ви можете використовувати drush php-скрипт . Це виконує php-код із повним завантажувальним файлом Drupal безпосередньо зі скрипту оболонки.
rpayanm

Відповіді:


7

Для поточної версії drupal 8.x:

define('DRUPAL_DIR', '/usr/share/nginx/html');
use Drupal\Core\DrupalKernel;
use Symfony\Component\HttpFoundation\Request;
require_once DRUPAL_DIR . '/core/includes/database.inc';
require_once DRUPAL_DIR . '/core/includes/schema.inc';
// Specify relative path to the drupal root.
$autoloader = require_once DRUPAL_DIR . '/autoload.php';

$request = Request::createFromGlobals();

// Bootstrap drupal to different levels
$kernel = DrupalKernel::createFromRequest($request, $autoloader, 'prod');
$kernel->boot();
$kernel->prepareLegacyRequest($request);

$em = $kernel->getContainer()->get('entity.manager');

$entity = $em->getStorage('node')->create(
        array(
          'type' => "article",
          'title'=> "test entity",
          'body' => "body body body",
        ));

$entity->save();

3

По-перше: завжди шукайте повідомлення про зміни. Ви можете знайти їх тут: https://www.drupal.org/list-changes

Ось головний із них drupal_bootstrap(): https://www.drupal.org/node/2275139

Погляньте на передній контролер Drupal 8 ( index.php).

Ви робите екземпляр ядра, а потім обробляєте його запитами.

Але оскільки ви хочете лише вставити в нього сутність, ви не будете обробляти запити. Вам просто потрібно завантажувати ядро, а потім використовувати різні сервіси, щоб додати ваші сутності. Перелік послуг є core/core.services.ymlі є досить величезним. Ви можете шукати entity_manager.

Крім того, у D8 вбудований API RESTful, тому ви, можливо, зможете дозволити D8 виконати всю роботу під час того, як ви переймете його через http.


3

Я нарешті закінчився цим кодом. У неї є кілька потворних додаткових функцій, але принаймні це працює:

define('DRUPAL_DIR', __DIR__ .'/../drupal');

use Drupal\Core\DrupalKernel;
use Symfony\Component\HttpFoundation\Request;

$autoloader = require_once DRUPAL_DIR . '/autoload.php';
$request = Request::createFromGlobals();
$kernel = DrupalKernel::createFromRequest($request, $autoloader, 'prod');
$kernel->boot();

require_once DRUPAL_DIR . '/core/includes/database.inc';
require_once DRUPAL_DIR . '/core/includes/schema.inc';


$em = $kernel->getContainer()->get('entity.manager');

$entity = $em->getStorage('my_entity')->create(array(
        'id' => "116",
        'name' => "test entity",
));
$entity->save();

Ви можете дістатися без усіх цих call_once дзвінків, якщо вам просто потрібна autoload.php:require_once 'your_drupal/autoload.php';
paul-m

Я думаю, мені це потрібно autoload.php(рядок 4)? Цього було достатньо, коли я використовував, handleRequestале не тоді, коли намагався завантажувати лише основи, щоб потрапити до менеджера сутностей.
sleidig

Можливо, вам потрібно буде додатиchdir()
Параг

Якщо видалити Requ_once, то виклик "Виклик невизначеної функції Drupal \ Core \ Entity \ Sql \ drupal_schema_get_field_value ()", який є досить кульгавим :(
Клеменс Толбом
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.