六月 3, 2018 | 後端和Drupal
還再使用Feeds來處理資料匯入嗎? 用外部php script做資料處理,安全又方便!
用過Drupal的人都知道使用Feeds這個模組,功能非常強。但資料量很大的狀況下,很擔心網頁匯入到一半就timeout了,在設定上面也略顯複雜。若可以用外部的php撰寫匯入程式,方便又不擔心寫錯造成網頁噴錯,更重要的是,所有邏輯都可以用程式來直接完成,簡單方便又有彈性,還可以搭配crontab!
前言
是否大家都有處理過資料匯入的問題呢? 想必用過Drupal的人都知道使用Feeds這個模組,功能非常非常強。但是,如果資料量很大的狀況下,很擔心網頁匯入到一半就timeout了,在設定上面也略顯複雜。若是簡單的Drupal 網站匯入是還好,若是很複雜的資料包含一堆關聯性資料要匯入,相信你會設定到痛苦連天。因此,若可以用外部的php撰寫匯入程式,方便又不擔心寫錯造成網頁噴錯,更重要的是,所有邏輯都可以用程式來直接完成,簡單方便又有彈性,還可以搭配crontab。快來看看
讀取外部資料+寫入到網站
這裡我就用一個簡單的作法,主要會進行 1.讀取JSON資料。2.使用外部php script進行資料匯入。 D7與D8的作法稍微有些不一樣,可以再參考看看以下的範例。
Drupal 7 Version
/**
* Root directory of Drupal installation.
* Get the directory where this php is.
*/
define('DRUPAL_ROOT', getcwd());
//include all necessary inc
require_once DRUPAL_ROOT . '/includes/bootstrap.inc';
require_once DRUPAL_ROOT . '/includes/common.inc';
require_once DRUPAL_ROOT . '/includes/module.inc';
require_once DRUPAL_ROOT . '/includes/file.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
//寫一篇文章
$node = entity_create('node', array('type' => 'article'));
$node->uid = 1;
$new_node = entity_metadata_wrapper('node', $node);
$new_node->title = 'test title';
$new_node->save();
Drupal 8 Version
define('DRUPAL_DIR', __DIR__ .'/web');
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';
require_once DRUPAL_DIR . '/core/includes/module.inc';
require_once DRUPAL_DIR . '/core/includes/entity.inc';
$node = entity_create('node', array(
'type' => 'page',
'title' =>'Creating another node',
'langcode' => 'zh-hant',
'body' => array(
'value' =>'The body of the content',
'format' => 'full_html',
),
'uid'=>1,
)
);
$node->save();
結論
用上面的作法,可以讓我們處理非常複雜的邏輯,並且可以搭配Crontab來自動化做很多資料的處理,是個非常好用且實用的作法:)