PHP-скрипту устанавливается лимит 0. Далее на временные лимиты влияют параметры самого веб-сервера:
- Nginx (
fastcgi_read_timeout,proxy_read_timeout,client_body_timeout), - Apache (
Timeout,ProxyTimeout), - PHP-FPM (
request_terminate_timeout),
из-за чего скрипт может прекратить свою работу по инициативе веб-сервера.
Экспорт выполняется быстрее, чем импорт. Скорость импорта на слабом сервере может колебаться от 3–4 до 10 articles в секунду. Объём экспорта на слабом сервере может составлять до нескольких десятков тысяч articles с учётом пользовательских полей. На тестах 14 000 articles без пользовательских полей выгружалось чуть меньше 1,5 минут.
Большое влияние имеет количество импортируемых свойств article, есть ли среди них нередактируемые свойства (hits, modified и т. д.), а также количество пользовательских полей. Чем больше пользовательских полей, тем медленнее происходит импорт.
Рекомендуется подобрать оптимальное количество импортируемых данных опытным путём, а большое количество articles импортировать по частям, так как длительные тяжёлые процессы обычно выполняются в CLI-интерфейсе.
При экспорте вы можете выгрузить до нескольких десятков тысяч материалов.
При экспорте учитываются фильтры материалов панели администратора Joomla (параметры поиска). Вы можете выгрузить материалы только одной или нескольких выбранных категорий, только избранные, только опубликованные, только с определёнными тегами и так далее.
Параметр количество элементов на странице влияет на количество материалов в «пачке», выгружаемых из базы данных за раз.
В окне экспорта вы можете выбрать, какие именно свойства материала (title, catid и т. д.) выгружать. Всем свойствам материала добавляется префикс article:
id → articleid
Свойства материала используются в качестве заголовков таблицы. Свойство материала id выгружается всегда. Дополнительно к свойствам материала можно выгрузить ID тегов.
При экспорте можно выбрать, какие именно пользовательские поля выгружать, или не выгружать их вообще. В качестве заголовков таблицы используются системные имена пользовательских полей.
Пользовательские поля материалов могут принадлежать разным категориям. Убедитесь, что все выбранные категории имеют одинаковый набор полей.
Если часть пользовательских полей принадлежат всем категориям, а часть — только одной категории, то экспорт объединит эти поля в одну таблицу.
Если в выгрузке окажутся материалы из разных категорий, поля которых принадлежат только этим категориям, то экспорт попытается объединить их в одну таблицу. Однако корректность экспорта в таком случае не гарантируется.
Вы можете выбрать только id материала и нужные вам пользовательские поля. Импорт затем корректно обработает такую таблицу.
Если включён экспорт тегов, ID тегов записываются в столбец articletags. При импорте в этом же столбце можно указать ID тегов через запятую:
| articleid | articletitle | articletags |
|---|---|---|
| 5 | О компании | 2,3 |
| 8 | Контакты | 4 |
Если в окне экспорта включены раскрытые поля images и attribs, вложенные параметры материала записываются как обычные CSV-столбцы. Имя столбца сохраняет префикс article, например show_title превращается в articleshow_title, а article_layout — в articlearticle_layout:
| articleid | articletitle | articleshow_title | articleshow_tags | articlearticle_layout |
|---|---|---|---|---|
| 5 | О компании | 1 | 1 | cassiopeia:blog |
| 8 | Контакты | 0 | 0 |
С помощью импорта вы можете создавать новые материалы или обновлять существующие. Столбец articleid в таблице импорта используется как идентификатор материала.
Если в таблице импорта в столбце articleid пустота или 0, то импорт создаст новый материал. Если значение есть, то будет обновлён материал с указанным articleid.
Если для новых материалов не указана категория (отсутствует столбец catid или он пустой), то импорт создаст материал в категории по умолчанию (первая категория в списке). Для нового материала обязательно поле articletitle (заголовок материала).
Для обновления материалов обязательно поле articleid. В остальных столбцах можно указывать любые свойства материала, которые вы можете увидеть в форме создания материала, включая даже нередактируемые (hits — количество просмотров, modified — дата последнего изменения и т. д.).
Также с помощью импорта можно обновлять только пользовательские поля материала. Для этого в таблице импорта обязательно должен быть столбец articleid, а остальные заголовки столбцов должны соответствовать системным именам пользовательских полей.
Формат данных должен быть таким же, какой предусматривают эти поля: в некоторых случаях это обычные строки, а в некоторых — массивы или json.
При импорте и экспорте вы можете обрабатывать данные с помощью собственных плагинов. Создайте плагин группы cfi. Вызов плагина происходит в изолированном диспетчере, поэтому все остальные плагины не будут вызваны, даже системные.
Добавьте в плагин событие onImportPrepareArticleData($event). Событие вызывается при импорте для каждой строки импортируемой таблицы.
Вы можете получить данные:
$colummns = $event->getArgument('columns');$strNum = $event->getArgument('strNum');$article = $event->getArgument('article');
Вернуть обработанные данные обратно в процесс импорта:
$event->setArgument('article', $article);
Необходимо, чтобы количество столбцов в массиве $columns совпадало с количеством столбцов в массиве $article. Иначе будет ошибка.
В $strNum хранится номер строки в таблице импорта.
Добавьте в плагин событие onExportPrepareData($event). Экспорт получает список материалов из модели с list.limit согласно настройкам. Событие вызывается при экспорте для каждой страницы пагинации списка материалов.
Вы можете получить данные:
$colummns = $event->getArgument('columns');— выгружаемые данные, заголовки таблицы$articles = $event->getArgument('articles');— массив с полными данными материалов
Вернуть обработанные данные обратно в процесс экспорта:
$event->setArgument('articles', $articles);
В $articles хранится массив с данными материалов.
Данные экспортируются в файл и импортируются из файла формата CSV с обязательным разделителем ;.
Кодировка файла по умолчанию, если не установлена опция «Преобразовывать кодировку…»: UTF-8 w/o BOM. Поддерживается автоматическое преобразование кодировки, указанной в единственной настройке плагина.
Первая строка файла всегда представляет собой заголовки полей файла.
Поле articleid является обязательным, при его отсутствии импорт данных из файла не производится.
Любые иные имена полей принимаются за имена пользовательских полей материала. В случаях отсутствия у материала указанных пользовательских полей последние будут игнорироваться.
Несоответствие количества значений в строке несоответствию количеству заголовков полей приводит к отказу от обработки этой строки. При импорте пользовательские поля материала, отсутствующие в файле, не затрагиваются.
Даные об ошибках импорта хранятся в логе cfi.php в стандартной папке логов Joomla!.
При отсутствии ошибок импорта данных импортируемый файл удаляется, в противном случае файл сохраняется в стандартной папке временных файлов Joomla!.
При экспорте данные записываются в файл как есть, в том формате, в котором они хранятся в БД вашего сайта: простой текст, текст с разметкой HTML, структуры json, иные сложные строковые структуры.
Для стандартных настраиваемых полей Joomla! списочного типа, возвращающих структуры хранимых данных в виде неассоциированных массивов, в результирующий файл возвращается json. Для нестандартных полей в файл перед json-значением записывается структура array::: это необходимо для того, чтобы при возможном последующем импорте этих данных плагин смог разобрать json-значение из файла и подставить соответствующему полю подготовленный массив. Если из вышеуказанной фразы вы ничего не поняли – не страшно, просто не трогайте значение array:: в вашем файле или удалите этот столбец полностью во избежание повреждения данных соответсвующего поля материала.
Данные при импорте проходят валидацию Joomla, а так же могут быть обработаны сторонними плагинами группы cfi.
Разработчик плагина не несёт ответственность за некорректное содержимое импортируемых файлов, которое может вывести из строя ваш сайт.