Рейтинг:1

Как я могу загрузить свой сайт из внешнего скрипта?

флаг cn

Сообщество спросило.. Уточните, пожалуйста, вашу конкретную проблему...

Справедливый комментарий. Я хотел бы помочь с как исправить приведенный ниже скрипт, чтобы он работал с D9.

<?php


use Drupal\Core\DrupalKernel;

$autoloader = require_once 'autoload.php';

// This next line is the problem
$request = Request::createFromGlobals();


$kernel = DrupalKernel::createFromRequest($request, $autoloader, 'prod');

$kernel->boot();

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


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

$entity = $em->getStorage('node')->create(array(

    'type'        => 'article',
    'title'       => 'Druplicon test',
    
 ));       


$entity->save();

?>

Это то же самое, что и скрипт D8 ниже, который работает, за исключением того, что у меня есть:

  • удалено использование симфонической линии;
  • заменил устаревшую функцию (спасибо leymannx)

Скрипт не работает, как указано в строке
$запрос = Запрос::createFromGlobals(); с сообщениями

chrome-error://chromewebdata/:1 Не удалось загрузить ресурс: сервер ответил со статусом 500 () VM10:7288 crbug/1173575, файлы модулей, отличных от JS, устарели.

Может ли кто-нибудь указать, что не так с этой строкой в ​​D9 (что, я думаю, связано с удалением оператора использования симфонии), а также есть ли какие-либо другие строки кода, следующие за которыми D9 не понравится.

Спасибо за любую дальнейшую помощь по этому вопросу и приносим извинения за предыдущую путаницу и за то, что я все еще не в курсе D9.


эта статья предоставляет код D8 для создания объекта из внешнего скрипта. Я нахожусь в той же лодке, что и человек, задавший этот вопрос, — хочу перейти с drupal_bootstrap от D7.

Хотя мое требование — D9, я решил попытаться заставить работать скрипт D8, используя приведенный выше пост. Его приложение связано с сущностью. Я хочу создать записи статей.

Вот код, который я взял из приведенной выше ссылки, которая, как говорят, работает.

<?php

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

$autoloader = require_once 'autoload.php';

$request = Request::createFromGlobals();

$kernel = DrupalKernel::createFromRequest($request, $autoloader, 'prod');

$kernel->boot();

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

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

$entity = $em->getStorage('node')->create(array(

    'type'        => 'article',
    'title'       => 'Druplicon test',
    
 ));       

$entity->save();

?>

Этот код запускается и создает запись в node_field_data таблица но статья не указан как содержание на сайте.

Я очень хорошо разбираюсь в кодировании D8/D9, поэтому, пожалуйста, потерпите меня, если я делаю что-то глупое!

Как только я смогу заставить это работать, мне нужно выяснить, какие изменения необходимы для D9, поэтому любая помощь здесь будет полезна. Например, код D8 использует симфонию, но я полагаю, что это не часть D9.

Спасибо за любую помощь в этом, чтобы заставить это работать. И помочь мне заменить мой опыт D7 на D8/D9!

Сожалею... Этот код действительно отображается в содержании — я смотрел сайт D9, а не тестовый D8, который я настроил. Извинения!

Но мне все равно нужна помощь в том, какие изменения мне нужно внести в этот скрипт для работы под D9.

leymannx avatar
флаг ne
entity.manager устарел, используйте вместо него entity_type.manager.
флаг in
_"создать сущность из внешнего скрипта"_ - зачем это нужно?
флаг cn
Спасибо, что заметили устаревшую функцию. Создание сущностей с помощью внешнего скрипта — это один из способов синхронизации Drupal с другой системой. базу данных MS Access. Кажется проще, чем использовать Services.
Kevin avatar
флаг in
Вы можете «синхронизировать» данные, используя Migrate и запланированный cron. Я сделал это в нескольких проектах. Преимущество этого в том, что он будет обрабатывать практически все для вас.
флаг cn
Спасибо, Кевин. Миграция (основной модуль) — это то, о чем я ничего не знаю. Синхронизации! Звучит блестяще. Я проверю это. Бит cron — это то, что я использовал с внешним скриптом, drupal_bootstrap.
Kevin avatar
флаг in
Есть несколько примеров. Посмотрите модуль Migrate Plus.
флаг cn
Спасибо, Кевин. Это выглядит солидным модулем. Когда вы привели несколько примеров, вы имели в виду использование Migrate Plus или автозагрузку Drupal во внешнем скрипте? Использование Migrate может быть лучшим решением - моя проблема заключается в преобразовании сайта D7, который в настоящее время имеет около дюжины внешних скриптов. Вот почему я хотел бы отсортировать приведенный выше сценарий для D9, если это возможно. Если D9 просто не работает как D7/D8, то этот модуль может быть не только лучшим решением, но и единственным! Еще раз спасибо.
Kevin avatar
флаг in
Идите в другом направлении, определите источник миграции. Он может подключаться к базе данных, API JSON/XML, читать файлы данных JSON или XML или файлы CSV. Не беспокойтесь о начальной загрузке и попытке обновить случайные таблицы, это в 10 раз больше работы.
флаг cn
Я ищу всю документацию по Migrate Plus, которую могу найти. Из того, что вы только что сказали, если у меня есть база данных MySQL, используемая MS Access, я могу синхронизировать ее. это с сущностью D9? Это будет точно отражать то, что я сейчас делаю в D7 с Forena Reports (без версии D9), и обеспечит, как вы говорите, гораздо лучшее решение. Еще раз спасибо.
Рейтинг:2
флаг cn

Вот код, который позволяет создавать сущности на сайте D9 из удаленного скрипта — запускать из того же домена, что и сайт D9, но не из корневого каталога D9.

<?php
//drupal root directory
chdir('/var/www/vhosts/example.org/httpdocs/dev3');

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

$autoloader = require_once 'autoload.php';

$request = Request::createFromGlobals();

$kernel = DrupalKernel::createFromRequest($request, $autoloader, 'prod');

$kernel->boot();

require_once 'core/includes/schema.inc';

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

$entity = $em->getStorage('node')->create([
  'type'        => 'article',
  'title'       => 'Druplicon test' . date("d/m/Y")." ". date("h:i:sa"),
]);

$entity->save();

?>

Ключ к этому коду пришел из эта статья что объясняет, как Drupal загружает страницу. Он говорит: «Посмотрите на index.php в корне, если вы хотите увидеть, как это делает Drupal». Около 6 строк кода!

Почему не работал мой предыдущий скрипт, портированный с D8? Вот некоторые вещи, которые я узнал:

  • линия $запрос = Запрос::createFromGlobals(); который остановил более ранний запуск скрипта, работает нормально в этом коде;
  • на сайте D9 в корневом каталоге отсутствует файл database.inc;
  • Я изменил устаревший entity.manager на entity_type_manager как Лейманкс посоветовал;
  • Похоже, что D9 использует Symphony — он появляется в index.php версии 9.2.7. Но это более поздняя версия, чем D8;
  • внешний скрипт не должен находиться в корне Drupal — даже для тестирования — иначе сайт выдает ошибку 404;
  • Если вы хотите найти в Google информацию о начальной загрузке, не используйте Bootstrap, иначе вы увидите только информацию. по теме!

Получение этой работы означает, что я могу заменить внешние сценарии D7 на D9. я понимаю суть Кевин делает об использовании модуля миграции, но я думаю, что загрузка лучшего решения для моих вариантов использования. Например, пользователь добавляет запись в базу данных MySQL в Microsoft Access под управлением программы. Затем код запускает внешний скрипт для добавления выбранных полей в сущность Drupal. Сразу же пользователь Access и веб-пользователь увидят одни и те же актуальные данные.

Спасибо всем, кто внес свой вклад в это. Я надеюсь, что этот пост прояснит беспорядочный способ, которым я начал этот вопрос.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.