У всех у нас периодически возникает необходимость экспортировать информацию со своего сайта в каком либо читаемом виде. Вообще, это можно сделать и встроенными средствами, но разбираться в этом будет неудобно.
В первую очередь это связано с тем, что база данных в «чистом» виде (файл .sql) не рассчитана на чтение человеком. Я не утверждаю, что это невозможно, скорее, неудобно и часто нужно искать информацию по нескольким таблицам. Поэтому лучше знать, как это делается, чтобы уметь вывести в удобной для себя форме.
Краткая справка. В таблице записей в Drupal хранится минимум информации, основная часть, включая расширенные поля, таксономию и т. д., находится в дополнительных таблицах, из которых мы и будем выбирать данные.
Сохранять будем в формат JSON, так как его достаточно просто обрабатывать на большинстве языков программирования. При этом мы не будем использовать функции Drupal – нам хватит обычных функций PHP.
Логика работы простая:
- Подключаемся к базе данных и проверяем подключение.
- Обязательно устанавливаем кодировку UTF-8. Неизвестно заранее, какая кодировка по умолчанию устанавливается для соединения.
- Экспортируем таксономию в один или несколько массивов, в зависимости от настроек сайта. У меня получается два массива – метки и категории.
- Экспортируем записи, при этом добавляем к записям таксономию.
- Сохраняем в файл.
Вот весь код, выполняющий эти операции:
<?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.
Комментарии: