feeds и импорт из файла в кодировке Кириллица Windows-1251. Пробовал кто?
Нашел тут патч
http://drupal.org/node/704532
У меня не получилось его применить. Точнее применить получидлось, но не заработало.
feeds и импорт из файла в кодировке Кириллица Windows-1251. Пробовал кто?
Нашел тут патч
http://drupal.org/node/704532
У меня не получилось его применить. Точнее применить получидлось, но не заработало.
Комментарии
Сразу скажу, именно такой задачи не делал, но как вариант первое, что в голову приходит - по ходу исполнения Feeds для элемента применять iconv(), то есть конвертацию строки в нужную кодировку.
Попадался на глаза модуль Feeds Tamper, в котором есть (или предполагалось создать, обсуждение этого функционала по крайней мере читал) возможность выполнения произвольного РНР-кода относительно каждого элемента данных перед его сохранением.
Может плохо смотрю, но сейчас не вижу я в нем таких возможностей
http://drupal.org/node/1246578
Нашел тот issue на drupal.org, о котором писал выше: http://drupal.org/node/1297968
Исходя из текста, плагин пока на стадии needs review, поэтому в списке официальных не числится. Допиливать до нормальной работоспособности скорее всего придется. Повторюсь, сам не пользовался, за результат не ручаюсь.
Хорошо. Патч я применил.Тепрь мне нужно каждую ячейку преобразовать из одной кодировки в другую.
а какой PHP код для этого мне вставлять?
Такой?
<?php print iconv("CP1251", "UTF-8", $source_field_name) ?>
А $source_field_name откуда брать (если у меня Ubercart)?
$source_field_name - это значение поля, которое вы получаете при импорте. Может браться из XML или CSV файла или еще откуда то. В зависимости от того, как у вас парсер в Feeds настроен.
По поводу общей конструкции строки, исходя из патча, нужно использовать именно print.
Хорошо самый простой пример:
что писать заместо $source_field_name для поля "Заголовок материала" и зачем там токены?
Недавно пришлось импортировать таблицу с кириллицей с помощью feeds. Сделал так:в файле ParserCSV.inc в папке sites\all\modules\feeds\libraries заменил строчку
$fields[] = $currentField;
на
$fields[] = iconv("CP1251","UTF-8",$currentField);
3 раза. Все получилось.
Получится то получилось. Но это хак модуля. Что кагбе намекает, что подход не правильный. При первом же обновлении модуля правка слетит, и импорт будет работать не правильно.
К большому сожалению этот модуль обновляется очень редко. Предпоследняя рабочая версия под 7-ку была за год до последней.
Лучше подготавливать импортируемый файл изначально в кодировке UTF-8, это избавит от возни с патчами и хаками модулей. Благо существует много бесплатных текстовых редакторов, позволяющих конвертировать в любую кодировку (AcelPad, Notepad++ и др.)
Да можно. Но лучше избавиться от лишнего шага при импорте. Особенно когда кому то этот импорт объясняешь.
$fields[] = $currentField; встречается 3 раза
везде надо менять?)
Да, 3 раза
кто нить этот патч http://drupal.org/node/1428272 тестил?
Пробовал, на 7.x-2.0-alpha7 работает, но что будет после обновления модуля не знаю
Столкнулся с той же проблемой: необходимо перекодировать csv-ленту с cp-1251 в utf-8, перед тем, как скормить её в feeds.
Решил проблему иным способом. Сделал php-скрипт, который производит перекодировку, выложил его на сервер с сайтом и в качестве параметра передал путь к csv-ленте.
То есть, в feeds при импорте указываю путь типа http://site.ru/encode.php?filename=pupkin.csv
Внутри скрипта добавляется имя сервера, с которого берется csv-лента, которую нужно перекодировать, загружается нужный файл и построчно распарсивается и перекодируется. На входе в скрипт с внешнего сервера попадает лента в cp-1251, на выходе скрипта отдается лента в utf8.
Текст скрипта:
<?php
header
('Content-Encoding: UTF-8');header('Content-type: text/csv; charset=UTF-8');
header("Content-disposition: attachment; filename=filename.csv");
header("Pragma: public");
header("Expires: 0");
echo "\xEF\xBB\xBF"; // UTF-8 BOM $file_path = $_GET['filename']; $file_path = 'http://app.marketmixer.net/content/export/' . $file_path; ini_set('auto_detect_line_endings', TRUE);
$handle = fopen($file_path, 'r');
while ((
$data = fgetcsv($handle, 0, ';', '"')) !== FALSE) {foreach ($data as $item) {
echo '"' . addslashes(iconv('cp1251', 'UTF-8//TRANSLIT', $item)) . '";';
}
echo "
";
}
ini_set('auto_detect_line_endings', FALSE); ?>
Вроде ошибок не обнаружено. Удачно загружает большие файлы длиной в 50 тысяч и более строк, десяток полей.
Если у кого есть усовершенствования - делитесь!
Нарисовал вот такой модуль - feeds_cp1251 с двумя хуками. Все по правилам, все работает.
Сначала перекодирует из cp1251 в utf8, а затем возвертает обратно. Причина обратной конвертации в том, что уже загруженный файл может быть пользователем случайно еще раз запущен на импортирование без повторной загрузки и тогда в сайт попадет инфа с испорченной кодировкой.
<?php
/**
* @author heron77
*/
function feeds_cp1251_feeds_before_import(FeedsSource $source) {
$fetcher_config = $source->getConfigFor($source->importer->fetcher);
if ($fetcher_config && $fetcher_config['source']) {
$path = drupal_realpath($fetcher_config['source']);
if(file_exists($path)) {
exec("iconv -f cp1251 -t utf8 ".$path." > csv_tmp && mv -f csv_tmp ".$path);
}
}
}
function feeds_cp1251_feeds_after_import(FeedsSource $source) {^M
$fetcher_config = $source->getConfigFor($source->importer->fetcher);
if ($fetcher_config && $fetcher_config['source']) {
$path = drupal_realpath($fetcher_config['source']);
if(file_exists($path)) {
exec("iconv -f utf8 -t cp1251 ".$path." > csv_tmp && mv -f csv_tmp ".$path);
}
}
}