Экспорт данных из Drupal

У всех у нас периодически возникает необходимость экспортировать информацию со своего сайта в каком либо читаемом виде. Вообще, это можно сделать и встроенными средствами, но разбираться в этом будет неудобно.

В первую очередь это связано с тем, что база данных в «чистом» виде (файл .sql) не рассчитана на чтение человеком. Я не утверждаю, что это невозможно, скорее, неудобно и часто нужно искать информацию по нескольким таблицам. Поэтому лучше знать, как это делается, чтобы уметь вывести в удобной для себя форме.

Краткая справка. В таблице записей в Drupal хранится минимум информации, основная часть, включая расширенные поля, таксономию и т. д., находится в дополнительных таблицах, из которых мы и будем выбирать данные.

Сохранять будем в формат JSON, так как его достаточно просто обрабатывать на большинстве языков программирования. При этом мы не будем использовать функции Drupal – нам хватит обычных функций PHP.

Логика работы простая:

  1. Подключаемся к базе данных и проверяем подключение.
  2. Обязательно устанавливаем кодировку UTF-8. Неизвестно заранее, какая кодировка по умолчанию устанавливается для соединения.
  3. Экспортируем таксономию в один или несколько массивов, в зависимости от настроек сайта. У меня получается два массива – метки и категории.
  4. Экспортируем записи, при этом добавляем к записям таксономию.
  5. Сохраняем в файл.

Вот весь код, выполняющий эти операции:

<?php
// edit next 6 lines with your values!!!
$src_host = "localhost";
$src_user = "username";
$src_pass = "password";
$src_name = "dbname";
$src_prefix = "drupal_";
$tz_default = "Europe/Moscow";

// try to connect
$src_dblink = new mysqli($src_host, $src_user, $src_pass, $src_name);
unset($src_host, $src_user, $src_pass, $src_name);
if (!$src_dblink) exit("DB connect error!");

$src_dblink->query("SET NAMES UTF8");

date_default_timezone_set($tz_default);
	 
// taxonomy
$info = array();
$info['taxonomy'] = array();
$result = $src_dblink->query("SELECT `vid`, `name`, `machine_name` FROM `" . $src_prefix . "taxonomy_vocabulary` ORDER BY `vid`");
if (mysqli_num_rows($result)) {
	while($data = mysqli_fetch_assoc($result)) {
		$info['taxonomy'][$data['vid']] = array(
			'name' => $data['name'],
			'machine_name' => $data['machine_name'],
			'dictionary' => array()
		);
		$result_dict = $src_dblink->query("SELECT `tid`, `name` FROM `" .$src_prefix . "taxonomy_term_data` WHERE `vid` = '" . $data['vid'] . "' ORDER BY `tid`");
		if (mysqli_num_rows($result_dict)) {
			while($data_dict = mysqli_fetch_assoc($result_dict)) {
				$info['taxonomy'][$data[vid]]['dictionary'][$data_dict['tid']] = $data_dict['name'];
			}
		}
	}
}

// posts
$info['posts'] = array();
$result = $src_dblink->query("SELECT `nid`, `type`, `language`, `title`, `uid`, `created` FROM `" . $src_prefix . "node` ORDER BY `nid`");
if (mysqli_num_rows($result)) {
	while($data = mysqli_fetch_assoc($result)) {
		$info['posts'][$data['nid']] = array(
			'title' => $data['title'],
			'type' => $data['type'],
			'language' => $data['language'],
			'created' => $data['created'],
			'created_read' => date("d.m.Y, G:i:s", $data['created'])
		);
		$result_body = $src_dblink->query("SELECT `body_value`, `body_summary` FROM `" . $src_prefix . "field_data_body` WHERE `entity_id` = '" . $data['nid'] . "' LIMIT 1");
		if (mysqli_num_rows($result_body)) {
			$data_body = mysqli_fetch_assoc($result_body);
			$info['posts'][$data['nid']]['text_short'] = $data_body['body_summary'];
			$info['posts'][$data['nid']]['text_full'] = $data_body['body_value'];
		}
		$result_count = $src_dblink->query("SELECT `totalcount` FROM `" . $src_prefix . "node_counter` WHERE `nid` = '" . $data['nid'] . "' LIMIT 1");
		if (mysqli_num_rows($result_count)) {
			$data_count = mysqli_fetch_assoc($result_count);
			$count = $data_count['totalcount'];
		} else {
			$count = 0;
		}
		$info['posts'][$data['nid']]['reads'] = $count;
		$info['posts'][$data['nid']]['terms'] = array();
		$result_terms = $src_dblink->query("SELECT `rr_taxonomy_term_data`.`tid`, `rr_taxonomy_term_data`.`vid` FROM `rr_taxonomy_term_data` INNER JOIN `rr_taxonomy_index` ON `rr_taxonomy_index`.`tid` = `rr_taxonomy_term_data`.`tid` WHERE   `rr_taxonomy_index`.`nid` = '" . $data['nid'] . "' ORDER BY `vid`, `tid`");
		if (mysqli_num_rows($result_terms)) {
			while($data_terms = mysqli_fetch_assoc($result_terms)) {
				$info['posts'][$data['nid']]['terms'][$data_terms['vid']][] = $data_terms['tid'];
			}
		}
	}
}

$res = fopen(__DIR__ . "/info.json", "w");
fwrite($res, json_encode($info, JSON_NUMERIC_CHECK | JSON_UNESCAPED_UNICODE | JSON_PRETTY_PRINT));
fclose($res);
unset ($info);

echo "Done.";

Без часового пояса можно было бы обойтись, так как в базе данных все сведения о времени хранятся в формате UnixTime – по факту целое беззнаковое 4-байтовое число. Но лучше добавить в экспорт дополнительно одно поле, содержащее дату и время в виде, удобном для людей. Для этого часовой пояс и используется – UnixTime оперирует только со временем по UTC.

В следующей части попробуем добавить эту информацию в другую CMS, например, в WordPress.

Комментарии:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *