Понадобилась выгрузка всей кучи словарей в текстовом виде. Не для импорта, а так: редакторам на сайте не удобно по словарям ползать и смотреть, что есть, а чего нет. Дело, конечно, вкуса.
Посмотрел для начала готовые модули. Все они заточены под операции экспорта-импорта, и много ещё чего могут из того, что мне не требуется. Но установить модуль, наверное, быстрее, чем самому ваять?
Смотрю, к примеру, модуль Feeds. Похоже, то что надо, но я даже не стал устанавливать, т.к. он в архиве весит почти мегабайт. Подключать ещё один модуль-монстр в хорошо нагруженный проект на Drupal желания не возникает.
Экспорт данных словарей в CSV
Нужно то — сделать раздел в админ меню, чтобы вывести ссылку на экспортируемый файл. И сделать функцию экспорта в CSV, чтобы выгрузку сразу можно было открыть в Excel.
Приведенный ниже код актуален в Drupal 7.
Весь дополнительный код у меня собран в собственном модуле (shra_contribution). В hook_menu добавил пару айтемов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
/* hook menu */ function shra_contribution_menu() { //это раздел в админке $items['admin/structure/taxonomy/export'] = array( 'title' => '- Все термины в виде одного csv', 'page callback' => '_sc_admin_tax_txt', 'access arguments' => array('access administration menu'), 'type' => MENU_LOCAL_TASK, ); //сам файл для скачки $items['admin/structure/taxonomy/export-cvs'] = array( 'page callback' => '_sc_admin_tax_txt', 'access arguments' => array('access administration menu'), 'type' => MENU_CALLBACK, ); return $items; } |
А вот функция, которая и файл выдаёт и страницу со ссылкой возвращает:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
/* получить таксономию в виде csv */ function _sc_admin_tax_txt($type = NULL) { if (arg(3) == 'export-cvs') { //грузим список словарей $res = db_query("SELECT vid, name FROM taxonomy_vocabulary ORDER BY name"); $dictCount = $res->rowCount(); $maxAmount = 0; $table = array(); //собираем данные в плоскую таблицу if ($dictCount) { $nD = 0; while ($r = $res->fetchObject()) { $table[$nD * 2][0] = $r->name; $terms = taxonomy_get_tree($r->vid); if (count($terms) > $maxAmount) $maxAmount = count($terms); foreach ($terms as $k => $v ) { //по каждому термину я беру название //уровень в иерархии //т.е. на 1 словарь получим 2 столбца $table[$nD * 2][$k + 1] = $v->name; $table[$nD * 2 + 1][$k + 1] = $v->depth; } $nD ++; } } //вывод таблицы в csv файл header('Content-Type: application/download; charset=windows-1251'); header('Content-Disposition: attachment; filename="taxonomy.csv"'); $out = fopen('php://output', 'w'); for ($j = 0; $j < $maxAmount; $j++) { $C = array(); for($col = 0; $col < $dictCount * 2; $col ++) { if (isset($table[$col][$j])) $C[] = iconv ('UTF-8', 'CP1251', $table[$col][$j]); else $C[] = ''; } //Excel разных версий "любит" разные разделители //в данном случае это ; //если нужен символ табуляции //fputcsv($out, $C, chr(9)); fputcsv($out, $C, ';'); } fclose($out); exit; } return '<p>Все словари и термины в виде <a href="/admin/structure/taxonomy/export-cvs">файла csv</a>.</p>'; } |
Я предпочитаю написать полсотни строк, вместо установки модуля а-ля «швейцарский нож».