बाहरी स्क्रिप्ट से बूटस्ट्रैप


10

मैं एक बाहरी स्क्रिप्ट से Drupal निकाय उदाहरण बनाने की कोशिश कर रहा हूं जो Drupal या Drupal मॉड्यूल का हिस्सा नहीं है।

Drupal 7 के drupal_bootstrapलिए आवश्यक Drupal निर्भरता को लोड करना था । हालाँकि, लंबी खोज के बाद मुझे Drupal 8 के लिए मिला एक नोट जो drupal_bootstrapDrupal 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);

तो मैं बाहर की स्क्रिप्ट से Drupal 8 API का उपयोग कैसे कर सकता हूं?


आप ड्रश php-script का उपयोग कर सकते हैं । यह एक शेल स्क्रिप्ट से सीधे एक पूर्ण Drupal बूटस्ट्रैप के साथ php कोड निष्पादित करता है।
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 में एक RESTful API बनाया गया है, जिससे आप http पर पिंग करते समय D8 को सभी काम करने में सक्षम हो सकते हैं।


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

आप उन सभी require_once कॉल के बिना प्राप्त कर सकते हैं अगर आप सिर्फ autoload.php आवश्यकता होती है:require_once 'your_drupal/autoload.php';
पॉल मीटर

मुझे लगता है कि मुझे आवश्यकता है autoload.php(पंक्ति 4)? जब मैंने उपयोग किया था तो यह पर्याप्त handleRequestनहीं था, लेकिन जब इकाई प्रबंधक को पाने के लिए केवल मूल बातें बूट करने की कोशिश कर रहा था।
स्लीडिग ऑक्ट

आपको जोड़ने की आवश्यकता हो सकती हैchdir()
पराग

हटाने की आवश्यकता_नहीं देता है "अपरिभाषित फ़ंक्शन को कॉल करें Drupal \ Core \ Entity \ Sql \ drupal_schema_get_field_value ()" जो काफी लंगड़ा है :(
क्लेम्मल टोलबॉम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.