Веб-разработка

индекс
236,88

Универсальный редактор данных

imageПривет!
Однажды webscout написал пост про универсальную админку (редактор данных) «Модеринка». Тему эту не развили, но, я думаю, она заслуживает внимания. Попробую рассказать, почему. Многие разработчики, в том числе и я, сталкиваются с вопросом экономии времени при разработке сайтов. Согласитесь, создание админской части сайта достаточно трудозатратно, последующая модификация структуры данных тоже требует не мало времени. Сейчас многие CMS предоставляют разработчику возможности визуального редактирования структуры таблиц БД, но проблема в том, что эти инструменты привязаны к CMS. В коробочных CMS много модулей с уже готовыми интерфейсами, но начинаются проблемы, когда функционала этих модулей недостаточно. Подправить шаблон, выводящий информацию на сайт легко, а вот подправить структуру данных и допилить админку уже сложнее.

Так случилось, что я тоже писал универсальный редактор данных для своих личных целей. На его примере я и попытаюсь объяснить, что это такое (в моем представлении) и почему его не надо сравнивать с phpMyAdmin.

По сути, универсальная админка — это инструмент, предназначенный для управления хранящимися в БД и файловой системе данными. Состоит он из двух частей, назовем их конструктором и редактором данных. Конструктор данных предназначен для визуального управления структурой данных (Создание таблиц БД, редактирование таблиц, управление типами полей и т.д.). Редактор данных предназначен для управления контентом. Все данные в редакторе представляются в удобной для восприятия человеком форме (В phpMyAdmin вы увидите image.jpg, а в этом редакторе само изображение). То есть, основная задача редактора — преобразование данных для отображения, а также построение форм для ввода данных.

Перейду к наглядным примерам.

Конструктор данных состоит из списка созданных таблиц и формы для редактирования:
image

Тут я нажал на «Редактировать колонку image». Каждую колонку можно называть на русском/другом языке. Ее можно скрывать в сводной таблице редактора. Можно управлять зависимостями отображения. Например, можно сделать, что бы в форме добавления лота автоматически появлялось поле «Тип аукциона», если выбрать форму продажи «Аукцион» и исчезало при прямой продаже. У каждого типа поля есть и индивидуальные параметры:
image

Это форма добавления новой таблицы. Думаю тут все понятно:
image

А вот так выглядит редактор данных. Можете сопоставить поля с первым примером. Тут тоже новости. Некоторые поля можно редактировать не открывая всю новость:
image

Нажал «Редактировать новость». Форма сгенерировалась:
image

Таблицы можно связывать между собой. В конструкторе имеются два типа данных (ссылка на строку из другой таблицы, ссылка с другой таблицы) для связи таблиц между собой. На примере имеются две связи:
1. Родительская группа — связь с идентификатором и названием этой же таблицы
2. Объявления — связь с таблицей объявлений
image

Содержимое таблицы можно фильтровать и сортировать. В данном примере найдены все новости, связанные с Иркутском и Путиным. Новости отсортированы по количеству просмотров в порядке увеличения:
image

Количество типов данных ограничивается лишь фантазией программиста и требованиями заказчика, так как каждый тип описан отдельным классом. Есть возможность управлять доступом к таблицам. Она не зависит от выбранной CMS. На указанном примере рассмотрена админка довольно функционального сайта (посмотрите размер скролла в списке таблиц) и она вполне справляется. Конечно, все задачи ей не решить, но элементарное управление данными — легко.

Это лишь одна из реализаций такой админки. Она достаточно функциональна и быстра, но далеко не идеальна. Как вы думаете, насколько заслуживает жизни эта концепция? Мне очень интересно Ваше мнение.

UPD: Можете попробовать, что это такое. В архиве есть краткая инструкция по установке. Имя: admin Пароль: admin. Скачать
+32
1 марта 2010, 08:47
71

комментарии (82)

0
STZ #
так, а где ее теперь можно скачать?
0
Shvonder #
Добавил ссылку для скачивания.
0
erfen #
А почему пароль до 30 символов есть, а хэша пароля нету?
0
Shvonder #
Пароли хранятся в БД захешированные. И отображаются соответственно в виде хеша. Почему до 30 символов. Когда вы редактируете пользователя то можете ввести новый пароль. Редактор автоматически определяет, что введен новый пароль и хеширует его. А если там уже хэш (32 символа) то он его не хеширует а просто сохраняет без модификации. Ограничение для того что бы не ввели случайно пароль длиной 32 символа (это конечно маловероятно)
НЛО прилетело и опубликовало эту надпись здесь
0
Shvonder #
Какой по-вашему будет универсальный вариант? У меня еще не возникало с этим проблем, поэтому я ничего другого не придумывал ))
НЛО прилетело и опубликовало эту надпись здесь
0
Shvonder #
Я вас не очень понял. На самом деле там все данные на стороне клиента хранит яваскрипт. Страница загружается только один раз. Далее весь обмен идет без перезагрузки страницы. Ну да ладно. Если кому то на практике не понравится обязательно переделаю
НЛО прилетело и опубликовало эту надпись здесь
0
Shvonder #
Согласен, хорошая идея
0
NickMitin #
А ещё можно тип данных «пароль» завести и запрограммировать там всё, что необходимо. Тогда никаких ограничений не надо.

Лучше мыслить реальными объектами.
0
Shvonder #
Посмотрите скрин, там есть такой тип данных :)
0
NickMitin #
Тогда тем более совершенно непонятно откуда ограничение.
0
Shvonder #
Я когда все это создавал, особо не задумывался над этим. Просто ограничил и все :). Тогда я старался сделать как можно проще в плане программирования.
Я думаю, что не сильно обидел людей паролями больше 30 букв, таких наверное почти нету
0
egorinsk #
Не слушайте его, он ничего не понимает. По моему, удобный вариант — это 1) показывать пустое поле для ввода пароля и надпись «пароль сохранен». Если юзер хочет сменить пароль — он введет новый, нет — оставит поле пустым.

Вариант 2) показать надпись «поменять пароль». при клике появляется форма ввода нового. минус — требует яваскрипта и потому мне не нравится.

Ваш вариант имеет недостаток к слову — а если юзер хочет ввести пароль, который случайно оказался такой же как и хеш? И вообще, какой смысл выводть хеш, какая от него польза? Вы его в уме что ли в пароль превратите?
0
Shvonder #
Спасибо за ваши варианты, я именно так и сделаю. Я особо над этим не парился когда создавал этот тип данных. Не такую уж большую роль играет пароль, который применяется только в таблице пользователей
+5
SilentImp #
Я бы не стал это использовать.
Слишком низкий уровень абстракции, на мой взгляд.

В CMS, как мне кажется, имеет смысл работать с понятием функциональных модулей.
Например «новостная лента» или «голосование», которые позволяют работать с неким предустановленным форматом данных.
После чего на его основе с помощью шаблонов представления в том или ином формате (например xslt или html с набором меток) данные, предоставленные этим модулем отображаются пользователю.
Да, в этом случае нельзя легким движением руки добавить поле в новостной блок. Но как правило это и не нужно, верно?
Универсальность достигается за счет большого количества модулей и простоты расширяемости CMS. Да и сами модули, если они в открытом коде, распространяются с соответствующей лицнезией и по человечески написаны, слегка изменить (и получить еще один модуль со своими уникальными возможностями) как правило не сложно.

В общем: в своей жизни я не вижу места для этого продукта (Хотя кому то он может быть и придется по вкусу).
Думаю, что это тот случай, когда «универсальность» принесет гораздо больше головной боли, чем пользы.

0
Shvonder #
Спасибо за комментарий. Я вам не предлагаю этим пользоваться, это лишь концепт и вариантов исполнения может быть много. Я не просто так это сделал, я пробовал «слегка» изменять стандартные админские модули (именно про них идет речь) и это мне приносило больше головной боли, точнее уносило больше времени. Хотя их править, вы правы, не сложно, но у меня решающий фактор — время. И для большинства сайтов (визитки, каталоги) работа сводится только к верстке
+2
SilentImp #
Я вам не предлагаю этим пользоваться

Я написал, что не стал бы это использовать, что бы обозначить свои впечатления от вашей работы.

И, если кому то это поможет сохранить время и нервные клетки, то — очень здорово. Удачи.
0
aps #
>Да, в этом случае нельзя легким движением руки добавить поле в новостной блок.
>Но как правило это и не нужно, верно?
Зато если уж нужно, то приходится корячиться по полной.

>Универсальность достигается за счет большого количества модулей и простоты расширяемости CMS.
Viva Joomla!
+2
SonicGD #
>Зато если уж нужно, то приходится корячиться по полной.
Пара строчек в шаблоны, пара в логику и поле в бд. Не так уж это и сложно.
0
aps #
Итого имеем два варианта:
1) Изучать API чужого продукта (если он еще и задокументирован) и вставлять в нужном месте две строчки кода + пару полей в БД
2) через админку добавить нужное поле, и если это предусмотрено то связи между таблицами.
Мне больше нравится второй вариант. Он более юзабельный и безопасный. По крайней мере если обвалится система — можно предъявить претензии к производителю CMS (если она платная)

0
SonicGD #
А почему продукт вдруг стал чужим?
0
aps #
Исходно моя реплика относилась к SilentImp, который предполагал что наличие большого числа плагинов избавляет от необходимости что-то настраивать в CMS, поэтому я и вспомнил джумлу с ее десятками тысяч плагинов.
Но если речь идет о собственной CMS то один фиг лучше править/создавать админки/БД при помощи инструментария, чем в ручную при помощи написания SQL-запросов, правки конфигурационных файлов и влезания в исходники.
0
Mazikk #
Помню похожая реализация была в SintCMS. Все на текстовых файлах. Удобно было.
0
Shvonder #
Я подобное видел в NetCAT
0
pentium133 #
Поздравляю. В symfony это называется «админ генератор».
0
Shvonder #
Да, я это знаю. Я писал, что в некоторых продуктах есть такие редакторы
0
fozzy #
Было бы удобно сделать inline-edit для основных полей, а для остальных уже заходить в «расширенное» редактирование.
0
Shvonder #
Спасибо за идею, сейчас мой проектик плавно переезжает на ExtJS. Там я это все уже предусмотрел для большинства полей и гораздо большее
+1
Bupyc #
Спасибо за статью. Считаю что такие универсальные админки заслуживают большего внимания и развития, сам пользуюсь генератором yii, но там сильно не хватает некоторых вещей: загрузка файла\картинки, встроенной авторизации, связи с другими таблицами. Надеюсь в скором будущем выйдет Gii(модуль для Yii реализующий подобные функции) или более универсальное stand alone решение или может автор разовьет свой продукт до законченного решения.
0
Shvonder #
Я думаю, они все это сделают. Я выложу редактор, когда переведу его на ExtJS, что б людей внешним видом не пугать
0
pgrishin #
В любой БД, то что вы сделали, называет отображения (views)
0
Shvonder #
Извините, я не понял смысла вашего сообщения
0
pgrishin #
0
pgrishin #
Если картинка лежит в БД путем, то лучше конечно отображать путь, если картинка в БД лежит как поток данных, то надо показывать картинку, но это умеют менеджеры БД делать.

Русские названия БД тоже поддерживают, отображение даты, и прочего тоже умеют с учетом региональных настроек.

Выходит, у вас все-таки получился менеджер БД + кривые views
0
Shvonder #
Картинка может лежать не в БД, как чаще всего бывает.
У меня есть логические переключатели.
Есть визуальный редактор.
Есть возможность создавать любые отображения, хоть графики и прогресс-бары.
Есть календарь для выбора даты.

И вы в чем то правы. Я писал в топике что это «инструмент, предназначенный для управления хранящимися в БД и файловой системе данными. », только вот обычные менеджеры БД сделаны с упором на управление структурой данных а эти на управление самими данными.
0
conturov #
Года 4 назад встал вопрос на каком движке писать сайты (занимаемся разработкой сайтов) и приняли решение писать все свое. Все началось с обычного новостного движка. Потом появились страницы и т.д т.п. Сейчас мы имеем свою CMS с функционалом от обычной странички до магазина с возможностью заказа.

Вы правильно сделали что написали свое решение. Его всегда можно модифицировать в ту или иную сторону, да и скорость выполнения быстрее чем большие CMS.

0
ringo #
Будто скриншот нашей CMS :) Правда сделали это года 3-4 назад. Интересно, а в других CMS есть такое. Дайте ссылки, если кто знает.
0
keltanas #
Мне очень понравилось решение. Но нужно что-то более гибкое.

Есть такая задача. Каталог товаров. В нем 2 ветки товаров с разным набором свойств. Для данного редактора придется либо перекрывать наборы для каждой ветки, либо заводить 2 таблицы.

Нельзя добавлять индексы к таблицам. Нету сортировок данных.
Но для себя добавлю в избранное. В будущем может использую идею.
0
aps #
Просите, а как вы решаете задачу наличия двух разных видов товаров, если без двух таблиц/перекрытия?
0
Shvonder #
Я за него ответил :)
0
keltanas #
Ка и описал Shvonder, это решается как «создать отдельно таблицу свойств и таблицу связей и тогда каждому товару можно будет назначать неограниченное количество свойств через таблицу связей».
Но этот подход несколько сложен и его не мешало бы абстрагировать. К тому же при больших объемах информации MySQL может прогнуться до полного зависания (видел такое в одном инет-магазине на шаред-хостинге, правда не помню, что там за версия мускуля была).
0
Shvonder #
Я работаю над улучшением структуры редактора. Но в любом случае он делает вполне обычные запросы в БД и повесить может только если выделено мало ресурсов/сортировка по не индексированным полям и т.д. На одном из моих проектов MySQL действительно прогибается при запросе SELECT*FROM `banners_views` ORDER BY `id` ASC LIMIT 708180, 30 хотя id — primary auto increment. Это на шаред-хостинге. В оптимизации БД я, честно, не силен
0
keltanas #
Может попробовать убрать ORDER BY?
0
Shvonder #
Можно, но от этого страдает функциональность. Юзеры не смогут сортировать таблицу по требуемым полям, а это часто бывает нужно
0
Shvonder #
Да, индексы я пока добавляю вручную. Пока индексная только первая колонка (автоматически). Сортировка есть, посмотрите последний скриншот. Насчет вашей задачи: в любом случае придется либо перекрывать наборы для каждой ветки, либо заводить 2 таблицы, даже если не будет подобного редактора. У меня была абсолютно такая же проблема, но веток было штук 10. Тут есть разные решения, первое, создать отдельно таблицу свойств и таблицу связей и тогда каждому товару можно будет назначать неограниченное количество свойств через таблицу связей. Второе, можно перекрыть наборы. Для этого редактор умеет скрывать те поля которые не относятся к данной рубрике. Я приводил пример с аукционом в статье. То есть выбрал одну ветку — и редактор показал только те свойства товаров которые к ней относятся.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
0
Bupyc #
А в чем ядовитость? В том что этой системой воспользуется «дебил», так для обычных пользователей просто ограничить доступ в административную часть этой админки.
0
Shvonder #
Я отвечу на ваши вопросы.

Я никому не навязываю использовать мой редактор. Я лишь хотел узнать отзывы о самой идее. Ссылку выложил только по просьбе читателей. Эта система не для дебилов, о которых вы пишите. А тот, кто будет пользоваться сайтом конструктор данных никогда не увидит. А с редактором данных можно максимум очистить таблицу как и в любой CMS. Про безопасность я тоже помолчу, буду орать когда взломают.

>> Предлагали использовать XML, делать таблицу с атрибутами сущности
Вы о чем вообще?

И не переживайте за РБД, ничего с ней не станет. Формируются самые обычные запросы и создаются самые обычные таблицы. индексы правда приходится пока руками добавлять, но это поправимо.
+1
tarantul85 #
Да уж. Но всё таки это хороший вариант попытки написания универсальной админки.
0
aleXoid #
Когда-то видел систему, которая строила админку любой сложности по XML-файлу с подробным описанием всех необходимых данных для редактирования, ключая все возможные связи и т.д. Использовалась для управления буржуйской соцсетью.

В целом штука интересная, спасибо за работу. Не хватает только возможности передавать параметру своим типам данных. Например, чтобы было поле, которое хранит адрес картинки, а саму картинку хранит на жестком диске и при этом изменяет размер. Будет время, попробую доработать, введя доп. возможности передавать параметры в том же YAML. Если интересно — могу сбросить, что получится в результате
0
aleXoid #
Извините, не достаточно покапался, оказывается у Вас это уже есть =)
0
ChemAli #
У меня есть пара старых сайтов на проприетарных фреймворках с до того кривыми админками, что часто их проще обновить через БД :) Ваше решение будет весьма кстати.
0
Shvonder #
Да пожалуйста :) Только у вас могут возникнуть вопросы по свойствам некоторых полей (связи таблиц особенно). Пишите, помогу. Привязать редактор к уже существующей базе не сложно. Просто создайте идентичную таблицу в конструкторе под другим именем, скопируйте в нее наполнение, удалите старую таблицу, а созданную переименуйте в старую. Хотя, вы бы и сами догадались
0
malahov #
Автор, где же вы раньше были! В моей практике это бы очень упростило работу.
Спасибо, хотелось бы следить за развитием, это как то возможно?
0
Justo #
Metric Optimizer CMS.
Мы проектировали его еще в 2002 году. Конфигуратор позволяет создать любой документ, создавая набор полей и связей. Далее контент публикуется через админскую часть. Все новое — хорошо забытое старое.
0
AigizK #
Такой вопрос, у вас есть возможность автоматически добавить новые фильтры и выставлять между ними условия И(и скорее всего там есть ИЛИ). Как будет выглядит такой запрос:
… where (Id in(1,2,3,4) and Text='test') or (Id=5)

т.е. когда есть операции И, ИЛИ и важна последовательность
0
Shvonder #
Нет, к сожалению там нельзя так делать. Есть И ИЛИ -> Равно, Не равно, Содержит, Не содержит, Больше меньше
Я думал над более сложными фильтрами, но решил что обычному пользователю вряд ли понадобятся такие сложные запросы
+1
bO_oblik #
Типы контента уже сто лет есть на друпал.
0
Shvonder #
Дайте ссылку, я посмотрю о чем вы. Мне кажется мы о разном
0
bO_oblik #
Модуль для Drupal — CCK позволяет управлять полями типов контента.

К примеру создаем новый тип фотография, настраиваем поля: имя|поле загрузки|описание. Готово!

И все доступно из коробки и настраивается очень просто, хотя друпал я не очень люблю.
0
XeNum #
В Netcat аналогичное решение, только называются компоненты. Создаем компонент, пишем какие поля и типы нужны.
0
zIs #
Огромное спасибо вам за материал. Сам уже давно работаю над похожей системой и тоже в далеких планах хотел переехать на ExtJS.
А могли бы вы разместить эти материалы на каком-нибудь ресурсе типа sourceforge или code.google? Думаю, многим было бы интересно следить за обновлениями, а может, и принять участие, если вам это нужно.
0
Shvonder #
Я хотел с кем нибудь над этим работать, но пока не нашел, с кем. Мало кто поддерживает идею создания подобной штуки. Если интересно, пишите в личку
0
Shiz #
вы изобрели scaffold
+2
claustrofob #
может, пора уже делать админки для людей, а не для роботов?
0
Shvonder #
Может быть. Я подумаю
0
mac2000 #
видел чтото похожее, но там при генерации форм использовались имена полей таблцы

мне вот интересно как вы решили вопрос с расширением редакторов, то есть у вас есть базовый набор (текст. тини, рисунок и т.п.) а как быть человеку которому нужно что то хитрое?
0
Shvonder #
Там каждый тип данных описан отдельным классом. У каждого класса есть методы отвечающие за отображение, редактирование, сохранение, удаление. Нужно просто написать еще один класс.
0
mac2000 #
а если к примеру нужен редактор который будет править сразу два поля, к примеру google maps latitude и longtitude — тоесть редактор один, а поля в таблице два
0
Shvonder #
На самом деле все зависит от класса. Как вы там опишите. Вы можете там хоть десять полей таблицы связать. Можно вообще не связывать с БД, а брать из текствого файла. Это ж редактор не только БД. У меня там есть тип «Ссылка с другой таблицы» который может показывать например сколько есть объявлений в текущей рубрике. Этот тип вообще не имеет своей колонки в таблице, он просто считает количество ссылающихся строк с другой таблицы и отображает их. Посмотрите исходники res/php/data_types/
+1
egorinsk #
Типичные ошибки начинающих программистов:

1) Попытка сделать возможность создавать/изменять таблицы (модули, шаблоны, компоненты сайта) чере веб-интерфейс. Это дурь. Для этого существуют редакторы кода, поверьте в них это быстрее, удобнее, и дает больше вохможностей.
2) Попытка всю админку сделать набором однотипных таблиц (ну это еще простительная ошибка)

Этой болезни к слов не смогли избежать и разработчики того же Друпала, и абсолютно невменяемых штук вроже TYPO3, проблема только в том что действительно удобный административный интефейс так не создать. Юзабилити у вас, судя по картинкам, адское.
0
Shvonder #
Я не начинающий программист. Таблицы пока что однотипные, но это одна из первых версий редактора. Позже будет настраиваемый интерфейс форм. Что плохого, в том, чтобы изменять таблицы через веб-интерфейс? А насчет быстрее, я вам не верю, я ж писал, что не просто так это сделал, я пробовал оба варианта. Готов поспорить, что админку, допустим для новостного сайта с фотогалереей с заранее неизвестным функционалом я сделаю быстрее вас. Насчет юзабилити. Много людей пользуются моим редактором и никто еще не жаловался. Даже обучать хватает 10 минут, ведь каждый раздел сайта наполняется через однотипные формы.
0
egorinsk #
Потому, что изменение модели данных через код 1) дает больше возможностей (написать можно все, что угодно, а вот через веб-интерфейс так не сделаешь) 2) редактор кода по моему удобнее, нет?

> Насчет юзабилити. Много людей пользуются моим редактором и никто еще не жаловался. Даже обучать хватает 10 минут, ведь каждый раздел сайта наполняется через однотипные формы.

Мне внешний вид не нравится.
В вашей админке есть свойство например для обеспечения уникальности значений? Ограничения для проверки например правильности ввода email? Можно ли удалять автоматически приложенные файлы при удалении записей? Связывать таблицы?
0
Shvonder #
Есть свойство для уникальности, правда только первая колонка
Есть проверка на валидность
Файлы удаляются
Таблицы связываются, но связанные записи пока не удаляются при удалении родительских. Это все поправимо
0
egorinsk #
Чистка HTML-кода? А если надо несколько превьюшек разных размеров? И сохранять оригинальное фото?

Фильтр просто по слову есть? Без этих заморочных форм?

Насчет того, что можно делать быстрее — тут я даже спорить не буду. Рад за вас.
0
Shvonder #
Ладно, давайте не будем спорить :)
Спасибо за ваше мнение. Идеальный инструмент все равно не создаст никто. Совершенству нет предела. Всегда можно будет найти что то, чего не хватает
0
egorinsk #
Ах да (что то меня аж на несколько комментариев расперло), как можно «фотогалерею» сделать через обычные таблицы, как у вас на картинке? Неудобно же? там нужен индивидуальный интерфейс, например с возможностью загрузить много фотографий разом, группировать их как-то, подписывать (+ например добавить ссылки на модерирвание комментариев).
0
summerisgone #
Я не специалист по plone, но по-моему это оно. Уверен то, что написано, было нужно и написано не зря, но я в последнее время всё больше убеждаюсь в том, что несложные сайты возьмут на себя ребята вроде ucoz или Google sites, а для сложных* визуальный редактор БД только повредит.
_____
* Под сложными я имею в виду те, что разрабатываются с нуля под конкретный проект или заказ.
0
Shvonder #
Спасибо. Если честно, я тоже в этом убеждаюсь, но продолжаю делать сайты с этим редактором. Наверное я лентяй

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.