Score: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 )

สคริปต์ล้มเหลวตามที่ระบุไว้ในบรรทัด
$request = คำขอ::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 flag
entity.manager เลิกใช้แล้ว ใช้ entity_type.manager แทน
in flag
_"create an entity from an external script"_ - what would be the reason for doing this?
cn flag
Thanks for noting the deprecated function. Creating entities via external script is one way to synchronise Drupal with another system - e.g. a MS Access database. Seems simpler than using Services.
Kevin avatar
in flag
You can "sync" data using Migrate and scheduled cron. I've done this on several projects. The benefit to this is it will handle virtually everything for you.
cn flag
Thanks Kevin - Migrate (core module) is something I know nothing about. Syncing! Sounds brilliant. I'll check it out. The cron bit is what I've used with an external script, drupal_bootstrap.
Kevin avatar
in flag
There are several examples out there. Look at Migrate Plus module.
cn flag
Thanks Kevin. This looks a substantial module. When you said several examples, did you mean using Migrate Plus or of autoloading Drupal in an external script? Using Migrate might well be the best solution - my problem is converting a D7 site which currently has about a dozen external scripts. Which is why I'd like to sort the above script for D9, if possible. If D9 just doesn't work like D7/D8 then this module might not only be the best solution, but the only one! Thanks again.
Kevin avatar
in flag
Go in the other direction, define a source for the migration. It can connect to a database, JSON/XML api, read JSON or XML data files or CSV files. Don't bother bootstrapping and trying to update random tables, it's 10x more work.
cn flag
ฉันกำลังค้นหาเอกสารทั้งหมดใน Migrate Plus ที่ฉันหาได้ จากที่คุณเพิ่งพูดไป ถ้าฉันมี MySQL DB ที่ใช้โดย MS Access ฉันก็สามารถซิงค์ได้ สิ่งนี้กับเอนทิตี D9 หรือไม่ จากนั้นสิ่งนี้จะสะท้อนถึงสิ่งที่ฉันทำใน D7 ด้วย Forena Reports (ไม่มีเวอร์ชัน D9) และจะให้วิธีแก้ปัญหาที่ดีกว่ามากอย่างที่คุณพูด ขอบคุณอีกครั้ง.
Score: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 จึงไม่ทำงาน นี่คือบางสิ่งที่ฉันได้เรียนรู้:

  • เส้น $request = คำขอ::createFromGlobals(); ซึ่งหยุดการทำงานของสคริปต์ก่อนหน้านี้ทำงานได้ดีในรหัสนี้
  • ไม่มีไฟล์ database.inc ในไดเร็กทอรีรูทบนไซต์ D9
  • ฉันเปลี่ยนentity.managerที่เลิกใช้แล้วเป็นentity_type_managerเป็น เลย์มันน์ แนะนำ;
  • D9 ดูเหมือนจะใช้ Symphony - ปรากฏใน index.php ในรุ่น 9.2.7 แต่เป็นรุ่นที่ใหม่กว่า D8;
  • สคริปต์ภายนอกไม่ควรอยู่ในรากของ Drupal - ไม่แม้แต่สำหรับการทดสอบ - มิฉะนั้นไซต์จะเริ่มทำงานด้วย 404;
  • หากคุณต้องการข้อมูลเกี่ยวกับการบูตสแตรปของ Google อย่าใช้ Bootstrap มิฉะนั้นสิ่งที่คุณเห็นคือข้อมูล ในธีม!

การทำงานนี้หมายความว่าฉันสามารถแทนที่สคริปต์ภายนอก D7 ด้วย D9 ฉันใช้ประเด็น เควิน ทำเกี่ยวกับการใช้โมดูลการโยกย้าย แต่ฉันคิดว่าการบู๊ตสแตรปเป็นทางออกที่ดีกว่าสำหรับกรณีการใช้งานของฉัน เช่น ผู้ใช้เพิ่มบันทึกไปยังฐานข้อมูล MySQL ใน Microsoft Access ภายใต้การควบคุมของโปรแกรม จากนั้นโค้ดจะเรียกใช้สคริปต์ภายนอกเพื่อเพิ่มฟิลด์ที่เลือกให้กับเอนทิตี Drupal ผู้ใช้ Access และผู้ใช้เว็บจะเห็นข้อมูลที่อัปเดตเหมือนกันในทันที

ขอบคุณทุกคนที่มีส่วนร่วมในเรื่องนี้ ฉันหวังว่าโพสต์นี้จะล้างวิธีที่ยุ่งเหยิงที่ฉันเริ่มคำถามนี้

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา