EditDocs - модуль для редактирования,импорта, экспорта, апдейта полей базы & TV параметров (Evo) update 26.01.2018

Я долго пользовался Fast content csv для разных случаев, но в последних версиях evo он работал через раз и разбираться не очень хотелось, решил запилить свое решение.
Модуль умеет:

1)Редактировать основные поля и TV группы документов разной вложенности.
2)Импортировать из Excel или Calc
3)Обновлять таблицы из Excel или Calc и производить сравнение по выбранному TV.
4)Экспортировать в CSV с выбранным уровнем вложенности.


Редактирование происходит в поле Input, внесение результата идет аяксом на событие onblur().
Модуль не рекамендуется блониданкам и прочему офисному планктону. Хотя в шаблонах tpl вы найдете где можно оставить только нужные поля для редактирования и добавить вывод только нужных TV. По дефолту они все выводятся через плейсхолдер.

Для удобства сделал кнопку для очистки кэша, после внесения изменений это необходимо.
ОБЯЗАТЕЛЬНО наличие DocLister и Modx API.

Скачать можно с гитхаба или прямо из админки в Extrashttps://github.com/Grinyaha/editDocs
Установка стандартная, содерджимое архива закидываем в modules. Создаем новый модуль editDocs и вставляем туда
include_once($modx->config['base_path'].'assets/modules/editdocs/editdocs.module.php');


UPD 21.01.2018

Обновление до версии 0.3.6

— добавлена фильтрация по ТВ параметрам и основным по полям (по правилам компонента DocLister) при редактировании.
— сообщения о редактировании теперь всегда сверху.
— исправлены мелкие баги
— отредактированы CSS под стиль админки.

UPD 5.07.2017
— Добавлен видео-урок по использованию модуля
youtu.be/6c_Tg9eGc2g
— fix CSS под новую тему для последних версий EVO.

UPD 02.07.2017
— исправлена ошибка апдейта по внутренним полям документа (id, alias и тд.)

UPD 24.05.2017
Модуль доступен для установки из Extras.

UPD 20.05.2017
— При редактировании поле input заменено на textarea, что позволяет редактировать html код, json и тд.

UPD 16.05.2017
— Исправлена ошибка апдейта после рефакторинга.

UPD 09.05.2017
Обновлено до версии 0.3
— добавлен экспорт в CSV (с переключением кодировки в Win-1251)
— добавлен флаг переключения обработки неопубликованных и помеченных на удаление документов.
— рефакторинг кода, спасибо webber
— исправление ошибок.

UPD 28.01.2017 — переписал функционал по новому, исправил баги, добавил уровни вложенности. Спасибо огромное Pathologic за помощь!

UPD 01.02.2017
— перевод модуля на ООП.
— добавлена опционально ajax-пагинация

UPD 11.02.2017
— добавил импорт из Excel или Calc
— добавил апдейт из Excel или Calc
— мелкие фиксы

UPD 12.03.2017
— удалил чанк пагинации для редактирования полей базы и ТВ (сама пагинация осталась)

UPD. 15.04.2017
Добавлен экспорт в CSV и сравнение на наличие в базе по выбранному ТВ.
мелкие исправления.

Спасибо Agel_Nash Pathologic a-sharapov
за помощь!
За донат спасибо Fr3ddy и какому-то доброжелателю за 200 руб!

Ну и кому понравился и оказался полезным данный модуль может тоже задонатить мне на кофе :)

R948295169787
Z350511691467

53 комментария

avatar
У модуля проблемы с безопасностью. Ну и раз обязательно наличие DocLister, то для вывода логично было бы его и использовать.
avatar
Как закрыть?
avatar
Проверяй, авторизован ли менеджер. Ну и можно еще проверять, есть ли у него разрешение на запуск модулей.
avatar
Ну и заодно переделай подключение парсера в ajax.php. Для очистки кэша есть метод в modResource, так и называется — clearCache. Метод save два раза вызывать не нужно.
avatar
А как переделать подключение парсера? я делал по здешним урокам Ajax modx.im/blog/docs/1147.html
Комментарий отредактирован 2017-01-27 23:41:00 пользователем Grinyaha
avatar
avatar
Понял, спасибо. А где у меня там save два раза? Один раз вызывается, а второй проверяется выполнилось или нет, мож неправильно конечно делаю :)
avatar
$result = $doc->save() и проверяй. Или можешь удалить первый вызов save().
Комментарий отредактирован 2017-01-27 23:46:34 пользователем Pathologic
avatar
Значит неправильно меня Agel учил))) спасибо
avatar
Почему неправильно? Метод save() возвращает результат, так что можно написать или:

$result = $doc->save();
if ($result) {}

Или:

if ($doc->save()) {}

А у тебя сначала сохраняется просто, потом сохраняется еще и в условии.
avatar
Отлично! как-нибудь затестим, а если что, и задонатим )
avatar
$this->data = $_POST['dat'];
$this->pole = $_POST['pole'];
$this->doc->edit($this->id);
$this->doc->set($this->pole, $this->data);


Раньше перед сохранением в modResource нужно было эскейпить данный ($modx->db->escape()) — иначе при попытке заслать туда кавычки или еще чего такого нехорошего — все ломалось. Хотя, может с тех пор что и поменялось :)
Комментарий отредактирован 2017-04-12 10:09:40 пользователем webber
avatar
Если мы используем DLTemplate для парсинга шаблонов, то я бы и использовал везде его стандартные возможности. Т.е. сначала при инициализации задаем путь к шаблонам и их расширение, а потом просто используем стандартную конструкцию вместо этих громоздких записей
if($action=='branch') {
    $branch = '@CODE:'.file_get_contents(dirname(__FILE__).'/tpl/branch.tpl');
    $outTpl = $dlt->parseChunk($branch,$data);
}


пусть DLTemplate сам берет шаблон :)
Комментарий отредактирован 2017-05-11 08:47:03 пользователем webber
avatar
И еще — я бы сделал проверку наличия в базе по умолчанию по id ресурса. А то получается странно — можно проверить только по артикулу, а если у меня экспорт и импорт идет вместе с id товаров, то они тупо пишутся еще раз :)
avatar
Честно говоря делал этот момент под определенного заказчика, думал про id тоже, но смотрю что времени надо больше ковыряться чем с TV, пока оставил так. А в целом согласен с тобой.
avatar
Жалко, что при наличии проверки у нас идет только добавление, а редактирования нет. Вообще в этом месте конечно лучше бы переделать:
1. проверять с учетом ТВ/полей базы
2. возвращать при проверке не количество, а id найденного ресурса
3. при наличии этого id делать $doc->edit($id) а не просто констатировать факт, что данный ресурс в базе есть и мы с ним ничего не делаем
avatar
Calc — что такое подскажите, пожалуйста.
avatar
Это аналог редактора электронных таблиц Excel из пакетов OpenOffice(раньше) или LibreOffice (сейчас)
сцыла на Вики
avatar
Скачал с гитхаба архив editDocs-master и проверил его на www.virustotal.com, один из антивирусников ругается — пишет что найден W32.Malware.Heur. Как полечить?
avatar
Никаких вирусов там быть не может. Код весь открыт. Из библиотек только PHPExcel, отдельно можете найти на Git и проверить архив, либо со скачанного архива.

HEUR/Malware' [heuristic] — подозрение эвристического анализатора
avatar
Да, ругается на библиотеку PHPExcel, сейчас обновлю ее у себя на гите.
avatar
Короче все у меня заглючило с гит-клиентом, обновился и он стал вылетать. Ставить библиотеку PHPExcel надо вручную.
avatar
Обновил PHPExcel, проверяй на totalvirus.
avatar
Проверил, теперь все хорошо.
avatar
1. Тестирую на локальном компьютере — после того, как перетащил файл для импорта появляется ошибка:
Warning: move_uploaded_file(Z:/home/primer/www/assets/modules/editdocs/uploads/example1.xls) [function.move-uploaded-file]: failed to open stream: Permission denied in Z:\home\primer\www\assets\modules\editdocs\ajax.php on line 192

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move 'Z:\tmp\phpBC4F.tmp' to 'Z:/home/primer/www/assets/modules/editdocs/uploads/example1.xls' in Z:\home\primer\www\assets\modules\editdocs\ajax.php on line 192

После этого нажимаю на кнопку «ПОЕХАЛИ» — импорта не происходит.

Как её исправить?

2. Как скрипт понимает какие поля из файла вставлять в какие поля на сайт?
avatar
Формат таблицы самый простой.
первая строка — имена столбцов (основные поля, либо имена TV)
pagetitle longtitle tvname
данные данные данные
данные данные данные

failed to open stream: Permission denied in говорите о том что у вас нет прав для записи файлов в данную дерикторию Z:\tmp\
Если пользуетесь денвером, то советую переходить на OpenServer, денвер умер давно, а OpenServer с графической оболочкой и вообще гораздо удобнее и мощнее. Разве только что размер дистрибутива большой (от 300 мб до 900 мб вроде), но разве это сейчас проблема?
avatar
если в поле или тв есть html то всё едёт)

prntscr.com/f9pb5x
Комментарий отредактирован 2017-05-19 15:13:54 пользователем Fr3ddy
avatar
Да, тоже думаю надо что-то делать и раз востребовано то исправил. Поле input заменил на textarea и по размеру подогнал под input. Качай обновленную версию с гита.
avatar
спасибо! донат с пометкой editDocs :)
avatar
Приятно, черт возьми, спасибо :)
avatar
мега-полезный модуль, нужно было править кучу полей) выручил
avatar
А еще импорт, апдейт, экспорт тоже огонь :) заменил мне и FAST CONTENT и CatalogFill.
avatar
Здравствуйте! Вот такие ошибки, при перетакскивании файла на импорт:

Warning: move_uploaded_file(/home/miridey/miridey.com.ua/test2/assets/modules/editdocs/uploads/hghghghgh.xls) [function.move-uploaded-file]: failed to open stream: No such file or directory in /home/miridey/miridey.com.ua/test2/assets/modules/editdocs/ajax.php on line 192

Соответствующая часть кода по строке 192:

{
$this->fileName = $_FILES[«myfile»][«name»];
192 строка move_uploaded_file($_FILES[«myfile»][«tmp_name»], $this->output_dir. $this->fileName);
$this->ret[] = $this->fileName;
}

Warning: move_uploaded_file() [function.move-uploaded-file]: Unable to move '/home/miridey/.system/tmp/phpFyYPGY' to '/home/miridey/miridey.com.ua/test2/assets/modules/editdocs/uploads/hghghghgh.xls' in /home/miridey/miridey.com.ua/test2/assets/modules/editdocs/ajax.php on line 192

Fatal error: Uncaught exception 'PHPExcel_Reader_Exception' with message 'Could not open /home/miridey/miridey.com.ua/test2/assets/modules/editdocs/uploads/hghghghgh.xls for reading! File does not exist.' in /home/miridey/miridey.com.ua/test2/assets/modules/editdocs/libs/PHPExcel/Reader/Excel5.php:433 Stack trace: #0 /home/miridey/miridey.com.ua/test2/assets/modules/editdocs/libs/PHPExcel/IOFactory.php(269): PHPExcel_Reader_Excel5->canRead('/home/miridey/m...') #1 /home/miridey/miridey.com.ua/test2/assets/modules/editdocs/libs/PHPExcel/IOFactory.php(191): PHPExcel_IOFactory::createReaderForFile('/home/miridey/m...') #2 /home/miridey/miridey.com.ua/test2/assets/modules/editdocs/ajax.php(207): PHPExcel_IOFactory::load('/home/miridey/m...') #3 /home/miridey/miridey.com.ua/test2/assets/modules/editdocs/ajax.php(52): editDocs->uploadFile() #4 {main} thrown in /home/miridey/miridey.com.ua/test2/assets/modules/editdocs/libs/PHPExcel/Reader/Excel5.php on line 433



{
// Check if file exists
if (!file_exists($pFilename)) {
433 строка throw new PHPExcel_Reader_Exception(«Could not open ». $pFilename. " for reading! File does not exist.");
}

При нажатие на кнопку поехали, написано, что сессия устарела, загрузите файл заново.

Что делать. Помогите!
avatar
Больше ошибок нет, просто надо было папку uploads создать. А теперь другой вопрос, как импортировать свои колонки из excel, которые предварительно созданы в виде tv параметров на сайте. Вот, например у меня есть такие колонки в файле, но он их не добавляет.

И экспорт так-же не работает, пишет, что загружаюсь, но так и висет в этом положении, когда, ничего не выбираю, не id родителя, не поля, то пишет success и начинает скачиваться файл, но он естественно пустой. Как тут, быть?
avatar
Версия давно скачана? Много багов было пофиксино.
Импорт простой как 3 копейки, названия столбцов соответствуют названию TV. При импорте указываем ID родителя. И все.
avatar
Так чтоп, а почему такая проблема возникла если в комплекте папка uploads прилагается? :)
avatar
Все равно возикает Сессия устарела загрузите файл заново!
Вот, часть кода отвечающий за данное сообщение:
{
//if($_SESSION['data']) print_r($_SESSION['data']); else return 0;
if ($_SESSION['data']) {
return $this->updateReady($this->newMassif($_SESSION['data'])). $this->table($_SESSION['data']);
} else return 'Сессия устарела, загрузите файл заново!';
}

Не могу понять что за условие, возникновения данного сообщения.
avatar
Я просто, перетаскиваю файл на поле, потом возникает таблица ниже, этого файла. Выбираю родителя и нажимаю поехали и возникает данное сообщение.
avatar
{

if (!$_POST['parimp']) {
return 'Введите ID родителя!'. $this->table($_SESSION['data']);
}
if ($_SESSION['data']) {
return $this->importReady($this->newMassif($_SESSION['data'])). $this->table($_SESSION['data']);
} else return 'Сессия устарела, загрузите файл заново!';
}
Ой, тот код отвечает за обновление, а этот как раз за то что я делаю.
avatar
Данное сообщение вылазило или из-за большого количества импортированных товаров или из-за не правильно названных колонок. Сейчас пишет все ok. Но товар не появляется в заданном родителе.
avatar
Файл появляется в uploads.
avatar
Можете доступ временный дай к сайту?
скайп Grinyaha
avatar
Та же проблема, что и Saldorian.
Работают только 2 вкладки: Редактирование и Экспорт. Папка была на сервере / assets / modules / editdocs / uploads

Грузим Эксель только с 2-мя столбцами: ID и цена.
Апдейт вкладка просто показывает загрузку и все. А Импорт показывает что все загрузил, но цены так и не поменялись. Кэш сбрасываем
Скрин после загрузку файла во вкладке Импорт
Комментарий отредактирован 2017-07-01 21:30:37 пользователем blackcat87
avatar
ещё раз убеждаюсь, какая полезная штука) особенно для сеошника, когда нужно поправить много описаний или названий страниц (которые не динамически наполняются)

спасибо :)
avatar
При выгрузке поля introtext joxi.ru/vAW1kXC1QqZzmW поля «ломаются». Что с этим делать?
Комментарий отредактирован 2017-07-06 11:00:29 пользователем Bredova
avatar
Отличный модуль, да же не знал что всё может быть так просто и удобно.
Единственное заметил такую вещь что при выборе дочерних элементов выводится и родитель, на скриншоте видно. Может это баг или так и должно быть?
avatar
Сейчас модуль не досутпен в Extras. C ним что-то случаилось?
avatar
появился
avatar
Добрый вечер. Использую на сайте TvTable. Сделал экспорт ресурсов. Изменил данные. При импорте слетает таблица TvTable с данными. Вместо таблицы в админке textarea с данными. В чем может быть проблема?
avatar
TvTable вроде устарело уже, вместо него, может, лучше MultiTV?
avatar
проблема может быть с правами в самом плагине. Выставьте роли для которых оно работает. (1,2,3)

но как написал человек ниже, лучше используйте multitv, на нём можно делать очень крутые таблицы ))
avatar
1) При экспорте нет возможности указать разделитель столбцов, спецсимволы, как я понял, не экранируются и иногда вылезают глюки.
2) При любом больше 1 уровне вложенности в каталоге не может найти соответствие по pagetitle, актуально, когда нужно править цены во всем каталоге сразу и не плодить прайс-листы для каждого подраздела
Комментарий отредактирован 2018-04-20 09:00:30 пользователем alexbeep
avatar
Что-то не могу найти в модуле, где генерится алиас, у меня при импорте из Excel получаются алиасы с подчеркиванием вида
armatura_a1_6_5_mm_st3pssp_tu_14-1-5282-94_dlina_motki_m

а хотелось бы с дефисом.
Комментарий отредактирован 2018-09-14 09:13:15 пользователем Aharito
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.