evoCollection - такой же как у Ревы, только по-другому)

Внешний вид коллекции
Внешний вид модуля
Мы пилили-пилили и наконец-то допилили) Модуль evoCollection практически полностью повторяет функционал модуля Collection для MODX Revolution, и создает вкладку в корневых документах для табличного отображения дочерних ресурсов, быстрого их редактирования и создания.

С момента первого релиза сделано множество изменений и улучшений.

  1. Исправил мелкие и большие ошибки
  2. Написал модуль для задания конфигурации (очень похож по смыслу на Рево)
  3. Добавил различные настройки, список будет расширяться
  4. Сохранение по потере фокуса, либо по нажатию enter
  5. Сделал возможность кастомной обработки полей (подробнее ниже)
  6. Сделал install
  7. Выложил код на github (я с ним на «вы», поэтому если буду тупить — не ругайтесь=))


На данный момент есть ряд косяков:

  • Нормально подружить tinyMCE у меня не удалось. Он запускается, сохраняется, но не рекомендую использовать, если у вас есть тэги code, pre и т.п. — может не очень корректно с ними поступиить.
  • Наблюдается небольшой глюк при изменении фотографий.

Эти глюки поправлю в ближайшее время, ибо все равно хочу переписать все на нативный JS.

Обработка данных.


Для кастомной обработки данных необходимо в конфиге выбрать пользовательский тип данных и рядом вписать имя сниппета-обработчика.
В обработчике доступно три состояния: вывод, ввод, обработка. Ниже код, который обрабатывает дату (включен по умолчанию, чисто для приера) с пояснениями, думаю из него все будет понятно.

<?php
// $mode - получает одно из трех значений: input для ввода, output для вывода, execute при обработке.
if ($mode=='input') 
{
	//Выводим не страндартный type="text", а type="date" для ввода данных, плюс приводим его к нужному виду. Допустимы любые input и select. $value - значение поля.
	if ($value>0)
		{
			$value = gmdate("Y-m-d", $value); 
			return '<input type="date" value="'.strip_tags($value).'">';
		}
	else return '<input type="date">';
}
if ($mode=='output') 
{
	// Выводим не в unixtime, а красивше)
	if ($value)
		{
			$d = gmdate("d", $value); 
			$m = gmdate("m", $value); 
			if ($m==1) $m = 'января';
			if ($m==2) $m = 'февраля';
			if ($m==3) $m = 'марта';
			if ($m==4) $m = 'апреля';
			if ($m==5) $m = 'мая';
			if ($m==6) $m = 'июня';
			if ($m==7) $m = 'июля';
			if ($m==8) $m = 'августа';
			if ($m==9) $m = 'сентября';
			if ($m==10) $m = 'октября';
			if ($m==11) $m = 'ноября';
			if ($m==12) $m = 'деабря';
			$y = gmdate("Y", $value); 
			return = $d.' '.$m.' '.$y; 
		}
	return 'не задано';
}
if ($mode=='execute') 
{
	//Т.к. получаем данные в формате YYYY-MM-DD, то нужно их привести виду Unixtime
	$startdate = date($value." 12:00:00");
	return strtotime($startdate);		
	
}


Также в сниппете доступны переменные:
$did — id документа, которому принадлежит поле
$table — tv/content
$field — название текущего поля

Планы на будущее.


1) Переписать js на натив
2) Добавить мультязычность
3) Добавить различные виджеты
4) Переписать install для нового репозитария)))

Установка.


Проверено на 1.3.0+ — как на других — не знаю, но вполне вероятно что запустится)

Я устанавливаю его через текущий репозитарий =) Ссылка на архив.
Ручная установка:
Ссылка на гитхаб — github.com/liber87/evoCollection

Копируем содержимое папки /assets/plugins/evocollection/ в соответствующую на сайте
Создаем модуль «Коллекции», вставляем в него содержимое /install/assets/modules/evocollection.tpl
Создаем плагин «evoCollection», вставляем в него содержимое /install/assets/plugins/evocollection.tpl не забываем ставить галочку «Анализировать Doc».

Сейчас уезжаю на недельку — ответить, если будут вопросы, смогу чуть позже.

17 комментариев

avatar
Переделать бы это все на DocLister + MODxAPI — так и цены б ему не было :)
Плюс все $_GET неплохо бы обезопасить, особенно перед прямой вставкой в sql-запрос.
Комментарий отредактирован 2018-02-20 17:31:33 пользователем webber
avatar
На счет безопасности — там везде проверка идет на менеджерский доступ, а если он есть, то какой смысл проверять переменные? Просто ради того, чтобы криво что не встало?..
На счет DL и MODXxAPI — прекрасно к ним отношусь, но если честно просто не вижу практического смысла в данном случае, все и так крутится и вертится.
Ну и как бы код на гитхабе есть — принимаю любые дополнения))

P.S. то, что в следующем релизе перепишу на DL не исключаю) Но сначала этот нужно допилить)
Комментарий отредактирован 2018-02-20 18:08:37 пользователем liberpro
avatar
Я не сильно великий спец по безопасности, но если рекомендуется никогда не совать в запросы mysql напрямую данные из REQUEST, то я предпочитаю так и делать, не вникая насколько сильно проверка наличия в сессии переменной mgrInternalKey меня защитит :)

А насчет DL + MODxAPI — можно конечно было и Ditto использовать для вывода списков, но как по мне, так тут как раз логичнее использовать общеизвестные решения для постраничного вывода списков, чем писать свое и повторять все уже пройденные грабли.
avatar
Ну а если вникнуть, то получится, что первым идет проверка на сессию)) А дальше хоть в открытую доступы от интернет-банкинга на экран выдавай)) Но то такое.
На счет Ditto — не понял. Постраничный вызов можно и самому написать. А вообще использование готовых решений это возможность, а не обязанность. Если код работает без них, какой смысл переводить на что-то другое?
Плюс к этому DL и Ditto нужны тогда, когда у тебя возможен кастомный вывод. Тут я не вижу необходимости.
avatar
Пообщался в приватном чате с коллегами по поводу необходимости DL (и прочих готовых решений). Так вот, единственный аргумент, который я условно принял, это тот, что поддерживать другим в таком случае будет проще.
Почему условно, потому что в нашем случае крайне редко дополнения поддерживает несколько человек. Думаю ты не по-наслышке об этом знаешь) Но не суть.
И вот я прикинул как то, что я написал, перекинуть на DL. И знаешь в чем ирония? В том, что кода будет больше, это раз. Во-вторых все сведется к тому, что я уже написал, просто обернутым в prepare) С более сложным кодом!))
avatar
Сначала он говорил «нафиг мне $modx->db->query, когда я могу использовать mysql_query», а потом у него «почему-то» перестали работать его дополнения :)
шутка )) Я не с претензией, просто мне показалось, что постраничный вывод проще организовать в evo тем инструментом, который для этого в evo и принято использовать:) Ну нет, так нет, в любом случае работы проделано немало :)
avatar
Так и я не оправдываюсь) Просто заморочился и поделился своими умозаключениями которые у меня возникли в ходе заморочек)
avatar
1) Почему тут не используется switch?
2) Почему ключи массива не заключаются в кавычки? По логике пхп, mgrInternalKey, value, etc должны быть константами.
3) этот файл возможно использовать в уязвимости типа LFI и добиться записи произвольных данных в PHP файл

Дальше не стал смотреть, но webber правильно задал направление
avatar
Спасибо, поправим.
P.S. Только у меня вопрос про switch — в чем принципиальная разница от if? Только в наличии дефолта или есть еще что?
Комментарий отредактирован 2018-02-21 08:05:25 пользователем liberpro
avatar
Все ответы на почте
avatar
Огромное спасибо!
avatar
Спасибо, удобная штука.
1.4.0 — полет нормальный.
Вопрос — как можно возвращать пользователя на список evoCollection после редактирования документа из списка?
avatar
В ближайшее время сделаю редактирование не при переходе, а во всплывашке. Думаю в течении недели.
avatar
Приветствую! А с DL-комментами нет подвижек? недавно как раз в тему вот это появилось.
avatar
Привет! Я там закопался с древовидными документами((
Могу подправить и выложить что есть, но вроде Дмитрий говорил что он Паталогика хотел озадачить. Проясним этот вопрос на этой неделе.
Комментарий отредактирован 2018-02-27 11:07:47 пользователем liberpro
avatar
Хорошо. Попробуй прояснить, раз ты с Дмитрием обсуждал — это одно из самых нужных решений (человеческие комменты со входом из соцсетей).
Комментарий отредактирован 2018-03-04 12:34:23 пользователем Aharito
avatar
Спасибо за модуль.
Возник вопрос: при любом действии с документом: создании, правке поля и т.д. появляется прелоадер prntscr.com/j9w3xo и все. Чтобы увидеть изменение, приходится обновить окно. Это баг или фича?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.