У всех у нас периодически возникает необходимость экспортировать информацию со своего сайта в каком либо читаемом виде. Вообще, это можно сделать и встроенными средствами, но разбираться в этом будет неудобно.
В первую очередь это связано с тем, что база данных в «чистом» виде (файл .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.
Комментарии: