Возникла задача - сделать интерфейс для редактора сайта, позволяющий выполнять импорт данных из файла CSV в материалы Друпала. Проще всего для этого использовать модуль Feeds, имеющий массу полезных расширений.
Сделаем форму загрузки файла для редактора сайта:
function module_form($form, &$form_state) {
$form['info'] = array(
'#markup' => '<div class="rinfo">Выберите файл CSV, загрузите его и нажмите "Обновить".</div>',
);
$form['reg_file'] = array(
'#type' => 'managed_file',
'#title' => 'Файл CSV',
'#required' => TRUE,
'#upload_location' => 'public://registry',
'#upload_validators' => array(
'file_validate_size' => array(10*1024*1024),
'file_validate_extensions' => array('csv'),
),
);
$form['submit'] = array(
'#type' => 'submit',
'#value' => 'Обновить',
);
return $form;
}
В #upload_location указан путь, по которому будет записан файл, в #upload_validators заданы ограничения: формат csv и максимальный размер 10 Мб. В остальном, обычная форма.
Часто перед импортом, надо проделать какие-то манипуляции с файлом CSV. Например, старые версии Excel не умели сохранять CSV в формате UTF-8. А может быть, требуется выкинуть какие-то строки из заголовка таблицы.
Сделам это в функции отправки формы.
function module_form_submit($form, &$form_state) {
// Создаем объект Друпала для загруженного редактором файла
$src = file_load($form_state['values']['reg_file']);
// Создаем временный файл, который будем использовать для импорта
$dest = drupal_tempnam(file_directory_temp(), 'reg');
// Открываем исходный файл для чтения
$fsrc = fopen($src->uri, "r");
if ($fsrc) {
// а временный - для записи
$fdest = fopen($dest, "w");
if ($fdest) {
$i = 0;
while (($line = fgets($fsrc)) !== false) {
// делаем что нам надо с каждой строкой. к примеру - меняем кодировку,
// удаляем выборочно строки и т.д.
$line = mb_convert_encoding($line, 'utf-8');
fputs($fdest, $line);
}
fclose($fdest);
}
fclose($fsrc);
file_delete($src);
}
// А теперь запускаем импорт. Здесь importer - это имя сценария импорта из списка feeds
// по адресу /admin/structure/feeds
$source = feeds_source("importer");
// Загружаем конфигурацию сборщика
$fetcher_config = $source->getConfigFor($source->importer->fetcher);
// подсовываем ему наш csv файл
$fetcher_config['source'] = $dest;
// и назначаем измененную конфигурацию
$source->setConfigFor($source->importer->fetcher, $fetcher_config);
$source->save();
// поехали
$source->startImport();
}
В итоге, редактор сайта получает простую и ясную форму, через которую он может выбрать файл и синхронизировать содержание сайта с файлом CSV.
Комментарии