Puncte:1

Cum pot bootstrap site-ul meu dintr-un script extern?

drapel cn

Comunitatea intrebat.. Vă rugăm să clarificați problema dvs. specifică...

Comentariu corect. Cu ce ​​aș dori ajutor este cum corectez scriptul de mai jos, astfel încât să funcționeze cu 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();

?>

Acesta este același cu scriptul D8 de mai jos, care funcționează - cu excepția faptului că am:

  • a eliminat linia simfonică de utilizare;
  • a înlocuit funcția depreciată (mulțumesc leymannx)

Scriptul eșuează așa cum este menționat pe linie
$request = Request::createFromGlobals(); cu mesaje

chrome-error://chromewebdata/:1 Nu s-a putut încărca resursa: serverul a răspuns cu o stare de 500 () VM10:7288 crbug/1173575, fișiere de modul non-JS depreciate.

Poate cineva să sublinieze ce este în neregulă cu această linie din D9 (care presupun că se referă la eliminarea declarației de utilizare a simfoniei) și, de asemenea, dacă există alte linii de cod care urmează pe care D9 nu le va plăcea.

Vă mulțumesc pentru orice ajutor suplimentar în acest sens și scuze pentru confuzia anterioară și pentru că nu sunt încă din profunzimea mea cu D9.


Acest articol oferă cod D8 pentru a crea o entitate dintr-un script extern. Sunt în aceeași barcă cu persoana care a pus această întrebare - vreau să convertesc din drupal_bootstrap de la D7.

Deși cerința mea este D9, m-am gândit să încerc să obțin un script D8 să funcționeze folosind postarea de mai sus. Aplicația lui este la o entitate. Vreau să creez intrări în articole.

Iată codul pe care l-am luat de la linkul de mai sus despre care se spune că funcționează..

<?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();

?>

Acest cod rulează și creează o intrare în date_câmp_nod tabel dar articolul este nu sunt listate ca conținut pe site.

Mă simt foarte bine cu codarea D8/D9, așa că vă rog să mă răbdai dacă fac ceva prostesc!

Odată ce pot face acest lucru să funcționeze, trebuie să aflu ce modificări sunt necesare pentru D9 - așa că orice ajutor aici ar fi bun. De exemplu, codul D8 folosește simfonie, dar cred că asta nu face parte din D9.

Vă mulțumim pentru orice ajutor în acest sens pentru ca acest lucru să funcționeze. Și pentru a mă ajuta să-mi înlocuiesc experiența D7 cu D8/D9!

scuze... Acest cod apare în conținut - mă uitam la un site D9, nu la testul D8 pe care l-am configurat. Scuze!

Dar tot aș dori ajutor cu privire la modificările pe care trebuie să le fac acestui script pentru a rula sub D9.

leymannx avatar
drapel ne
entity.manager este depreciat, utilizați entity_type.manager.
drapel in
_"creați o entitate dintr-un script extern"_ - care ar fi motivul pentru a face acest lucru?
drapel cn
Vă mulțumim că ați remarcat funcția depreciată. Crearea de entități prin script extern este o modalitate de a sincroniza Drupal cu un alt sistem - de ex. o bază de date MS Access. Pare mai simplu decât folosirea Serviciilor.
Kevin avatar
drapel in
Puteți „sincroniza” datele folosind Migrate și cron programat. Am făcut asta în mai multe proiecte. Avantajul acestui lucru este că se va ocupa de aproape orice pentru tine.
drapel cn
Mulțumesc Kevin - Migrare (modul de bază) este ceva despre care nu știu nimic. Se sincronizează! Sună genial. Am să verific. Bitul cron este ceea ce am folosit cu un script extern, drupal_bootstrap.
Kevin avatar
drapel in
Există mai multe exemple acolo. Uită-te la modulul Migrate Plus.
drapel cn
Mulțumesc Kevin. Acesta pare un modul substanțial. Când ați spus câteva exemple, v-ați referit la utilizarea Migrate Plus sau la încărcarea automată a Drupal într-un script extern? Utilizarea Migrate ar putea fi cea mai bună soluție - problema mea este conversia unui site D7 care are în prezent aproximativ o duzină de scripturi externe. De aceea, aș dori să sortez scriptul de mai sus pentru D9, dacă este posibil. Dacă D9 pur și simplu nu funcționează ca D7/D8, atunci acest modul ar putea fi nu numai cea mai bună soluție, ci și singura! Multumesc din nou.
Kevin avatar
drapel in
Mergeți în cealaltă direcție, definiți o sursă pentru migrare. Se poate conecta la o bază de date, API JSON/XML, poate citi fișiere de date JSON sau XML sau fișiere CSV. Nu vă deranjați să faceți bootstrap și să încercați să actualizați tabele aleatoare, este de 10 ori mai multă muncă.
drapel cn
Caut toată documentația pe care o pot găsi despre Migrate Plus. Din ceea ce tocmai ai spus, dacă am o bază de date MySQL folosită de MS Access, pot apoi sincroniza. asta cu o entitate D9? Acest lucru ar reflecta apoi exact ceea ce fac în prezent în D7 cu Forena Reports (fără versiunea D9) și ar oferi, după cum spuneți, o soluție mult mai bună. Multumesc din nou.
Puncte:2
drapel cn

Iată codul care permite crearea de entități într-un site D9 dintr-un script la distanță - rulat din același domeniu ca și site-ul D9, dar nu din directorul rădăcină 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();

?>

Indiciul acestui cod a venit de la Acest articol care explică modul în care Drupal încarcă o pagină. Scrie „uita-te la index.php în rădăcină, dacă vrei să vezi cum face Drupal”. Aproximativ 6 linii de cod!

De ce nu a funcționat scriptul meu anterior, portat din D8? Iată câteva dintre lucrurile pe care le-am învățat:

  • linia $request = Request::createFromGlobals(); care a oprit rularea scriptului anterior funcționează ok în acest cod;
  • nu există fișier database.inc în directorul rădăcină pe un site D9;
  • Am schimbat entity.manager depreciat în entity_type_manager ca leymannx sfătuit;
  • D9 pare să folosească Symphony - apare în index.php în versiunea 9.2.7. Dar este o versiune ulterioară decât D8;
  • scriptul extern nu ar trebui să fie în rădăcina Drupal - nici măcar pentru testare - altfel site-ul se declanșează cu un 404;
  • Dacă doriți să căutați pe Google informații despre bootstrapping, nu utilizați Bootstrap - altfel tot ce vedeți sunt informații. pe tema!

Funcționarea acestui lucru înseamnă că pot înlocui scripturile externe D7 cu D9. înțeleg ideea Kevin face despre utilizarea modulului de migrare, dar cred că bootstrapping este o soluție mai bună pentru cazurile mele de utilizare. De exemplu, un utilizator adaugă o înregistrare la o bază de date MySQL în Microsoft Access sub controlul programului. Codul rulează apoi un script extern pentru a adăuga câmpuri selectate la o entitate Drupal. Imediat, utilizatorul Access și utilizatorul web văd aceleași date actualizate.

Mulțumesc tuturor celor care au contribuit la asta. Sper că această postare va clarifica modul în care am început această întrebare.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.