<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1474859558012829398</id><updated>2012-02-27T11:02:07.484-08:00</updated><category term='Вести с полей'/><title type='text'>Блог разработчика CMS E5</title><subtitle type='html'>Принципиально новый фреймворк, дря разработки веб-приложений и обслуживания сетей сайтов.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-2856373534808854594</id><published>2012-02-27T11:02:00.000-08:00</published><updated>2012-02-27T11:02:07.492-08:00</updated><title type='text'>Функция автоперевода гугл не работает</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Связано это с тем, что с декабря 2011 года гугл изменил свой API, и теперь использование сервиса переводов платное. Необходимо привязывать эккаунт гугл к вызову библиотеки гугл и по завершению максимально разрешённого числа запросов сервис перестанет работать (хотите больше запросов - платите). Вот так всё печально. В Е5 механизм автоперевода будет осуществляться засчёт парсинга самого сайта translate.google.com, благо этот механизм уже отлажен.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-2856373534808854594?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/2856373534808854594/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2012/02/blog-post_27.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/2856373534808854594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/2856373534808854594'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2012/02/blog-post_27.html' title='Функция автоперевода гугл не работает'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-5767776423592245932</id><published>2012-02-20T07:15:00.000-08:00</published><updated>2012-02-20T07:15:49.481-08:00</updated><title type='text'>Новый тип полей - папка с файлами</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;В качестве решения избыточных проблем с обновлением шаблонов, пришла идея о создании нового типа поля - папка.&lt;br /&gt;&lt;br /&gt;Таким образом, мы можем просто добавить к таблице шаблонов новое поле "папка", в которой указать "участвует обновлении", "не дублируется при дублировании строки".&lt;br /&gt;&lt;br /&gt;Затем, при добавлении шаблона мы просто указываем папку через обычный файловый редактор elFinder (хотя на самом деле я считаю что это лучший редактор, хоть и немного бажный). Тем более, что через него доступ папки будет согласован с правами текущего пользователя.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-5767776423592245932?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/5767776423592245932/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2012/02/blog-post_20.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/5767776423592245932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/5767776423592245932'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2012/02/blog-post_20.html' title='Новый тип полей - папка с файлами'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-6354675314064218714</id><published>2012-02-19T06:33:00.000-08:00</published><updated>2012-02-19T11:08:53.721-08:00</updated><title type='text'>Промежуточные итоги</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-OHCeq8nVO7Y/T0EIJCkQAEI/AAAAAAAAAHc/ZXAnWzTD1H8/s1600/images.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-OHCeq8nVO7Y/T0EIJCkQAEI/AAAAAAAAAHc/ZXAnWzTD1H8/s1600/images.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;Итак, прошло чуть больше года с тех пор, как я начал активно эксплуатировать систему E5.&lt;br /&gt;&lt;br /&gt;Какие аспекты тестирования хотелось бы отметить?&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;1. &lt;b&gt;Обычные пользователи не могут использовать систему &lt;/b&gt;от начала и до конца, т.к. она до сих пор не содержит в себе пакета шаблонов (скачивая систему вы вообще ничего не получаете, только одно ядро, затем можно загрузить модули из интернета, но не шаблоны)&lt;br /&gt;&lt;br /&gt;2. &lt;b&gt;В уже установленной и настроенной системе с лёгкостью разбираются все&lt;/b&gt; от мала до велика (речь идёт об инструментах для управления контентом). Удобство управления особо порадовало тех, кто ранее пользовался системой Е3. Здесь нет замудрёных элементов управления - всё базируется на интерфейсе PhpMyAdmin (табличное представление данных с специальным функциональным столбцом). Я был приятно удивлён, когда узнал, что один из моих клиентов полностью разобрался в системе без чьей либо помощи.&lt;br /&gt;&lt;br /&gt;3. &lt;b&gt;Система крайне удобна с точки зрения управления информацией&lt;/b&gt;. Межсайтовый перенос данных, экспорт, отложенная активация, встроенные парсеры - всё это делает работу с данными сплошным удовольствием. Также радует работа с шаблонами, если Вы изучите язык шаблонизатора Е5, то разработка шаблонов и модулей превратится в одно сплошное удовольствие (по крайней мере до тех пор, пока вы не перепутаете [ с {). Я планирую сделать систему ещё удобней - встроить мастер распределения доступа (сейчас групповой доступ распределяется достаточно сложно), визуальный редактор модулей и мастер создания сайтов. Кроме этого планируется переработать главную страницу модуля и сделать сортировку и фильтрацию в таблице данных, а также сделать возможность отката изменений.&lt;br /&gt;&lt;br /&gt;4. &lt;b&gt;Одна система может поддерживать большое количество самых разнообразных сайтов&lt;/b&gt; и предоставлять к ним широко настраеваемый доступ. Фактически, вы можете поставить одну систему двум клиентам и ни один из них не будет догадываться о существовании другого. Также доступы весьма удобны, когда речь идёт о совместной работе с сайтом сразу нескольких людей. Одному человеку можно предоставить доступ для работы над продвижением сайта, другом - для написания статей на сайте, третьему - только для проверки этих статей.&lt;br /&gt;&lt;br /&gt;5. &lt;b&gt;Скорость работы с админкой заметно ниже, чем в системе Е3&lt;/b&gt;, но в тоже время намного быстрее, если сравнивать с работой того же ShopScript. Но оно и понятно - работы по оптимизации административной части ещё не велись, упор сейчас делается на оптимизацию шаблонизатора. И в этом смысле мы находимся в проигрыше перед тем же Smarty, т.к. Smarty единовременно компилирует PHP файл на основе шаблона, который, затем, просто исполяет. У нас же компиляция шаблона происходит каждый раз, при его вызове, т.к. шаблоны настолько сложны, что их компиляция в PHP файл будет выдавать файлы, размер которых будет соизмерим с размерами самой системы. Конечно, есть продвинутые алгоритмы кеширования, но кеш как правило остаётся жёстким, т.е. полностью удаляется тогда, когда меняются данные, задействованные в шаблоне.&lt;br /&gt;&lt;br /&gt;6. &lt;b&gt;Скорость работы самой системы в среднем составляет 0.5 секунды&lt;/b&gt;. Это достаточно хороший результат для фреймворка, работающего через собственный интерпритатор. Было разработано свыше десяти систем кеширования и оптимизации. Вы можете использовать жёсткий SQL-кеш, кеш структуры шаблонов, кеш функций. Кроме того, некоторые шаблоны принудительно используют кеширование. Интерпритатор научился угадывать возможные запросы к базе данных и совершать их заранее, таким образом было уменьшено кол-во запросов к БД на некоторых сайтах с 400 до 100. Положительным моментом является то, что один простой хостинг (с одной БД и одной папкой на все сайты) может держать до 100 сайтов (суммарная информация на которых достягает 50млн символов, а среднесуточная посещаемость колеблется от 20 до 100 посетителей на 1 сайт).&lt;br /&gt;&lt;br /&gt;7. &lt;b&gt;Удобство разработки модулей&lt;/b&gt; является самой важной особенностью системы. Фактически, я могу приехать к клиенту, получить от него задание на переработку фотогалереи или же на разработку нового модуля (например "меню столовой", так, чтобы у каждого элемента мог быть целый набор фотографий, возможен переход на элемент с доступом к расширенной информацией, комментариями и т.д.). И сразу же после получения задания, я могу сесть за компьютер клиента, зайти в админку под правами суперюзера и за пару минут он получит готовый модуль. Более того - мы сразу же сможем его доработать. С каждым месяцем я всё больше наращиваю базу компонентов, для разработки модулей. Надеюсь, что скоро, разработка даже самых сложных модулей будет отнимать считанные минуты.&lt;br /&gt;&lt;br /&gt;8. &lt;b&gt;Удобство работы с шаблонами&lt;/b&gt;. Замучались работать с WP-TEMPLATES? Замучились разгребать тысячи файлов shop-script? Тогда Е5 - для вас! (прям по-рекламному получилось :) Сейчас весь шаблон для сайта состоит из нескольких полей - шаблон сайта, шаблон блоков для сайта и поля "таблица стилей CSS" (чтобы уж совсем лишить себя необходимости хранить что-то, что может часто редактироваться в файлах). Ещё планируется ввести "шаблон навигации". Картинки для шаблона хранятся в произвольном месте, в принципе, их можно также загружать через административную часть. Далее, вы можете настроить отдельные шаблоны для различных модулей - для фотогалереи, статей, интернет-магазина. При этом совсем не обязательно каждый раз создавать новый шаблон, вы можете просто сгруппировать уже существующие шаблоны. Таким образом, разработка нового шаблона сводится к скидыванию вёрстки (я верстаю через DreamViewer) и картинок в систему. Инсталляция шаблона заключается в вставке пары значений в тело шаблона. На самом деле, вам просто нужно подвести курсор к нужным местам шаблона и нажать на соответствующую кнопку внизу редактора (тут будет у нас "контент", а здесь будет "навигация" и т.д.) Это дело двух минут. Проводились эксперименты, когда весь сайт с нуля создавался за 1 час. При этом большая часть времени затрачивалась для рисования шаблона в фотошопе и его вёрстки в DreamViewer-е.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-6354675314064218714?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/6354675314064218714/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2012/02/blog-post_19.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/6354675314064218714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/6354675314064218714'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2012/02/blog-post_19.html' title='Промежуточные итоги'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-OHCeq8nVO7Y/T0EIJCkQAEI/AAAAAAAAAHc/ZXAnWzTD1H8/s72-c/images.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-2011656968532013397</id><published>2012-02-11T14:42:00.000-08:00</published><updated>2012-02-11T14:42:54.934-08:00</updated><title type='text'>Нагрузочные тесты системы</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-j_NmXZraRnk/Tzbu4yDhuiI/AAAAAAAAAHU/5Uwz5yL23W0/s1600/102263440.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="198" src="http://3.bp.blogspot.com/-j_NmXZraRnk/Tzbu4yDhuiI/AAAAAAAAAHU/5Uwz5yL23W0/s320/102263440.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;В данный момент, Е5 проходит ряд нагрузочных испытаний. Тестам подвергся шаблонизатор. Какие итоги можно подвести?&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Во-первых&lt;/strong&gt;, система one-time кеширования функций потребляет много оперативной памяти, из-за специфичного устройства массивов в PHP (где для каждого ключа создаётся хеш). Кеширование необходимо из-за многократного использования основных функций текстового процессора (деление строки, поиск в строке с учётом тегов, выделение текста из тегов). Даже в неочень сложных проектах, вызов одной функции может доходить до нескольких тысяч раз. Кеширование минимизирует расходы процессорного времени, однако съедает ОЗУ.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Во-вторых&lt;/strong&gt;, система всё ещё плохо работает со строками. Сейчас я занялся глубоким дебагам системы, на выявление самых тяжёлых мест в коде. Был переписан ряд функций, но результат всё равно остался неудовлетворительным. Возможно, я введу полную компиляцию шаблона в некий аналог PHP кода, который будет содержать прямые инструкции по обращению в БД. Но что-то мне подсказывает, что управляемые шаблоны тем и отличаются от того же Smarty, что их невозможно скомпилировать в исполняемые php файлы. Или же получившаяся компиляция не будет уступать по объёму исходный код самого шаблонизатора.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;В-третьих&lt;/strong&gt;, я подсмотрел на хабре сравнение Smarty и Twig-а, и решил провести аналогичные тесты. 2ой тест (вывод 10 полей из 10000 элементов массива) Е5 отработала аж за целых 45 секунд. Конечно же это никуда не годится и я буду это исправлять. А вот 1ый тест (вывод 10000 переменных) Е5 выполнила за тот же временной интервал, что и Smarty (16 секунд). Только вот smarty один раз скомпилировал и потом выполняет этот код за сотые доли секунды, а Е5 всегда будет выполнять его по 16 секунд.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-2011656968532013397?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/2011656968532013397/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2012/02/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/2011656968532013397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/2011656968532013397'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2012/02/blog-post.html' title='Нагрузочные тесты системы'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-j_NmXZraRnk/Tzbu4yDhuiI/AAAAAAAAAHU/5Uwz5yL23W0/s72-c/102263440.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-7958191210073085965</id><published>2012-01-19T00:30:00.000-08:00</published><updated>2012-01-19T00:30:46.362-08:00</updated><title type='text'>Новые функции движка</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Для более удобного конструирования модуля я продолжаю добавлять новые языковые конструкции и элементы.&lt;br /&gt;&lt;br /&gt;Для выхода интерпритатора из тела текущей обрабатываемой части модуля, была введена команда [&lt;b&gt;xbreak&lt;/b&gt;]. А команда [&lt;b&gt;break&lt;/b&gt;] теперь будет служить исключительно для выхода из цикла или условий.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Для определения текущей, найденной посредством URL-декодирования, части, теперь служит команда [&lt;b&gt;selpart&lt;/b&gt;], которая вызывается из модуля (например [cm.selpart] - выбранная часть текущего модуля).&lt;br /&gt;&lt;br /&gt;Скорее всего конструктор модулей в бету не войдёт, но вместо него я опубликую репозиторий, содержащий все необходимые команды и логику разработки движка. Причиной тому служит то, что новые команды появляются быстрее, чем я успеваю писать конструктор.&lt;br /&gt;&lt;br /&gt;Тем более, кроме конструктора есть более важные задачи, такие, как &lt;b&gt;дообновление модулей&lt;/b&gt;, &lt;b&gt;обновление таблиц модулей&lt;/b&gt; (например, для загрузки необходимых шаблонов). Хотя именно конструктор выделяет E5 от других подобных систем.&lt;br /&gt;&lt;br /&gt;У меня есть два пути на выбор - сделать систему с уникальным редактором модулей, но при этом без функций, которые имеют большинство современных CMS, либо наделить систему всем необходимыми для нормальной работы функциями, но при этом отложить редактор.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-7958191210073085965?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/7958191210073085965/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2012/01/blog-post_19.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/7958191210073085965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/7958191210073085965'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2012/01/blog-post_19.html' title='Новые функции движка'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-8480184502798394500</id><published>2012-01-17T05:27:00.000-08:00</published><updated>2012-01-17T05:27:52.381-08:00</updated><title type='text'>Добавлена поддержка работы с COOKIES</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-yBqmLwbgU10/TxVwrrSJpbI/AAAAAAAAAHM/xWwD3THppAo/s1600/1306154798_37.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://1.bp.blogspot.com/-yBqmLwbgU10/TxVwrrSJpbI/AAAAAAAAAHM/xWwD3THppAo/s320/1306154798_37.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Добавлено два простых оператора для работы с переменными COOKIES - &lt;strong&gt;cook&lt;/strong&gt; и &lt;strong&gt;cook2&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Теперь &lt;strong&gt;веб-конструтору&lt;/strong&gt; доступна работа с переменными браузера пользователя. Чтение и запись COOKIES работает точно также, как чтение и запись обычных переменных. Единственное чего нет, это ограничения времени жизни. По умолчанию переменная живёт 1 месяц.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Cook&lt;/strong&gt; призвана работать с обычными текстовыми или числовыми переменными, в то время, как &lt;strong&gt;cook2&lt;/strong&gt; работает с массивами и объектами (с массивами &lt;strong&gt;cook&lt;/strong&gt; также справляется, но в этом методе для каждого элемента массива создаётся отдельная переменная в окружении, что делает невозможным удаление всего массива). &lt;strong&gt;Cook2&lt;/strong&gt; работает засчёт сериализации данных.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Возможные варианты использования:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;[cook2.basket[item]=count] &amp;nbsp;- добавит товар item в корзину покупок, в количестве count&lt;br /&gt;[cook2.basket=''] - обнулит корзину&lt;br /&gt;&lt;br /&gt;[if cook2.basket[item]&amp;gt;0] товар находится в корзине [else] товара в корзине нет [/if]&lt;br /&gt;&lt;br /&gt;Вывод товаров для корзины&lt;br /&gt;[tree cook2.basket]&lt;br /&gt;&amp;nbsp; &amp;nbsp;Товар "[index.e5.name]", количество [value]&lt;br /&gt;[/tree]&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-8480184502798394500?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/8480184502798394500/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2012/01/cookies.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/8480184502798394500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/8480184502798394500'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2012/01/cookies.html' title='Добавлена поддержка работы с COOKIES'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-yBqmLwbgU10/TxVwrrSJpbI/AAAAAAAAAHM/xWwD3THppAo/s72-c/1306154798_37.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-6104872590549558188</id><published>2012-01-11T03:41:00.000-08:00</published><updated>2012-01-11T03:56:27.605-08:00</updated><title type='text'>Вести с полей за первую рабочую неделю января</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Итак, что же у нас нового. Начну с последних новостей.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Прикручены отображения &lt;b&gt;CloudyZoom&lt;/b&gt; и &lt;b&gt;Zoomy&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-0ltOsRFaydk/Tw11_ce2BaI/AAAAAAAAAHE/5nx7hbWk8rQ/s1600/kview.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-0ltOsRFaydk/Tw11_ce2BaI/AAAAAAAAAHE/5nx7hbWk8rQ/s1600/kview.png" /&gt;&lt;/a&gt;&lt;/div&gt;для просмотра фотографий в интернет-магазине, который я начал разрабатывать в рамках системы. Плагин &lt;b&gt;Cloudy Zoom&lt;/b&gt; интересен тем, что может увеличивать фотографию прям в миниатюре фотографии. Это очень удобно и прикольно выглядит, но к большому сожалению он не работает с отцентрированными фотографиями.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Плагин &lt;b&gt;Zoomy&lt;/b&gt; ужасно показал себя в IE (куча ошибок, всё отваливается) и вообще очень дёрганая штука. Весь день провёл в попытках заставить работать его с продолговатыми изображениями (ширина которых меньше ширины линзы - раньше плагин или падал на них или отображал их в левом углу линзы, так что и не разглядишь). В итоге были поставлены пару тройку костылей и всё заработало.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Умные блоки&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Меня всё время мучала мысль - а что будет, если в рамках одного модуля мы вызовем блок из совсем другого модуля? Сам вызов блока трудностей не вызывает, а вот его идентификация по URL (например определение текущей просматриваемой статьи) заставляет мозг попотеть. Как например узнать какая статья текущая, если модуль статей ещё небыл вызван (например это левый или верхний блок, который идёт до основной модульной части)?&lt;br /&gt;&lt;br /&gt;Суть:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-Xxvu_T_ang4/Tw10IOLvGoI/AAAAAAAAAG8/t6oFAf45MNI/s1600/sss.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-Xxvu_T_ang4/Tw10IOLvGoI/AAAAAAAAAG8/t6oFAf45MNI/s1600/sss.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;По этому при вызове блока от стороннего модуля, приходится вызывать URL-Detection, для определения текущего элемента вложенного модуля.&lt;br /&gt;&lt;br /&gt;Такая схема работает если мы имеем структуру URL: www.site1.ru/&lt;span style="color: #6aa84f;"&gt;Часть урл от модуля1&lt;/span&gt;/&lt;span style="color: #b45f06;"&gt;Часть урл от модуля 2&lt;/span&gt;. Т.е. блок от второго модуля будет определять текущую строку, даже если его вызвать в первом модуле (до определения 2ой части URL). А вот если между ними будет URL некоего третьего модуля, то такая схема скорее всего работать не будет (я ещё не проверял, т.к. сайты с ткаими сложными структурами ещё не встречались). Меня беспокоит, что такой подход сможет нарушить URL разбор. Особенно в том случае, если URL какой-нибудь фотогалереи совпадёт с URL-категории интернет-магазина.&lt;br /&gt;&lt;br /&gt;После нескольких напряжённых дней работы блоки научились распознавать текущий экземпляр, таблицу и строку своего родного модуля.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Начата разработка интернет-магазина&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Неделю назад я занялся переносом одного крупного интернет-магазина на Е5. Это было рискованное дело, если учитывать тот факт, что модуля магазина на Е5 как такового ещё нет.&lt;br /&gt;&lt;br /&gt;Структуру магазина удалось создать за несколько часов. Виной тому отсутствие возможности подгрузки шаблонов таблиц с сервера и отсутствие шаблонов полей (поля URL транслитерования и миниатюры изображений достаточно долго делать).&lt;br /&gt;&lt;br /&gt;Структура характеристик товара (поля описаний, цена, валюта, префикс валюты, вес, еденицы измерения) добавилась очень быстро. Если бы это делалось на голом PHP, то заняло порядка суток работы. А тут - "тык", "тык", "бац" и готово! Просто настраиваешь нужные связи и всё готово.&lt;br /&gt;&lt;br /&gt;За сутки с небольшим была забита первая тысяча товаров. Скорость заливки товаров медленней, чем это было на Е3. При этом скорость зависит от количества товаров в категории. В начале заполнения всё работает шустро, а когда кол-во доходит до сотни, товар может добавлятся от 3х до 7ми секунд. Видимо, нужно оптимизировать функцию автоматической генерации URL.&lt;br /&gt;&lt;br /&gt;Теперь предстоит бурная работа с аяксом, организация корзины и т.д. Придётся допиливать множество пользовательских функций... Обидно только то, что этот интернет магазин очень привязан к конкретному клиенту. И после его сдачи придётся проделать большую работу по унификации этого модуля.&lt;br /&gt;&lt;br /&gt;Интернет-магазин на Е5 будет бесплатным.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-6104872590549558188?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/6104872590549558188/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2012/01/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/6104872590549558188'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/6104872590549558188'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2012/01/blog-post.html' title='Вести с полей за первую рабочую неделю января'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-0ltOsRFaydk/Tw11_ce2BaI/AAAAAAAAAHE/5nx7hbWk8rQ/s72-c/kview.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-3663198824043789145</id><published>2011-12-31T18:54:00.000-08:00</published><updated>2011-12-31T18:54:07.388-08:00</updated><title type='text'>2011 год закончился. Подведём итоги</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-gsP2RTYQxQU/Tv_DrNSk0kI/AAAAAAAAAG0/IM4gZkv9ZV0/s1600/2012.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="226" src="http://1.bp.blogspot.com/-gsP2RTYQxQU/Tv_DrNSk0kI/AAAAAAAAAG0/IM4gZkv9ZV0/s320/2012.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Во-первых, хотелось бы поздравить всех пользователей системы Е5 с наступившим новым годом и пожелать вам успехов на ниве веб-разработок.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Итак, что же было сделано в 2011 году?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Нужно признаться, что львиная доля разработки (и самые важные шаги) были проделаны осенью и зимой 2010 года. 2011 год стал годом доработок, допиливания и сорвешенствования системы.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;За ушедший год мне не удалось реализовать даже половины идей, которые были нагенерированы в 2010 году. Более того, &lt;strong&gt;to do list&lt;/strong&gt; пополнился парой сотен наименований.&lt;br /&gt;&lt;br /&gt;Из основных нововведений стоит отметить следующие вещи:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Права доступа&lt;/li&gt;&lt;li&gt;Загрузка модулей и компонентов&lt;/li&gt;&lt;li&gt;Инсталлятор&lt;/li&gt;&lt;/ul&gt;В этом году наконец-то родилась концепция визуального редактора шаблонов (которая практически реализовалась, ждём редактор в январе).&lt;br /&gt;&lt;br /&gt;Весь год система обкатывалась на более чем 30 сайтах и с ней успели поработать порядка 50 человек. Были написаны десятки модулей и разных компонентов.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Какие планы на будующий год?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Самое главное - дописать &lt;strong&gt;визуальный редактор шаблонов&lt;/strong&gt;. А также очеловечить систему. Сделать нормальный &lt;strong&gt;дизайн админки&lt;/strong&gt; (с возможностью его выбора, виджетов и локализаций). Допилить &lt;strong&gt;обновления модулей&lt;/strong&gt; и сделать возможность &lt;strong&gt;подгрузки экземпляров&lt;/strong&gt; модулей (для того, чтобы пользователь ставил не "лысую систему", а уже с готовыми шаблонами). И, конечно же, сделать &lt;strong&gt;человеческу справку&lt;/strong&gt; с множеством видео-примеров (и &lt;strong&gt;разнообразные "мастера"&lt;/strong&gt;, облегчающие работу с системой).&lt;br /&gt;&lt;br /&gt;Из второстепенных задач можно выделить добавление &lt;strong&gt;отката дейтсвий&lt;/strong&gt; (просмотр правок строки, возврат удалённых строк). Хотелось бы реализовать возможность &lt;strong&gt;быстрого добавления подтаблиц&lt;/strong&gt; (например, чтобы массив фотографий к новости можно было бы загрузить в процессе добавления самой новости). Просто необходимо сделать &lt;strong&gt;сортировку и поиск&lt;/strong&gt; по столбцам, а также функцию &lt;strong&gt;индексации строк&lt;/strong&gt; для более быстрого поиска (например, для блока "поиск на сайте"). Также важно реализовать возможность импорта-экспорта данных между разными таблицами и системами (&lt;strong&gt;экспорт данных&lt;/strong&gt; в файл, включая все присоединённые файлы). И последнее - добавить наконец &lt;strong&gt;тип полей "группы доступа"&lt;/strong&gt; для решения задач с авторизацией.&lt;br /&gt;&lt;br /&gt;Надеюсь, система не разочарует вас! С наступающими праздниками!&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-3663198824043789145?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/3663198824043789145/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/12/2011.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/3663198824043789145'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/3663198824043789145'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/12/2011.html' title='2011 год закончился. Подведём итоги'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-gsP2RTYQxQU/Tv_DrNSk0kI/AAAAAAAAAG0/IM4gZkv9ZV0/s72-c/2012.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-3868508061873919143</id><published>2011-12-27T03:25:00.000-08:00</published><updated>2011-12-27T03:26:08.045-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Вести с полей'/><title type='text'>Очередная оптимизация Е5 и некоторые новости</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;b&gt;Итак, я опять оптимизировал работу системы&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/--PdSDJjUYUQ/Tvmq_AvWuJI/AAAAAAAAAGo/EcWDM3Ki7JE/s1600/images.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="132" src="http://4.bp.blogspot.com/--PdSDJjUYUQ/Tvmq_AvWuJI/AAAAAAAAAGo/EcWDM3Ki7JE/s200/images.jpeg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;В прошлом сообщении об оптимизации, я кажется упоминал о кешировании схем шаблонов. Оказалось, что обработчик, просматривая длинные шаблоны (например длинные тексты страниц сайтов, на предмет содержания в них виджетов), тратит на это очень много процессорного времени. В текущей сессии (запуске скрипта/загрузки сайта) шаблонизатор сохраняет кеш в спец.массив, который держиться в оперативной памяти до завершения работы скрипта, чтобы два раза не пробегать через весь шаблон.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Кеш представляет из себя массив конкретных действий шаблонизатора, что лишает его необходимости перебирать весь шаблон целиком (а это бывает очень полезно, когда один и тот же шаблон вызывается по 1000 раз за время генерации какой-нибудь страницы прайс-листа / &lt;i&gt;речь идёт о шаблоне вывода товара, как пример&lt;/i&gt;).&lt;br /&gt;&lt;br /&gt;Новая система оптимизации позволяет сохранять этот кеш на жёсткий диск сервера, чтобы вообще не обрабатывать шаблон. Это создаст дополнительную нагрузку при первой загрузке шаблона, однако ускорит все остальные загрузки (а шаблоны меняются очень редко, по сравнению с данными). Эта оптимизация включается опционально в настройках системы.&lt;br /&gt;&lt;br /&gt;На самом деле я разработал её около месяца назад, но тесты выявили её не эффективность, и только недавно я понял, что допустил опечатку в имени переменной кеша. Таким образом, эта технология вообще не использовалась при прошлом тестировании. Исправив досадную опечатку я провёл повторный тест, который выявил 50% повышение скорости генерации сайтов с длинными шаблонами и страницами. Теперь скорость работы движка не зависит от объёмности шаблона.&lt;br /&gt;&lt;br /&gt;Однако в целом скорость работы меня не устраивает. Возможно в этот же кеш шаблона я добавлю все необходимые подгрузки строк и столбцов... Сейчас обычный сайт грузится 0.37с (я уменьшил кол-во запросов к БД, но вероятно из-за этого немного упала скорость и увеличился объем потребления памяти, так для загрузки сайта нужно от 6 до 15мб ОЗУ, а для загрузки некоторых страниц админки - аж 20мб), а интернет-магазин загружается 1.2с&lt;br /&gt;&lt;br /&gt;Эти показатели намного лучше показателей многих современных движков, однако это намного дольше, нежели использование движков на голом PHP. Будем оптимизировать дальше.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="font-size: large;"&gt;Что нового?&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-e1ckxcZTniQ/TvmoEDoTuzI/AAAAAAAAAGc/u9N6V-YHa0o/s1600/Whats-new-logo.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="176" src="http://3.bp.blogspot.com/-e1ckxcZTniQ/TvmoEDoTuzI/AAAAAAAAAGc/u9N6V-YHa0o/s200/Whats-new-logo.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Проверка скорости веб-сервера (E5 SpeedTest)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Проверяется скорость работы процессора, жёсткого диска, СУБД, входящая скорость интернета и (самое важное) исходящая скорость. Скорость отдачи сервера рассчитывается путём передачи клиенту 2мб рандомного кода (таким образом эта скорость никак не может быть выше входящей скорости интернета пользователя). Входящая скорость считается путём загрузки (через соккеты) яндекса, гугла и ютьюба (тупой способ, но он даёт увидеть работает ли вообще загрузка удалённых сайтов).&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Новые функции дебагера&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;Теперь дебагер отображает детальное использование запросов для каждой части каждого модуля. Также он отображает кол-во элементов глобальных массивов и сортирует их по размеру сериализации их данных. Также были убраны ненужные отображения порядка исполняемых частей и порядка подгрузки строк данных.&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Е5 и ЧПУ&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Оказывается, не у всех веб-сервер поддерживает mod-rewrite. И к моему удивлению, оказалось, что большинство CMS умеют работать и без mod-rewrit-а (многие из них разрабатывались ещё до использования ЧПУ в CMS). &lt;b&gt;Е5 совершенно не умеет работать без ЧПУ&lt;/b&gt;. И дело не в разборе адреса. Можно было бы сделать тупо /index.php?url=URL , но вот сама генерация URL-ов при конструировании модулей предполагает именно использование ЧПУ (&lt;i&gt;я же не могу обязать конструкторов модулей делать два варианта модулей? так ведь?&lt;/i&gt;). Есть правда выход в виде неприглядного костыля - обрабатывать выходной код на наличие внутренних ссылок и менять их на index.php?url=URL&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;&lt;b&gt;Трудности установки&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Я столкнулся с некоторыми трудностями при автоматической инсталляции системы (функция "внедрение"):&lt;br /&gt;&lt;br /&gt;1. Многие серверы бреют с доступом к БД при удалённой установки (хотя мне это не совсем понятно, т.к. реально установка проходит не удалённо). На некоторых серверах необходимо в настройках MySQL дать юзеру возможность удалённого управления БД (хотя я всё делал через localhost, не знаю в чём косяк);&lt;br /&gt;&lt;br /&gt;2. Некоторые серверы запрещают функцию ftp_chmode (пришлось дописывать установку нужных прав на устанавливаемой системе, так что теперь ftp_chmode для нас не проблемма);&lt;br /&gt;&lt;br /&gt;3. Для кириллических доменов (при установки системы на них) необходимо указывать их punicode;&lt;br /&gt;&lt;br /&gt;4. На раздающей машине (с которой я устанавливал E5 на другие сервера) в .htaccess была включена строчка &lt;b&gt;SecFilterEngine Off &lt;/b&gt;(отключала фильтр безопасности хостера, который блокировал половину нужных Ajax запросов, в частности мой мульти-аплодер с &lt;i&gt;image-resize on client side&lt;/i&gt;). Из-за этого, после установки система просто отказывалась запускаться (сервер брил меня с 500ой ошибкой, именно из-за этой строчки в .htaccess).&lt;br /&gt;&lt;br /&gt;В принципе, все эти 4 пункта не несут никакой серьёзной проблеммы, а 2ой пункт вообще решаем, т.к. к Е5 подключён модуль трансформации punicod-а (спасибо Matthias Sommerfeld за это).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-3868508061873919143?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/3868508061873919143/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/12/5_27.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/3868508061873919143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/3868508061873919143'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/12/5_27.html' title='Очередная оптимизация Е5 и некоторые новости'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/--PdSDJjUYUQ/Tvmq_AvWuJI/AAAAAAAAAGo/EcWDM3Ki7JE/s72-c/images.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-5121450315688070366</id><published>2011-12-27T02:37:00.000-08:00</published><updated>2011-12-27T02:37:48.924-08:00</updated><title type='text'>E5 и MVC</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-2Ss6EMszp5w/TvmInbgVfXI/AAAAAAAAAGQ/BuFhysENhcM/s1600/209788-unitmobileconstvehic.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="308" src="http://1.bp.blogspot.com/-2Ss6EMszp5w/TvmInbgVfXI/AAAAAAAAAGQ/BuFhysENhcM/s400/209788-unitmobileconstvehic.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;Сейчас модно стало писать CMS на базе принципов, заложенных в MVC. Изложу этот принцип в трёх словах: Модель, Контроллер, Представление (браво! я гений! апплодисменты мне!).&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;А если быть серьёзными, то в случае с MVC весь движок делится на 3 части - работа с данными (модель), логика программы (контроллер) и шаблоны вывода (представление). Как это может выглядеть на примере? Административны модуль работает с данными, клиентская часть обрабатывает данные и засовывает их в шаблон вывода. Итого мы получаем готовый сайт.&lt;br /&gt;&lt;br /&gt;Я считаю, что для большенства решений в сфере веба, использовать MVC можно только через различные костыли. Т.е. эта модель хорошо подходит для реализации специфичного веб-проекта, но не для такого поточного решения, как CMS. Такое моё мнение объясняется тем, что зачастую приходится делать дополнительные связи между представлением и самими данными.&lt;br /&gt;&lt;br /&gt;Например, мы решили сделать мультидоменную CMS на базе MVC. Сделали движок (MC) и написали шаблоны (V). Если у нас один сайт и один шаблон - проблем нет. Просто установили движок, выбрали шаблон и работаем. А теперь представим, что сайтов у нас 100 и на половине из них разные страницы используют разные шаблоны вывода. Как быть? Придётся привязывать V к M, делать дополнительные таблицы, которые связывали бы страницы сайтов с шаблонами. Дак почему бы в эту таблицу связей вставлять не ссылку на локальный физический файл шаблона, а сам код шаблона? Таким образом V превращается в M. При этом с логической точки зрения, это выглядит как MVC, но при этом V является частью M.&lt;br /&gt;&lt;br /&gt;В Е5 шаблоны создаются в виде таблиц и являются такими же данными, как и всё остальное в системе. Более того, содержание некоторых элементов (например текста страниц) само по себе является шаблоном, т.к. позволяет включать в себя разнообразные виджеты и модули. Признаюсь, это и удобно и неудобно одновременно. Поскольку в Е5 шаблоны являются также элементами управления (ещё одна вещь, которая отдаляет Е5 от классической MVC), то большенство частей некоторых модулей просто занимаются тем, что вызывают тот или иной шаблон. В итоге в модулей только одна таблица используется для хранения данных и 50 для хранения шаблонов (или 1, но с 50ю полями).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Какие плюсы такого подхода&lt;/strong&gt;?&lt;br /&gt;&lt;br /&gt;1. &lt;strong&gt;Комбинирование шаблонов&lt;/strong&gt;. Мы можем использовать группу шаблона, а можем отдельно взять шаблон корзины товаров и сопоставить его с шаблоном вывода товара магазина (для интернет магазина). Хотя такое решение возможно и на базе MVC, но реализация внешней перегруппировки шаблонов между собой (на уровне C) дело тяжёлое.&lt;br /&gt;&lt;br /&gt;2. &lt;strong&gt;Манипуляции с шаблонами&lt;/strong&gt;. Поскольку шаблоны являются такими же данными, как и любые другие данные в системе, для них доступны все теже манипуляции. И речь сдесь не о банальном клонировании или межэкземплярности.&lt;br /&gt;&lt;br /&gt;В Е5 вы можете присоеденить параметр "шаблон" к модулю или к таблице (например "шаблон сайта такого-то" или "шаблон страницы такой-то). Затем, вы решите что одни и те же страницы должны показываться в разном дизайне разным группам пользователей. И сделаете второй параметр "Шаблон для зарегистрированных пользователей", который также привяжите к таблице шаблон.&lt;br /&gt;&lt;br /&gt;Можно делать подшаблоны, в таблицу шаблонов можно сделать подтаблицу фотографий, куда пихать все фотографии, используемые в шаблоне и т.д.&lt;br /&gt;&lt;br /&gt;Конечно я очень путанно описал эту возможность, но поверьте - она экономит массу времени и сил. Часы работы и постоянное решение логических неувязиц (путём включения дополнительных таблиц и полей), которые понадобились в обычной CMS заменяются на &lt;strong&gt;комфортное пятиминутное конструирование в E5&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;3. &lt;strong&gt;Разделённое и совместное использование шаблонов и HTML-верстальщики&lt;/strong&gt;. Благодаря гибкой системы конструирования структур данных в Е5 вы сможете назначать шаблоны как Вам заблагорассудится. Можете сделать общий шаблон для всех страниц одного сайта или же один шаблон на 5 сайтов. При этом каждая отдельная страница сайта может обладать своим шаблоном, также как и страница 404 ошибки.&lt;br /&gt;&lt;br /&gt;Вы можете сделать так, чтобы в одно время суток показывалась одна группа шаблонов (или шаблоны с параметром "только днём"), а в другое время - с параметром "только ночью". Можно сделать возможность посетителям самим менять шаблон для сайта и сделать разные шаблоны для разных групп пользователей. При этом &lt;strong&gt;всё это делается в рамках самого движка Е5&lt;/strong&gt; без всяких шаманских обрядов с кодом.&lt;strong&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Если на одном сервере вы держите целую сеть сайтов (например, вы руководитель веб-студии), то вы можете сделать отдельную группу верстальщиков, которые будут иметь доступ к редактированию шаблонов.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Какие минусы такого подхода&lt;/strong&gt;?&lt;br /&gt;&lt;br /&gt;Минусом естественно является немного непонятная логика процесса. Получается, что V в Е5 является частью M и может выполнять функцию C (синтаксис для C и V одинаков, также как и набор решаемых задач). Так, один шаблон может просто выводить сайт, а другой при этом активно работать с данными (например включать в себя анонсы новостей, хотя лучше это делать на базе системы блоков сайта). Единственное различие View от Controller в Е5 в том, что может быть несколько View на один Controller.&lt;br /&gt;&lt;br /&gt;Есть сейчас в Е5 такой пример. Это модуль "Статьи", а конкретно его функций вывода списка статей. В блоке Controller (в теле части "вывод списка") содержится только фраза cex.tpl.shell (запустить шаблон текущего экземпляра модуля). А уже в самом шаблоне содержится и сама сортировка статей и т.д. Т.е. по сути вообще нет необходимости в части "вывод списка". Почему именно так? Да потому что на одних сайтах статьи нужно выводить по дате их написания, в других случайным образом и т.д. И всё это должен делать один модуль. По этому многие задачи ложаться на сам шаблон, а вот контроллеру не достаётся ничего. Сторонники MVC сказали бы, что в данном случае нужно отдельно писать C и V, но зачем?&lt;br /&gt;&lt;br /&gt;Вообще изначально C от V стали отделять для удобства верстальщиков. Но в Е5 синтаксис шаблонизатора использовать не обязательно. Верстальщик может воспользоваться визуальным редактором шаблонов (который сейчас в разработке). Он вообще не подразумевает никакого ковыряния в коде и на нём можно писать как View, так и Controller.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Как я хотел переделать Е5 под MVC&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Буквально сегодня, идя по улице, покрытый мокрым снегом с ног до головы, я размышлял над тем - а не сделать ли отдельно View для Е5? Т.е. такие виды частей, которые отделялись бы как View и которые имели бы разное содержание в зависимости от выбранного экземпляра модуля. Но я пришёл к тому же выводу, что и описал в этой заметке - это не практично и пришлось бы вставлять много костылей, чтобы заставить веб-проекты работать на MVC.&lt;br /&gt;&lt;br /&gt;В частности, пришлось бы делать возможность привязки содержимого части модуля к экземпляру, и возможность привязки экземпляра части (а это может быть не тоже самое, что экземпляр модуля) к строке данных (например к странице сайта). И в итоге мы получим всё тоже самое, что и имеем на текущий момент, только в красивой обёртке (но внутри всё изувеченное, с кучей костылей). Возможно я ограничусь введением галочки для таблиц "таблица шаблонов". Просто чтобы она висела отдельно от основных таблиц... но надо ли оно?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Резюмируем&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Я разрабатывал Е5 не на базе MVC (а на базе &lt;strong&gt;своих представлений о веб-разработке&lt;/strong&gt;), однако вы можете использовать модель MVC в создании своих модулей в Е5. Более того, я не представляю использование MVC для разработки поточных веб-приложений, имеющих сложную логику (примеры выше).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-5121450315688070366?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/5121450315688070366/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/12/e5-mvc.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/5121450315688070366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/5121450315688070366'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/12/e5-mvc.html' title='E5 и MVC'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-2Ss6EMszp5w/TvmInbgVfXI/AAAAAAAAAGQ/BuFhysENhcM/s72-c/209788-unitmobileconstvehic.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-7346983877651762553</id><published>2011-12-21T12:20:00.000-08:00</published><updated>2011-12-21T12:20:54.190-08:00</updated><title type='text'>Как установить систему управления содержанием Е5</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;В &lt;a href="http://rucms.blogspot.com/2011/12/php-self-extractor.html"&gt;предыдущем сообщении&lt;/a&gt; я уже рассказывал о том, как можно установить систему напрямую - без обращения к FTP.&lt;br /&gt;&lt;br /&gt;Теперь мы поговорим об &lt;strong&gt;обычной "ручной" установке&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-gaRrHDKIKZ4/TvI5IA-NCHI/AAAAAAAAAGE/RXm_EdDIrFE/s1600/promotion1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="264" src="http://4.bp.blogspot.com/-gaRrHDKIKZ4/TvI5IA-NCHI/AAAAAAAAAGE/RXm_EdDIrFE/s320/promotion1.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Шаг 1&lt;/strong&gt;. Для начала нам необходим сам файл инсталлятора. Пока система не прошла бета-тестирование получить файл можно будет только по запросу на этот почтовый ящик: nerd220@rambler.ru&lt;br /&gt;&lt;br /&gt;Те, кто уже получил файл и установил систему, могут компилировать установщик из раздела "внедрение". Для этого необходимо создать зону обновлений (виртуальный адрес, на который будут обращаться потомки в поисках обновлений).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Шаг 2&lt;/strong&gt;. Закачиваем файл в папку веб-сервера и заходим на связанный с ней домен (например test1.ru). В появившемся окне видим успешно ли распакована система, и (если всё хорошо), заполняем реквизиты MySQL.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Шаг 3&lt;/strong&gt;. Далее нас направляет в меню обновления, где предлагается загрузить необходимые модули (сама система абсолютно лысая и содержит в себе только движок и изображения для админки).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Рекомендуется загрузить модули&lt;/strong&gt;: Содержание, Статьи и все предлагаемые компоненты (вместе со статьями вам загрузятся комментарии и фотогалерея). Загрузка продлится от 30 до 60 секунд.&lt;br /&gt;&lt;br /&gt;Если с первого раза загрузить все компоненты не удалось (например, на вашем сервере установлен маленький тайм-лимит для php-скрипта), то попробуйте загрузить их в 2 этапа. Больше всего будет загружаться CKEditor с его файловым редактором ElFinder (который поддерживает права доступа к папкам, задаваемые системой).&lt;br /&gt;&lt;br /&gt;В обновление не входят таблицы шаблонов, по этому делать шаблоны для сайта, статей и фотогалереи первое время предётся делать самостоятельно, либо запросить у меня. Естественно, в планах сделать возможность загрузки всей нужной информации вместе с модулями (сейчас загружаются только связанные с компонентами физические файлы).&lt;br /&gt;&lt;br /&gt;В принципе, я только что придумал как можно реализовать такую схему самым простым способом. Для этого разработчик модуля будет указывать таблицы, участвующие в обновлении. Для этих таблиц будут доступны два дополнительных поля - "участвует в обновлении" и "связный каталог" (где, например, будут лежать все картинки для дизайна шаблона". &lt;em&gt;Отдельную таблицу данных под это заводить не надо (также как и отдельного поля). Лучше использовать таблицу row_values с отрицательным значением value_row и с путём к папке вместо value_value.&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Шаг 4&lt;/strong&gt;. Указываем логин и пароль для главного администратора (в настройках), там же задаём установки крон таба (запуск по крон-табу хостинга, или запуск вместе с запуском системы, например, при заходе посетителей на сайт).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Шаг 5&lt;/strong&gt;. Создаём экземпляр базового модуля. Например, в основе сайта у нас будет модуль "&lt;strong&gt;Содержание&lt;/strong&gt;". Преходим в него и создаём новый экземпляр, который назовём "&lt;strong&gt;Сайт 1&lt;/strong&gt;" &lt;em&gt;(если к моменту прочтения вами этого сообщения я не ввёл возможность прямой загрузки шаблонов, то вначале придётся добавлять шаблон)&lt;/em&gt;. После этого мы можем создавать страницы на сайте и привязывать их к другим модулям (у которых вначале также нужно создать экземпляры).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Шаг 6&lt;/strong&gt;. Далее создаём зону для нашего домена и её зеркало с www (если это необходимо). Зону сразу же привязываем к нашему модулю "&lt;strong&gt;Сайт 1&lt;/strong&gt;".&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Та-да! Сайт готов.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Естественно у многих вызовет вопрос "&lt;strong&gt;почему так много орфографических и пунктационных ошибок в этом тексте!&lt;/strong&gt;", но я и не претендую быть грамотеем. Поверьте - в моём PHP коде их намного больше ;)&lt;br /&gt;&lt;br /&gt;А если серьёзно, то многие не поймут что такое экземпляры, зоны и как же всё таки добавлять шаблоны. В дальнейшем я сделаю &lt;strong&gt;более удобный интерфейс&lt;/strong&gt; административной части, добавлю больше вспомогающих блоков и &lt;strong&gt;запишу видео&lt;/strong&gt; по каждому этапу.&lt;br /&gt;&lt;br /&gt;Плюс - укомплектую начальный пакет установщика всеми необходимыми модулями, шаблонами и картинками. И пускай первый экземпляр будет создаваться при установке модуля, ведь не всем нужен второй ;) Также и зона сразу будет привязываться к установочному домену автоматически (как это сейчас происходит с зоной админки) и связываться с модулем "Содержание" (это будет опционально - при компиляции пакета установщика).&lt;br /&gt;&lt;br /&gt;Вот такой я обещатель. Уже можно отдельно сайт открывать, на котором размещать только "&lt;strong&gt;то, что должно быть в Е5&lt;/strong&gt;".&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-7346983877651762553?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/7346983877651762553/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/12/5.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/7346983877651762553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/7346983877651762553'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/12/5.html' title='Как установить систему управления содержанием Е5'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-gaRrHDKIKZ4/TvI5IA-NCHI/AAAAAAAAAGE/RXm_EdDIrFE/s72-c/promotion1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-431661384976000227</id><published>2011-12-16T08:29:00.000-08:00</published><updated>2011-12-16T08:29:21.344-08:00</updated><title type='text'>Изменения в инсталляторе и PHP Self Extractor</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-yX02rMc3Tso/TutolyDvPZI/AAAAAAAAAF8/mClPGWr5S0w/s1600/CD.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-yX02rMc3Tso/TutolyDvPZI/AAAAAAAAAF8/mClPGWr5S0w/s320/CD.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Возможно я уже рассказывал вам о так называемом "внедрении". Эта возможность позволяет производить установку системы с одного веб-сервера на другой, используя FTP. Это позволит устанавливать Е5 без необходимости самостоятельной загрузки файлов на FTP сервер.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;После запуска beta-версии системы (для этого я уже приобрёл площадку rucms.org) можно будет не только скачать её архив, но и воспользоваться онлайн-инсталлятором. Многих пользователей смутит необходимость указывать FTP-реквизиты, однако код системы открыт (в том числе и код инсталлятора) и вы можете легко убедиться, что ваши данные не уйдут "на лево".&lt;br /&gt;&lt;br /&gt;Возможность внедрения существует в системе уже достаточно давно, но работала она мягко говоря никак. В половине случаев шли сбои из-за превышения лимита на время выполнения PHP-скрипта. В других случаях отказывались работать функции ftp_chmod и т.д. В результате было натыкано множество костылей, но сегодня я провёл заключительный штрих и он называется...&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;PHP Self Extractor&lt;/strong&gt; (Та да!)&lt;br /&gt;&lt;br /&gt;Т.е. один сервер посылает другому всего один php файл, который состоит из двух частей: &lt;strong&gt;распаковачный модуль&lt;/strong&gt; и сжатые &lt;strong&gt;данные системы&lt;/strong&gt; (системные файлы и изображения), упакованные GZIP Deflate сжатием (только inflate разрешён в PHP до 5ой версии, в отличие от GZEncode).&lt;br /&gt;&lt;br /&gt;Возможно, в будущем сама система будет скачиваться не архивом, который нужно руками распаковать где-нибудь на рабочем столе и переправить по-файлово через FTP-сервер. А в виде одного файла. Хотя в каком будущем? Наверное так и сделаю :) Ведь возможность уже есть.&lt;br /&gt;&lt;em&gt;В той же Joomla компоненты можно устанавливать с помощью одного GZIP файла. Чем мы хуже?&lt;/em&gt; Тем более, что у нас есть Self Extractor!&lt;br /&gt;&lt;br /&gt;В принципе, можно было бы обойтись и двумя файлами: один установщик, другой - сжатые данные (вспомним те же плагины жумлы). Но одним как-то лаконичней. Тем более, он удаляет себя после распаковки, дабы не оставлять мусор.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Авто определение родительского каталога домена&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Также я убрал возможность ручного указания папки на севрере (возможно в следующих апдейтах появится возможность указать её самостоятельно). Теперь скрипт засовывает спец.файл во все папки на удалённом сервере через FTP, пока он не откроется по указанному домену.&lt;br /&gt;&lt;br /&gt;Тут я немного облажался, т.к. разбираться с обычным LIST достаточно долго, учитывая разные ответы FTP сервера для разных операционных систем. По этому я использовал стандартную команду NLIST, которая однако не сообщает - файл она выдала или папку. По этому мой скрипт пытается пихать свои файлы в файлы (например /pub/index.html/script.php). В виду отсутствия альтернатив пришлось использовать именно этот метод. Можно было бы предварительно проверять, можно ли зайти в эту сущность как в директорию, но по времени это заняло бы ровно столько же времени.&lt;br /&gt;&lt;br /&gt;Скрипт поиска домашней директории для домена был удачно опробирован на хостинге SWEB.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Зачем это нужно, когда система сама определяет DOCROOT&lt;/strong&gt;? Всё очень просто: для успешной установки, мы должны знать КУДА извлекать файлы на FTP сервере и автоматически запускать нужные установленные файлы, для обновления БД. А как их запускать? Только через GET запрос к удалённому серверу (&lt;em&gt;я не рассматривал варианты поиска php.exe и запуск скрипта через него, с помощью shell, т.к. это маловероятно на современных хостинг-платформах&lt;/em&gt;).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Сделаем всё за 1 раз&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Раньше установка проходила в два этапа:&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;&lt;div&gt;Верификация реквизитов (FTP, MySQL, DomainRoot)&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div&gt;Копирование файлов системы&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;Теперь всё происходит за 1 раз. Зачем заставлять пользователя нажимать лишнюю кнопку? Тем более, что теперь скорость установки увеличилась почти в сто раз. Раньше установщик просто копировал всё необходимое для запуска автообновления на удалённой машине, а затем запускал его. Естественно, что обновление, при отсутствии большинства файлов, будет идти несколько минут.&lt;br /&gt;&lt;br /&gt;Плюс была масса FTP запросов (которые идут очень долго, т.к. FTP сервера у большинства хостеров очень тормозят). Теперь же используется всего два запроса - перенос файла системы и запись файла конфига. Автообновление также запускается (для установки БД и .htaccess файлов), но по времени оно идёт всего несколько секунд.&lt;br /&gt;&lt;br /&gt;После установки методом "внедрения", системе автоматически присваивается в качестве сервера обновлений адрес той машины, с которой она была установлена. Внедрение возможно только в том случае, если в системе-сервере есть зона обновлений. Например SiteURL/update (&lt;em&gt;именно с этого адреса будут в последствии обновляться все установленные с неё системы&lt;/em&gt;).&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-431661384976000227?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/431661384976000227/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/12/php-self-extractor.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/431661384976000227'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/431661384976000227'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/12/php-self-extractor.html' title='Изменения в инсталляторе и PHP Self Extractor'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-yX02rMc3Tso/TutolyDvPZI/AAAAAAAAAF8/mClPGWr5S0w/s72-c/CD.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-850132507291141929</id><published>2011-12-01T13:02:00.000-08:00</published><updated>2011-12-01T13:02:22.635-08:00</updated><title type='text'>Внутренний буфер обмена</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-GDhCSJhMooM/TtfXI2kIZsI/AAAAAAAAAFk/G9F8u9Ixq_Y/s1600/f9ce22683b52c7f536ef580137a18ba3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="118" src="http://3.bp.blogspot.com/-GDhCSJhMooM/TtfXI2kIZsI/AAAAAAAAAFk/G9F8u9Ixq_Y/s200/f9ce22683b52c7f536ef580137a18ba3.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;Для удобства манипуляции данными, помимо стандартных средств переноса и копирования материалов, был внедрён буфер обмена. Он позволяет переносить, копировать и клонировать материалы в любые схожие разделы.&lt;/div&gt;&lt;div class="" style="clear: both; text-align: left;"&gt;К примеру, у нас есть фотографии в статье на одном сайте. Положив эти фотографии в буфер обмена, мы можем перенести их из одной статьи в другую или же вообще на другой сайт или в фотографии какой-либо новости или фотогалереи.&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;a href="http://4.bp.blogspot.com/-mcftoQGL444/TtfqL4M7CNI/AAAAAAAAAFs/oUDc9zt7uYI/s1600/src2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="155" src="http://4.bp.blogspot.com/-mcftoQGL444/TtfqL4M7CNI/AAAAAAAAAFs/oUDc9zt7uYI/s320/src2.jpg" width="320" /&gt;&lt;/a&gt;Кроме стандартного переноса и копирования существует метод "&lt;strong&gt;Клонирование&lt;/strong&gt;". Суть метода заключается в том, что объект не копируется, а существует одновременно в нескольких разделах. Например, мы можем использовать одну и ту же статью сразу на нескольких сайтах. При удалении клонированного элемента система выдаст варианты действия - удалить сам элемент, или же удалить его из текущего месторасположения (при этом во всех остальных местах он останется неизменным).&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Если мы работаем с сложными элементами (с подтаблицами), то при их вставки из буфера мы можем выбрать три варианта - полностью скопировать, скопировать без подтаблиц (например, если у нас есть статья с фотографиями и комментариями, то мы можем скопировать только статью) и &lt;strong&gt;клонировать подтаблицы&lt;/strong&gt;. Третий вариант скопирует сам элемент, но все элементы в его подтаблице будут клонированны.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Эта возможность пригодилась лично мне совсем недавно. Нужно было сделать копию фотогалереи (с множеством фотоальбомов), при этом сами фотографии дублицировать было не нужно, а только фотоальбомы (чтобы сделать их английскую версию).&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Система Е5 прекрасно обходилась без &lt;strong&gt;буфера обмена&lt;/strong&gt;. Достаточно было скопировать или клонировать объекты на месте (в текущем разделе), а затем просто сменить копиям родителя или экземпляр. Такой способ дал трещину тогда, когда пришлось переносить элементы между двумя, совершенно не связанными, структурами.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;В планах на будущее сделать &lt;strong&gt;возможность выгрузки&lt;/strong&gt; элементов из буфера обмена в бинарный файл (т.к. файлы также участвую в этих процессах, если элементы имеют соответствующие поля), для дальнейшей его вставки в другую систему.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-DlmO1j08w9Q/TtfrTAjdLEI/AAAAAAAAAF0/8t3YS2XWaQA/s1600/scr1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="98" src="http://3.bp.blogspot.com/-DlmO1j08w9Q/TtfrTAjdLEI/AAAAAAAAAF0/8t3YS2XWaQA/s400/scr1.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;Также есть желание сделать межраздельный буфер. Сейчас мы можем работать с буфером в рамках определённой таблицы (т.е. мы не можем скопировать элемент Новость в таблицу Фотогалереи). Есть желание сделать возможность форсированного буфера. Т.е. вначале мы определяем сопоставления полей, а затем делаем впрыск нужной информации. Думаю пользователи оценят такую гибкость системы.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-850132507291141929?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/850132507291141929/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/12/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/850132507291141929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/850132507291141929'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/12/blog-post.html' title='Внутренний буфер обмена'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-GDhCSJhMooM/TtfXI2kIZsI/AAAAAAAAAFk/G9F8u9Ixq_Y/s72-c/f9ce22683b52c7f536ef580137a18ba3.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-3072579139609269463</id><published>2011-11-28T16:53:00.000-08:00</published><updated>2011-11-28T16:53:34.745-08:00</updated><title type='text'>Работы по оптимизации</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt; &lt;br /&gt;Не секрет, что &lt;strong&gt;вопрос скорости загрузки&lt;/strong&gt; сайтов на сегодняшний день является одним из определяющих факторов, при выборе CMS. Поскольку Е5 является фреймворком и претендует на весьма широкий функционал, скоростью она похвастаться не может.&lt;br /&gt;&lt;br /&gt;На тестовой версии Е5, которую я сейчас обкатываю, размещается порядка 30и сайтов (в рамках одного виртуального хостинга). Суммарный объём информации на всех сайтах - 89.4мб.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-jZV9nEPipkA/TtQlB7372QI/AAAAAAAAAFU/qhjVJc-ouBg/s1600/tables.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-jZV9nEPipkA/TtQlB7372QI/AAAAAAAAAFU/qhjVJc-ouBg/s1600/tables.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;В этих 19 таблицах хранится информация о 30и сайтах&lt;br /&gt;(13,247 строк информации)&lt;/div&gt;&lt;br /&gt;До оптимизации, &lt;strong&gt;скорость загрузки типовой страницы&lt;/strong&gt; колебалась &lt;strong&gt;от 0.6 до 0.8&lt;/strong&gt; секунды. На страницах повышенной сложности (главная страница интернет-магазина, большой каталог статей с архивом) скорость загрузки падала &lt;strong&gt;до 3&lt;/strong&gt; секунд. На самых сложных ресурсах (каталог недвижимости, объёмный прайс-лист) скорость могла упасть &lt;strong&gt;до 15 &lt;/strong&gt;секунд.&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Кроме того, количество продуцируемых запросов могло достягать нескольких тысяч, а количество затронутых строк - десятков тысяч (на том же портале недвижимости, в каталоге фигурирует порядка 10 тысяч вариантов). В среднем уходило 300 запросов.&lt;br /&gt;Для предотвращения долгих запросов Е5 использует всевозможные варианты кеширования шаблонов. Но согласитесь, один кеш не спасёт, особенно в тех случаях, когда информация постоянно меняется.&lt;br /&gt;&lt;br /&gt;Мне удалось обнаружить основную причину долгих загрузок и большого количества обращений к БД. Причиной всему было поэтапное извлечение данных из базы данных. Наш интерпритатор шаблонов просто не мог угадать какие именно данные будет использовать пользователь в своём шаблоне. По этому, вместо того, чтобы выгружать вообще все данные (что совсем нелогично), интерпритатор загружал их постепенно, по мере сталкивания с данными в шаблоне. Следовательно, напрашивался вывод - чтобы обеспечить нормальную выгрузку данных, нужно научить интерпритатор видеть какие данные могут понадобится в том или ином шаблоне.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Какие работы по оптимизации были проведены?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;1. В интерпритатор добавлена возможность подгружать все необходимые для работы с шаблоном данные одним запросом (для этого в него добавлен анализатор, просматривающий то, какие столбцы будут участвовать в текущем шаблоне / переборе);&lt;br /&gt;&lt;br /&gt;2. Переработана функция обработки текста explodeA. Теперь она работает в 10 раз быстрее. Эта функция может вызываться несколько тысяч раз во время загрузки одного сайта (благо функция очень лёгкая и быстрая);&lt;br /&gt;&lt;br /&gt;3. Добавлена возможность физического кеширования направляющих шаблона. Во время чтения шаблона интерпритатором, он придаёт ему удобную для работы форму - в виде схемы. Эта схема и кешируется на жёстком диске сервера. Итого мы получаем -30% к первому запуску страницы и +15% к скорости всех дальнейших запусков (при этом кеш является глобальным, без привязки к адресу и т.д.)&lt;br /&gt;&lt;br /&gt;4. Добавлены новые виды кеширования шаблонов (^# - кеш, независимый от адреса, но зависимый от входящих переменных / ^* - кеш, зависимый только от экземпляра текущего модуля). Для статичных блоков рекомендуется писать ^* в самом начале шаблона.&lt;br /&gt;&lt;br /&gt;5. Включён кеш парсинга строки данных (для функции parse_row)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;А как насчёт результатов?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;После оптимизации мы получили следующие цифры:&lt;br /&gt;Время загрузки простого сайта - &lt;strong&gt;0.17 секунды&lt;/strong&gt;&lt;br /&gt;Время загрузки среднего сайта (каталог статей, интернет-магазин) - &lt;strong&gt;1&lt;/strong&gt;&lt;strong&gt; секунда&lt;/strong&gt;&lt;br /&gt;Время загрузки крупного сайта (портал недвижимости, страница со всеми объявлениями) - &lt;strong&gt;5 секунд&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;При этом количество запросов к БД удалось уменьшить &lt;strong&gt;до 60-140&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/--fwPYCmV3l4/TtQqTusflEI/AAAAAAAAAFc/Rov1FHx6NZ0/s1600/images.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/--fwPYCmV3l4/TtQqTusflEI/AAAAAAAAAFc/Rov1FHx6NZ0/s1600/images.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;Фактически систему удалось &lt;strong&gt;ускорить в 3 раза&lt;/strong&gt;,&lt;br /&gt;при этом в 3 раза сократив кол-во запросов к БД.&lt;/div&gt;&lt;br /&gt;Даже не смотря на такое ускорение, система ещё не подходит для разработки порталов и интернет-магазинов. Для сравнения - главная страница топовых интернет-магазинов на системе Битрикс загружается 0.5 секунды.&lt;br /&gt;&lt;br /&gt;Сейчас Е5 прекрасно справляется с небольшими сайтами компаний, каталогами статей и блогами. Моя цель - довести скорость загрузки интернет магазина и портала до &lt;strong&gt;0.3&lt;/strong&gt; секунды.&lt;br /&gt;&lt;br /&gt;Стоит отметить, что &lt;strong&gt;с кешированием это возможно уже сейчас&lt;/strong&gt;. Тем более, что в Е5 оно бывает очень многих видов. Например, сам разработчик модуля может установить кешируемость определённых элементов (некоторые кешируются на время, некоторые - до изменения элемента). Кроме того есть &lt;strong&gt;кеш SQL запросов&lt;/strong&gt;, жёсткий кеш шаблонов (кешируется вообще всё), кеш функций и кеш структуры направляющего шаблона (то, о чём я писал в пункте 3 этого поста).&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-3072579139609269463?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/3072579139609269463/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/11/blog-post_28.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/3072579139609269463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/3072579139609269463'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/11/blog-post_28.html' title='Работы по оптимизации'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-jZV9nEPipkA/TtQlB7372QI/AAAAAAAAAFU/qhjVJc-ouBg/s72-c/tables.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-3876463449782034288</id><published>2011-11-25T15:46:00.000-08:00</published><updated>2011-11-25T15:46:25.454-08:00</updated><title type='text'>Настройки безопасности - продолжение</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;В прошлых записях я уже писал о неоднозначных ситуациях с правами доступа к разным элементам системы. Поскольку система Е5 это ещё и фреймворк, приходится предусматривать самые разнообразные настройки прав.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-vjGvT8SCeiQ/TtAoxKSnj1I/AAAAAAAAAFM/nAf3GQPU5S8/s1600/safe_poker.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-vjGvT8SCeiQ/TtAoxKSnj1I/AAAAAAAAAFM/nAf3GQPU5S8/s320/safe_poker.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Например, для того, чтобы добраться к нужной новости, нужно вначале убедиться, что есть доступ к модулю "Новости", затем, что есть доступ к таблице "Список новостей". При этом, пользователь должен иметь права на просмотр текущего экземпляра новостей (например "Главные новости сайта"). При этом пользователь может иметь доступ на просмотр вообще всех строк, во всех модулях, таблицах и экземплярах.&lt;br /&gt;&lt;br /&gt;Спорных ситуаций возникает тысячи. Например, что делать если пользователь состоит в двух группах - в одной из них ему разрешено редактировать эти новости, а в другой запрещено? В таком случае доступ складывается в пользу разрешить. А что если, в одной группе пользователю разрешено редактировать вообще все строки, а в другой группе запрещено редактировать "Главные новости сайта"? Тогда редактирование будет запрещено. Т.к. более тонкая настройка доступа перекрывает глобальные настройки.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Итак, кто кого перекрывает и как?&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Попробую расписать всё по порядку.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1. Смотрим глобальные настройки доступа к строкам ("&lt;strong&gt;все строки&lt;/strong&gt;"), вначале проверяем значения "&lt;strong&gt;по умолчанию&lt;/strong&gt;", затем перебираем все группы, в которых участвует пользователь и в конце концов добавляем личные настройки самого пользователя. Сложение идёт в пользу "Разрешить". А вот точный порядок сложения доступов: &lt;strong&gt;Не задан&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Запретить&lt;/strong&gt; -&amp;gt; &lt;strong&gt;Разрешить только для элементов&lt;/strong&gt;, созданных автором -&amp;gt; &lt;strong&gt;Разрешить&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;2. Смотрим настройки для всех таблиц текущего модуля. Перебираем таким же образом, как и в предыдущем случае (настройки по умолчанию -&amp;gt; настройки для групп, в которых участвует пользователь -&amp;gt; частные настройки пользователя). Доступ также складывается в пользу "Разрешить".&lt;br /&gt;&lt;br /&gt;Теперь складываем полученные доступы из 1ого и 2ого пунктов, но сложение идёт в пользу "Перекрыть". Т.е. настройки для &lt;strong&gt;таблиц модуля&lt;/strong&gt; будут перекрывать настройки &lt;strong&gt;всех строк&lt;/strong&gt; в том случае, если они заданы.&lt;br /&gt;&lt;br /&gt;3. Смотрим настройки для конкретных таблиц модуля. Всё делаем по аналогии с пунктом 2. И также складываем эти настройки с получившимися из пунктов 1 и 2 способом "Перекрыть".&lt;br /&gt;&lt;br /&gt;Таким образом, у нас будут преобладать точечные настройки. Однако возможны некоторые некорректные ситуации. Например, пользователь состоит в группе "Старшие модераторы" и "Модератор новостей". Старшим модератором разрешается редактировать строки всех таблиц модуля новости, а модератору новостей запрещается редактирование таблицы "Шаблоны". Тогда такому пользователю нужно будет в его личных настройках разрешать редактирование этой таблицы, иначе он (даже являясь старшим модератором) не сможет редактировать шаблоны.&lt;br /&gt;&lt;br /&gt;Такая логика не прозрачна, по этому она была внедрина в систему буквально сегодня (через 6 месяцев после запуска системы доступов). Старая система доступов к строке выглядела иначе. Она обрабатывалась для каждой группы отдельно способом "Перекрыть", а затем складывалась в пользу "Разрешить". Т.е. обрабатывались сразу все уровни доступов. Теперь же я решил сделать отдельную обработку для каждого уровня доступов (все строки -&amp;gt; строки модуля -&amp;gt; строки таблицы). Вначале выбирается уровень, а затем начинают перебираться все группы и складываться разрешения в пользу "Разрешить", но при сложении с следующим (более тонко-настроенным) уровнем, доступы складываются в пользу "Перекрыть".&lt;br /&gt;&lt;br /&gt;4. Складываем получившиеся доступы с доступом к текущему экземпляру. Сложение идёт в пользу "Перекрыть", т.к. указание экземпляра является самой тонкой настройкой.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Зачем так усложнять?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Система изначально позиционируется как мультидоменная. Более того, была задумка предоставлят систему веб-студиям, чтобы они могли на одном сервере (в одной папке и с одной базой данных) размещать большое количество клиентов таким образом, чтобы клиенты работали с системой индивидуально (не догадываясь о наличии в системе других сайтов, пользователей и т.д). Для этого был реализован &lt;strong&gt;доступ по экземплярам&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;Для некоторых сайтов в рамках одной и той же установленной системы необходим один набор модулей, а для других - соврешенно иной. А некоторые сайты вообще требуют написние большого количества собственных модулей под себя. Для этой задачи был реализован &lt;strong&gt;доступ по модулям&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;На некоторых сайтах объём модерируемой информации настолько велик, что необходимо отдельно заводить группу пользователей, которые смогут редактировать только комментарии к новостям. А для специалистов веб-студий, обслуживающих сразу несколько сайтов системы, необходимо давать отдельный доступ на редактирование таблицы "Шаблоны новостей". Таким образом был реализован&amp;nbsp;&lt;strong&gt;доступ по таблицам&lt;/strong&gt;.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-3876463449782034288?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/3876463449782034288/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/11/blog-post_25.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/3876463449782034288'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/3876463449782034288'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/11/blog-post_25.html' title='Настройки безопасности - продолжение'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-vjGvT8SCeiQ/TtAoxKSnj1I/AAAAAAAAAFM/nAf3GQPU5S8/s72-c/safe_poker.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-7173087707002408604</id><published>2011-11-23T13:15:00.000-08:00</published><updated>2011-11-23T13:16:06.404-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Вести с полей'/><title type='text'>Вставка значений в редактор шаблонов</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Для каждого начинающиго "шаблониста" основной проблеммой является постоянный поиск нужных комманд и названий полей. Например, чтобы вставить в шаблон типичного модуля на смарти дату или текст, вам нужно точно знать как программист забил эти значения в шаблон. И зачастую программисты держат эту информацию в секрете. Но даже если разработчик модуля предоставляет полное руководство по его шаблонизированию, хранить в памяти набор из нескольких сотен непонятных названий ( {forum_first_topic_title} ) дело тяжёлое.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-mEQQV56Dy1w/Ts1hXJTOrdI/AAAAAAAAAE8/i-f9F2lAFZo/s1600/val.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-mEQQV56Dy1w/Ts1hXJTOrdI/AAAAAAAAAE8/i-f9F2lAFZo/s1600/val.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Месяц усилий не прошёл даром. И вот уже появилось нечно, с помощью чего можно руками составлять неплохой HTML шаблон, зная лишь несколько принципов работы системы.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-fqzKkwgN984/Ts1TgCxcXbI/AAAAAAAAAEs/kVhx9sOFPyk/s1600/part.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-fqzKkwgN984/Ts1TgCxcXbI/AAAAAAAAAEs/kVhx9sOFPyk/s1600/part.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Вставляем часть модуля, с нужными параметрами&lt;/div&gt;&lt;br /&gt;Сейчас есть два вида диалогов - вставка значения и вставка условия. Диалог значения может быть жёстко привязан к нужному результату. Например, в перебор мы можем вставить только массив значений, а в текст - только текст.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-vu7y6rxqxMs/Ts1hNcFN2zI/AAAAAAAAAE0/16oneHhZKbY/s1600/if.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="305" src="http://2.bp.blogspot.com/-vu7y6rxqxMs/Ts1hNcFN2zI/AAAAAAAAAE0/16oneHhZKbY/s400/if.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Вставляем условие&lt;/div&gt;&lt;br /&gt;Из одного диалога может вызываться другой. Например, диалог вставки условия предлагает для каждого аргумента сравнения выбрать значение с помощью диалога вставки значения. Да и из самого диалога вставки значения мы можем вызвать другой такой же диалог, чтобы определить необходимые параметры.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-wmP_esZ5XvU/Ts1h0mY0SBI/AAAAAAAAAFE/E5VW-q_OwdA/s1600/tree.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="210" src="http://2.bp.blogspot.com/-wmP_esZ5XvU/Ts1h0mY0SBI/AAAAAAAAAFE/E5VW-q_OwdA/s400/tree.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Выбираем массив для перебора&lt;/div&gt;&lt;br /&gt;С помощью модификаторов вы можете придать значению нужный вид. Кроме того, модификаторы отображают всю иерархическую структуру языка Е5.&lt;br /&gt;&lt;br /&gt;Например, выбрав текущий модуль, далее мы выбираем модификатор модуля "Текущий экземпляр" (переходим к активному экземпляру), затем выбираем таблицу этого экземпляра "Статьи" и к ним модификатор "Активные строки". Таким образом, в перебор у нас попадут все текущие статьи.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-7173087707002408604?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/7173087707002408604/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/11/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/7173087707002408604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/7173087707002408604'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/11/blog-post.html' title='Вставка значений в редактор шаблонов'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-mEQQV56Dy1w/Ts1hXJTOrdI/AAAAAAAAAE8/i-f9F2lAFZo/s72-c/val.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-3607380528901705598</id><published>2011-10-27T14:59:00.000-07:00</published><updated>2011-10-27T14:59:30.575-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Вести с полей'/><title type='text'>Визуализируем управляющий шаблон: первые итоги</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Как уже писалось в предыдущей статье про редактор, у меня было на выбор две идеи:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;div&gt;&lt;ol style="text-align: left;"&gt;&lt;li style="text-align: left;"&gt;Автор пишет весь шаблон на визуальном редакторе (без HTML и CSS - они генерируются редактором), и туда же втыкает структуру управляющего шаблона&lt;/li&gt;&lt;li&gt;Автор пишет шаблон на HTML+CSS, но составляет его из кусочков в дерево шаблона (т.е. шаблон состоит из элементов, которые объединяются друг с другом с помощью переборов и условий)&lt;/li&gt;&lt;/ol&gt;Выбор пал на 2ой вариант, т.к. он менее сложный и понадобится в любом случае. Лично я на одном визуальном редакторе далеко не уеду.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-1uwnxrxaERA/TqnTN0SzvBI/AAAAAAAAAC8/RMPaIvy3Utc/s1600/e5visual.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-1uwnxrxaERA/TqnTN0SzvBI/AAAAAAAAAC8/RMPaIvy3Utc/s1600/e5visual.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;И тут возникла первая сложность. Дерево шаблона будет состоять из редактируемых (!) элементов, в каждый из которых можно воткнуть кнопку-картинку. По этому пришлось иметь дело с DIV contentEditable. Т.к. мне показалось, что iframe с designmode жрал бы больше ресурсов и вообще использовать его 100 раз на одной странице как-то необосновано.&lt;br /&gt;&lt;br /&gt;Как уже говорилось, пользователь будет писать шаблон на HTML и CSS, вставляя в него элементы управления, которых будет 3 и они будут двух типов. 1ые - делящие один элемент на несколько (условия, переборы), 2ые - вставляемые в виде кнопки посреди самого элемента (вывод переменных, функции и т.д.)&lt;br /&gt;&lt;br /&gt;Кто сталкивался с contentEditable дивами знает через какое место ими можно управлять. В итоге было перелопачено пару сотен сайтов по этой теме. Первая цель была эмуляция Таба и замена Enter-а с &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;, на &amp;lt;br&amp;gt;. Таб эмулировать удалось (через \u2003), однако каретка передвигается вперёд только в IE (пробовал способов 10 эмуляции keypress, и где-то столько же способов обращения к selectionRange - не получилось). Хотя на одну позицию курсор всё таки удавалось сдвинуть, но после этого вылетал jQuery с неопределённой ошибкой. С ентером дела обстояли хуже. Перехватить его и заменить на &amp;lt;br&amp;gt; усилий не составило, а вот передвинуть туже самую злосчастную каретку так и не получилось. В итоге оставил &amp;lt;p&amp;gt;&amp;lt;/p&amp;gt;, но стиль у них сделал такой, чтобы были как &amp;lt;br&amp;gt;.&lt;br /&gt;&lt;br /&gt;Следующей целью была возможность вставления подэлементов. Вначале я хотел сделать вставку элементов в элемент, но потом решил разделять родительский элемент на две части (до вставки и после вставки), а посередине вставлять подэлементы. Также как и в прошлый раз проблемма встала при работе с кареткой текста (нужно было определить её позицию). Для этого чудом нашёлся совет разработчика редактора elRight, который советовал вставлять &amp;lt;span&amp;gt; на место каретки (стандартным методом pasteHTML), а затем плясать от него. Я сделал проще - вставил на это место текст, по которому в будующем он разделялся на две части. Если часть текста была выделена - она сбрасывалась в дочерний элемент.&lt;br /&gt;&lt;br /&gt;Как видно из скриншота, у меня готова реализация структуры шаблона. Работают кнопки "Условие", "Перебор" и "Удалить" (кстати после удаления элементы до и после удалённого места складываются в единое целое). Теперь осталось дело за реализацией окна "Параметры" и "Вставка значения". Думаю, это самый сложный технический момент. Именно в нём произойдёт интеграция редактора шаблонов с системой Е5.&lt;br /&gt;&lt;br /&gt;Напоминаю, что смысл этого редактора - обеспечить конструирование модуля посредством нажатия нужных кнопок и выбора нужных элементов. Таким образом я приближаюсь к цели системы - создание сложных модулей вроде интернет-магазина за 10 минут с нуля. Надеюсь это будет полезно современным веб-разработчикам.&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-3607380528901705598?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/3607380528901705598/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_27.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/3607380528901705598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/3607380528901705598'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_27.html' title='Визуализируем управляющий шаблон: первые итоги'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-1uwnxrxaERA/TqnTN0SzvBI/AAAAAAAAAC8/RMPaIvy3Utc/s72-c/e5visual.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-1707848715922406153</id><published>2011-10-24T14:29:00.000-07:00</published><updated>2011-10-24T14:31:09.171-07:00</updated><title type='text'>Немного о системе разбора URL</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;В Е5 внедрена система автоматического разбора URL.&lt;br /&gt;&lt;br /&gt;Система состоит из сладующих частей:&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Зона (домен / домен+папка / любой домен + папка)&lt;/li&gt;&lt;li&gt;Части модулей, предназначенные для разбора URL&lt;/li&gt;&lt;li&gt;Таблицы, имеющие URL-столбцы, связанные с частями модуля&lt;/li&gt;&lt;/ol&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-TXHP93vFu8U/TqXTEeqSM7I/AAAAAAAAAB4/FVjND_CEoi0/s1600/cmse5urler.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="387" src="http://4.bp.blogspot.com/-TXHP93vFu8U/TqXTEeqSM7I/AAAAAAAAAB4/FVjND_CEoi0/s400/cmse5urler.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Как это происходит? Нажимаем "Дальше" и смотрим...&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;1. Разбор зоны&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Вначале URL проходит проверку на привязку к зоне. Зоной может являться как отдельный домен, так и разные папки на одном и том же домене. Можно создавать зоны-ссылки, которые ссылаются на другие зоны.&lt;br /&gt;&lt;br /&gt;Зона, в свою очередь, ссылается на определённый модуль и на определённый его экземпляр.&lt;br /&gt;Например у зона "сайт1" может ссылаться на модуль "Содержание" экземпляр "Сайт 1" (типичная мультидоменная CMS). Можно создавать зоны без привязки к доменам, а только к папкам. Тогда на всех связных с системой доменах, при открытии адреса "/admin" (как пример) будет загружаться админка.&lt;br /&gt;&lt;br /&gt;Зоны проходят проверку по IP-фильтру. Вы можете сделать так, чтобы один и тот же домен показывал разные сайты, если зайти на него из России и Украины (типичная CMS с поддержкой многоязычности). IP-фильтр системы может состоять из целого набора значений (тут и IP диапазоны, и указание городов или даже стран, согласно WHOIS написанию).&lt;br /&gt;&lt;br /&gt;Итак, зона определена. Дальше система передаёт оставшуюся часть URL указанному в зоне экземпляру модуля.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. Подбор части модуля&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Получив контроль над оставшейся частью URL, модуль начинает перебирать все части, отвечающие за URL разбор и смотреть какая из них подходит.&lt;br /&gt;&lt;br /&gt;Сама по себе часть может иметь какой-то установленный адрес (например archive или help), но в большенстве случаев часть связана с таблицей. Например у модуля "&lt;b&gt;Содержание&lt;/b&gt;" часть "&lt;b&gt;Вывод страницы&lt;/b&gt;" связана с таблицей "&lt;b&gt;Страницы&lt;/b&gt;". У которой есть поле URL, по которому и будет происходить разбор. При этом разбор будет производиться с учётом подстраниц.&lt;br /&gt;&lt;br /&gt;Далее, определённая страница называется переменной &lt;b&gt;COW&lt;/b&gt; (аббривиатура к сожалению забыта мною), которая указана в коде части "&lt;b&gt;Вывод страницы&lt;/b&gt;".&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. Усложнения&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;У нашей страницы может быть поле "Модуль", которое в свою очередь ведёт на некий экземпляр какого-либо модуля. Для его вывода часть "&lt;b&gt;Вывод страницы&lt;/b&gt;" использует код [&lt;b&gt;cow.module.auto&lt;/b&gt;], который передаст управление и оставшуюся часть URL следующему модулю (например, это могут быть новости или фотогалерея).&lt;br /&gt;&lt;br /&gt;Также, у страницы может быть подтаблица из другого модуля "&lt;b&gt;Комментарии&lt;/b&gt;". Для отображение этой подтаблицы, мы можем вызвать этот самый модуль ([&lt;b&gt;cow.comments.md.auto&lt;/b&gt;]), который в свою очередь также получит для разбора оставшуюся часть URL.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-keyVM6UUdNg/TqXVj5ssLOI/AAAAAAAAACA/OVm-Ov0TuXE/s1600/default.jpeg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-keyVM6UUdNg/TqXVj5ssLOI/AAAAAAAAACA/OVm-Ov0TuXE/s1600/default.jpeg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;i&gt;Надеюсь, моему дорогому читателю стало ясно, что вложенность модулей друг в друга может быть бесконечной. Также, как и вложенность строк.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;Чисто теоретически, вы можете сделать такую систему, в которой содержание будет отсылать нас к новости, а новость к содержанию (только уже к своим страницам) и т.д.&lt;/i&gt;&lt;br /&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;br /&gt;В настройках "отлова" URL в части модуля, вы можете указывать такие замудрёные параметры, как:&lt;br /&gt;&lt;br /&gt;1. &lt;b&gt;Игнорировать строку-родителя при разборе&lt;/b&gt;. Разбор будет идти до самого последнего досягаемого элемента, и уже только тогда запустится часть. Например, имея адрес &lt;b&gt;/Чайники/Россия/Самовар1Ф&lt;/b&gt;, часть сразу начнёт разбор с Самовара, пропуская и категории товара и страну производителя.&lt;br /&gt;&lt;br /&gt;2. &lt;b&gt;Включать в разбор строки из подчинённых таблиц&lt;/b&gt;. Я обычно для подтаблиц, использую отдельные части, которые наследуют разбор за текущими. А если подтаблица из другого модуля, то тем более - использую часть того модуля, откуда ко мне пришла эта таблица&lt;br /&gt;&lt;br /&gt;3. &lt;b&gt;Запускать в случае, если под URL не подошла ни одна часть&lt;/b&gt;. Банальный обработчик 404 ошибки. Теперь будет где написать "&lt;b&gt;Страница не найдена&lt;/b&gt;" :) Кроме того, подобного эффекта можно добиться, если строке (чья таблица участвует в URL-разборе) присвоить адрес "-" (минус). Но возникают проблеммы, когда у таблицы одни строки влагаются в другие. Т.е. например адрес &lt;b&gt;/абракадабра&lt;/b&gt; будет пойман, как не существующий, а вот адрес &lt;b&gt;/news/абракадабра&lt;/b&gt; просто откроет перед нами страницу news.&lt;br /&gt;&lt;br /&gt;Вот в принципе и всё, что я хотел рассказать о работе с URL. Рекомендую изучить примеры, которые показаны на рисунке в самом начале данного поста. Данные примеры представлены только для ознакомления. Автор ни в коем разе не думает, что такие решения (которые указаны в примерах) являлись бы оптимальными. Они придуманы только для демонстрации возможностей.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-1707848715922406153?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/1707848715922406153/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/10/url.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/1707848715922406153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/1707848715922406153'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/10/url.html' title='Немного о системе разбора URL'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-TXHP93vFu8U/TqXTEeqSM7I/AAAAAAAAAB4/FVjND_CEoi0/s72-c/cmse5urler.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-5669133483844007160</id><published>2011-10-21T16:50:00.000-07:00</published><updated>2011-10-21T16:50:04.624-07:00</updated><title type='text'>Вопрос о выборе конструктора модулей</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-cSbb28upToU/TqIA6iPfQSI/AAAAAAAAABw/NlTYnnXJLP0/s1600/TN_006646.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="200" src="http://2.bp.blogspot.com/-cSbb28upToU/TqIA6iPfQSI/AAAAAAAAABw/NlTYnnXJLP0/s200/TN_006646.JPG" width="121" /&gt;&lt;/a&gt;&lt;/div&gt;Я до сих пор не могу определиться с концепцей конструктора. Скорее всего это будет &lt;strong&gt;смесь между WYSIWYM-ом и WYSIWYG-ом&lt;/strong&gt;. Т.е. каркас будет строиться из простых элементов (text area) и связей между ними, а внутри каждого элемента будет возможность перехода в визуальный редактор CKEditor, в который будет интегрирован селектор значений (о котором я уже кажется писал в предыдущем посте про конструктор/редактор).&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Можно было бы и не париться - сделать всё &lt;strong&gt;на базе CKEditor-а&lt;/strong&gt;, заранее снабдив его дополнительными кнопками. Но мы имеем дело с жёсткой структурой, в которой существуют IF и TREE элементы, делящие шаблон на части. Основная мыслительная деятельность направлена именно на то, чтобы узнать - а нужно ли разделять код модуля на элементы IF, ELSE, TREE, AFTER или же достаточно тот же IF интегрировать в CKEditor (как это реализовано у Ucoz-а).&lt;br /&gt;&lt;br /&gt;В некоторых случаях вообще вредно бить контент на элементы. Особенно когда мы имеем дело с короткими выпадами вроде &amp;lt;img src="[if x==1]1.jpg[else]2.jpg[/if]"&amp;gt;. Понятно, что ради какой-то мелочёвки создавать дополнительные поля (отдельно под 1.jpg и отдельно под 2.jpg) это не очень правильно. Но если мы имеем дело с длинным участком кода, то его разбитие намного упростит логику приложения.&lt;br /&gt;&lt;br /&gt;Тем более я не представляю возможным на базе CKEditor-а делать сделать связку из трёх картинок (IF ELSE /IF) и текста внутри них, особенно если будут ещё и под-IFы. Т.е. я догадываюсь о механизмах парсинга кода, которые будут стоять за подобной интеграцией, но намного проще будет сделать разбивку на элементы.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Как будет происходить создание вывода (приложения/шаблона) модуля&lt;/strong&gt;? Вначале перед нами пустое поле, которое мы можем редактировать в режиме HTML и CKeditor. CKeditor используется только для операций с вёрсткой и оформлением участка. Переключившись в HTML мы имеем доступ к устновке IF-ов (условий) и TREE (циклов). Нажав на TREE текст делится на три текстовых поля. 1-ое поле вбирает в себя текст до курсора, 2-ое поле пустое и предназначено под нутро цикла TREE, оно немного сдвинуто вправо, чтобы была видна его вложенность, и 3-е поле отображает текст, который был после курсора. Если в этот момент был выделенный текст, то он попадает в 2-ое поле.&lt;br /&gt;&lt;br /&gt;Таким образом, мы можем делить текст этими операторами сколько угодно раз. Разбивка в этом случае подобна дереву (в виду своей вложенности одного оператора в другой). Получается, что это дерево - своеобразный&amp;nbsp;WYSIWYM, а содержание каждого отдельного элемента становится&amp;nbsp; WYSIWYG-ом. Когда я заканчиваю редактирование элемента, я могу выбрать как он будет отображаться - в виде HTML+E5 кода, либо в визуальном виде (отображается он будет уже не в CKEditor-е, а в DIV-е).  &lt;br /&gt;&lt;br /&gt;Нужно продумать такие моменты, как переход с одного элемента на другой. Когда я просто нажал на клавишу "Вверх" в начале следующего элемента, я должен переместиться в конец предыдущего элемента и наоборот.&lt;br /&gt;&lt;br /&gt;Точной картины у меня пока нет. Попробую реализовать модель дерева, хотябы на базе простых TEXT-AREA полей. Посмотрим что из этого выйдет.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-5669133483844007160?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/5669133483844007160/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_21.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/5669133483844007160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/5669133483844007160'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_21.html' title='Вопрос о выборе конструктора модулей'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-cSbb28upToU/TqIA6iPfQSI/AAAAAAAAABw/NlTYnnXJLP0/s72-c/TN_006646.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-1008380686690201682</id><published>2011-10-18T10:25:00.000-07:00</published><updated>2011-10-18T10:28:31.747-07:00</updated><title type='text'>Сегодня я узнал о ещё одной хорошей CMS</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Её имя - &lt;b&gt;ProcessWire 2&lt;/b&gt;. На главной странице их сайта (&lt;a href="http://processwire.com/"&gt;http://processwire.com/&lt;/a&gt;) расположено видео, которое демонстрирует основные возможности. В чём-то есть схожесть с друпалом, в чём-то есть схожесть с Е5.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-aiEEm6n3XtU/Tp23NYsoIII/AAAAAAAAABc/QmyEREPzeEg/s1600/sss.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/-aiEEm6n3XtU/Tp23NYsoIII/AAAAAAAAABc/QmyEREPzeEg/s1600/sss.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Что мы имеем? По сути это таже модель MVC, но модель данных составляется динамически, в зависимости от ситуации. То, что в Е5 называется таблицей данных, в ProcessWire зовётся шаблоном.&lt;br /&gt;&lt;br /&gt;Работа с системой по сути сводится к разработке шаблонов данных (состоящих из комбинации различных полей), а затем использование этих шаблонов в произвольной структуре. Так, например родителем элемента "Новость", может быть элемент шаблона "Содержание", а потомком "Новости" опять же "Содержание" или "Комментарии". Т.е. каждая строка системы может иметь отличный тип от всех остальных строк.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;В Е5 возможные дочерние элементы строк к рамках одной таблицы определены жёстко. Так, например, к новостям мы можем прикрепить дочерние элементы "Фотогалерея" и "Комментарии", которые будут присутствовать у всех новостей, в качестве подтаблиц. А в ProcessWire одна новость может иметь фотогалерею, другая - может иметь только комментарии.&lt;br /&gt;&lt;br /&gt;С точки зрения юзабилити, ProcessWire превосходно адаптирован под пользователя. За минимум действий вы получите максимум результата. Админка работает как часы (чего не скажешь об админке Е5, в которой например не работает перетаскивание дочерних элементов к родительским, и вообще перемещение элементов иногда глючит).&lt;br /&gt;&lt;br /&gt;Рассмотрим типичную задачу - сделать сайт-каталог Небоскрёбов (демо-сайт ProcessWire 2).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Реализация на ProcessWire&lt;/b&gt;:&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Создаём шаблон "Город" (название + описание)&amp;nbsp;&lt;/li&gt;&lt;li&gt;Создаём шаблон "Архитектор" (название + описание)&amp;nbsp;&lt;/li&gt;&lt;li&gt;Создаём шаблон "Небоскрёб" (название + описание + координаты + город + архитекторы)&lt;/li&gt;&lt;li&gt;Создаём элементов&amp;nbsp; шаблона "Архитекторы" , например "Девид Магеланос", "Санчо Кэсседи" и "Ариель Четландес"&lt;/li&gt;&lt;li&gt;Создаём нексолько элементов шаблона "Города", например "Нью Йорк", "Неаполь", "Сан Франциско" и "Милан"&lt;/li&gt;&lt;li&gt;Создаём под элементом "Нью Йорк" несколько подэлементов шаблона "Небоскрёб" и связываем их с имеющимися архитекторами. При этом связь осуществляется путём добавления нового поля "Архитектор", которе имеет тип "Ссылка на множество страниц", и родителя "Архитекторы". Решенее мягко говоря не гибкое и не самое лучшее.&lt;/li&gt;&lt;/ol&gt;Т.е. на протяжении всей работы мы имеем дело с одним деревом, в котором есть всё. Для экономии загрузки, авторы подгружают разделы Ajax-ом.&lt;br /&gt;&lt;br /&gt;Также не ясно, на чём конкретно пишутся шаблоны вывода всего этого содержания. За время копания в админке, мне так и не удалось это выяснить. Судя по всему, есть некоторое внутреннее API, которое привязывается через всё тотже старый добрый Smarty :)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Реализация на E5&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Первые 3 пункта полностью совпадают. Для ускорения этих операций, в Е5 предусмотрены не только шаблоны полей, но и шаблоны таблиц.&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Создаём таблицу "Город"&lt;/li&gt;&lt;li&gt;Создаём таблицу "Архитектор"&lt;/li&gt;&lt;li&gt;Создаём таблицу "Небоскрёб"&lt;br /&gt;привязываем поля "Архитекторы" и "Город" к соответствующим таблицам&lt;br /&gt;"Архитекторы" будет иметь возможность множественного выбора, "Город" - еденичного&lt;br /&gt;&lt;i&gt;Как альтернатива - мы можем сделать таблицу "Небоскрёб" подтаблицей "Городов" (можно сказать, что это будет аналог ProcessWire-вскового решения),&lt;/i&gt;&lt;/li&gt;&lt;li&gt;Создаём шаблоны вывода городов, архитекторов и небоскрёбов, делаем необходимые настройки, для автоматической генерации и распознавания URL&lt;/li&gt;&lt;li&gt;Заполняем таблицу Архитекторов и Городов&lt;/li&gt;&lt;li&gt;Заполняем таблицу Небоскрёбов, привязывая её к Архитекторам и Городам (в Е5 есть компонент, который позволяет добавлять Архитекторов и Города "не лету")&lt;/li&gt;&lt;/ol&gt;Лично мне, реализация на Е5 кажется более прозрачной и простой. Многие скажут, что такое решение ограничивает пользователя и в этом есть доля правды. В Е5 я не могу присоеденить подстроку "Небоскрёб" прямо в таблице "Город", для этого мне придётся для ВСЕХ городов делать подтаблицу "Небоскрёб". Таким образом, если я буду работать с таблицей данных, каждая строка которых будет иметь уникальное предназначение (одна строка - небоскрёб, вторая - новость), то у меня будет гигантский список пустых подтаблиц напротив каждой строки.&lt;br /&gt;&lt;br /&gt;В следующий раз постараюсь показать возможности Е5 в виде небольшой презентации, но прежде хочу закончить редактор шаблонов, без которого Е5 будет мало чем отличаться от Smarty-ориентированных систем.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-1008380686690201682?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/1008380686690201682/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/10/cms.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/1008380686690201682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/1008380686690201682'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/10/cms.html' title='Сегодня я узнал о ещё одной хорошей CMS'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-aiEEm6n3XtU/Tp23NYsoIII/AAAAAAAAABc/QmyEREPzeEg/s72-c/sss.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-8334242043315939711</id><published>2011-10-17T21:34:00.000-07:00</published><updated>2011-10-18T10:29:42.236-07:00</updated><title type='text'>Улучшения внутренних функций и новые планы</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;b&gt;Работа со строками&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Для фильтрации строк использовался оператор [filter], который выполнял операции [if] над всеми входящими строками, а результат записывал в виде переменной, или в виде "субстрок" таблицы данных. От этого подхода решено было уйти в пользу оператора .SEL. Также и от сортировки [order] перешли к более удобным операторам .DESC, .ASC и .RAND&lt;br /&gt;&lt;br /&gt;Если вы ярый изобретатель CMS, то &lt;strong&gt;читайте это сообщение дальше&lt;/strong&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Если мы фильтруем многоуровневую таблицу данных, то для фильтрации дочерних элементов в [filter] устанавливался знак ^ перед перебираемыми данными. В .SEL эта возможность отсутствовала до вчерашнего дня. Теперь по умолчанию .SEL использует глубинную фильтрацию и сортировку. Возможно, позже предётся вводить дополнительные команды для отключения глубинности просмотра.&lt;br /&gt;&lt;br /&gt;Напомним разницу конструкций:&lt;br /&gt;&lt;br /&gt;Конструкция Filter&lt;br /&gt;[filter cex.articles.rows "active_rows" enable==1]&lt;br /&gt;И далее мы имеем доступ к отобранным строкам через cex.articles.active_rows&lt;br /&gt;&lt;br /&gt;Конструкция Sel&lt;br /&gt;[active_rows=cex.articles.rows.sel(enable==1)]&lt;br /&gt;Доступ к элементам через [$active_rows]&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Доработаны операторы NEXT и PREV&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Теперь они указывают на предыдущий/следующий элемент с учётом вложенных строк. Например, если у строки есть "дети", то следующим указателем NEXT будет его первая подстрока, а у этой подстроки, указатель PREV будет указывать на родителя. У второй подстроки - на первую строку, у последней подстроки - на следующую за родителем строку.&lt;br /&gt;&lt;br /&gt;Сейчас операторы NEXT работают с параметром X, и находят следующий от X элемент.&lt;br /&gt;Например: cex.articles.rows.next(Номер статьи)&lt;br /&gt;&lt;br /&gt;Это не очень удобно, хотябы потому, что возможны такие варианты:&lt;br /&gt;cex.articles.rows.next(cex.articles.rows.sel(title=="1 новость").first)&lt;br /&gt;&lt;br /&gt;Вместо логичного&amp;nbsp;cex.articles.rows.sel(title=="1 новость").first.next (и вообще если элемент поиска 1, то зачем first?)&lt;br /&gt;&lt;br /&gt;По этому я планирую ввести NEXT и FIRST также и в обработчике строки. При этом их значения будут равны их значению в админке (в отличие от предыдущего NEXT-а, где показывается следующий элемент в зависимости от любой входящей выборки).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Работа пользователя с собственными строками&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Для этого планируется несколько решений.&lt;br /&gt;&lt;br /&gt;1. &amp;nbsp;&lt;b&gt;Usel&lt;/b&gt;. Оператор, который выполняется над любым набором строк - выявляя только те, в которых присутствует поле "пользователь" с текущим пользователем. Usel("user") указывает на конкретный столбец, с которым нужно сравнивать пользователя (если у таблицы более 1 поля "пользователь"). Usel2 - выбирает те строки, которые непосредственно создал пользователь.&lt;br /&gt;Например: cex.articles.rows.usel&lt;br /&gt;&lt;br /&gt;2. &lt;b&gt;User.module.ex.table&lt;/b&gt;. Данная конструкция довольно громоздкая из-за необходимости указывать модуль, его экземпляр и таблицу (в предыдущем способе достаточно указать экземпляр и таблицу. Скорее всего будут упращения в виде user.cex.table или user.cm.ex.table&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Новые виды полей&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;"Группы" - ссылка на одну из групп пользователей, или на целый набор групп. Таким образом, мы сможем добавлять поле "Разрешить доступ для групп" в таблицу "Содержание" сайта. Далее, для каждой отдельной страницы мы сможем указывать для каких групп возможен доступ (если не отмечено - то доступ соответственно имеют все группы).&lt;br /&gt;&lt;br /&gt;Поле "Пользователь" возможно получит множественное значение.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-8334242043315939711?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/8334242043315939711/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_17.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/8334242043315939711'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/8334242043315939711'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_17.html' title='Улучшения внутренних функций и новые планы'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-4327656705862332500</id><published>2011-10-10T19:07:00.000-07:00</published><updated>2011-10-10T19:08:15.718-07:00</updated><title type='text'>Изменения в дизайне</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Наконец начались сдвиги по части дизайна системы. Огорчает то, что все плюшки значительно замедляют скорость работы. Так например строки в системе можно сортировать методом Drag&amp;amp;Drop, засчёт подключения компонента tableDnD. Однако не всё так просто. В наших данных есть не только таблицы, но и связные строки-подтаблицы. Чудом, но нам удолось реализовать перемещение связных строк синхронно друг с другом. Но косяки бывают если два раздела с подразделами начинать перемещать рядом друг с другом.&lt;br /&gt;&lt;br /&gt;Кроме этого, пользователи смогут видеть владельца строки данных и даже менять его.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Итак, за это время сделано&lt;/b&gt;:&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Сортировка строк методом Drag&amp;amp;Drop&lt;/li&gt;&lt;li&gt;Замена большенства функций иконками&lt;/li&gt;&lt;li&gt;Обзор и изменение владельца строки&lt;/li&gt;&lt;li&gt;Изменён механизм развёртки подстрок&lt;/li&gt;&lt;li&gt;Переработан механизм выбора всех строк (теперь работает и в IE)&lt;/li&gt;&lt;li&gt;Строки, отмеченные галочкой, а также неактивные строки теперь выделяются на фоне остальных&lt;/li&gt;&lt;/ol&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-q6tKY-HXocc/TpOk4XuaPdI/AAAAAAAAABQ/x2CrRHIt6UE/s1600/e5scr.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="196" src="http://3.bp.blogspot.com/-q6tKY-HXocc/TpOk4XuaPdI/AAAAAAAAABQ/x2CrRHIt6UE/s400/e5scr.jpg" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-4327656705862332500?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/4327656705862332500/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_10.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/4327656705862332500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/4327656705862332500'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_10.html' title='Изменения в дизайне'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-q6tKY-HXocc/TpOk4XuaPdI/AAAAAAAAABQ/x2CrRHIt6UE/s72-c/e5scr.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-8599214436346913371</id><published>2011-10-06T03:49:00.000-07:00</published><updated>2011-10-06T03:49:06.215-07:00</updated><title type='text'>Проблемма с авторским правом</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;В силу привычки, и для того, чтобы побыстрее сделать пробный рабочий материал, я брал разные иконки и ява-скрипты, которые совершенно точно принадлежат разным авторам.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Gep_kmKm4lI/To2HgAa-51I/AAAAAAAAABM/ry4w7T4RpTE/s1600/7154%255B1%255D.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-Gep_kmKm4lI/To2HgAa-51I/AAAAAAAAABM/ry4w7T4RpTE/s320/7154%255B1%255D.jpg" width="232" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;strong&gt;Иконки&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Иконки я подбирал на сайте findicons.com. Если кто-то знает, можно ли свободно использовать иконки с этого сайта - пожалуйста сообщите. Т.к. авторов многих иконок попросту не найти, а они уже прижились в системе. Вроде бы большинство коллекций иконок просто требуют установки ссылки на них. Придётся либо перерисовывать все иконки, либо выпускать как есть. А затем, если авторы будут делать запросы, то в системе будут появляться ссылки на них.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Java-скрипты&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Некоторые функции приходилось копировать из открытых источников (например аналог функции explode и т.д.). После того, как я в очередной раз скопировал очередной скрипт, заметил, что на автомате я копировал только скрипт, без комментариев выше него, в котором указывался автор. Авторов ява-скриптов найти проще (по части скрипта, вбив его в поисковик). Этим и придётся заняться по факту выпуска системы.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Flash, JQuery и Mootools плагины&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;В систему встроены разные фотогалереи (HighSlide, Milkbox, Shadowbox, Colorbox), карусели, ротаторы и прочие плюшки. У них авторы указаны в файлах скриптов, но нужно ли указывать их дополнительно в системе? Ещё есть флеш-компоненты для загрузки изображений, отображения слайдшоу и перелистывающийся журнал.&lt;br /&gt;&lt;br /&gt;Может подойдёт такой вариант - саму систему сделать пустой, а подобные плагины предлагать подгружать с "левых" серверов обновлений.&lt;br /&gt;&lt;br /&gt;Может я заморачиваюсь? Ведь система будет бесплатной.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-8599214436346913371?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/8599214436346913371/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_06.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/8599214436346913371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/8599214436346913371'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_06.html' title='Проблемма с авторским правом'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-Gep_kmKm4lI/To2HgAa-51I/AAAAAAAAABM/ry4w7T4RpTE/s72-c/7154%255B1%255D.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-8959663457523223234</id><published>2011-10-04T12:57:00.000-07:00</published><updated>2011-10-05T01:30:13.186-07:00</updated><title type='text'>Приступаем к созданию редактора шаблонов</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;b&gt;Наконец-то этот день настал&lt;/b&gt;. Воспользовавшись свободной минуткой, мне удалось накидать на листке бумаги схему редактора, которая мне кажется самой оптимальной из всех, которые приходили на ум раньше. Сейчас эта схема красуется у меня на столе, в виде мне одному понятных каракулей. Это уже не первая схема. Как-нибудь я соберу все эти листочки, отсканирую и выложу в блог, чтобы мы все над ними посмеялись.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Что из себя будет представлять редактор&lt;/b&gt;? Я ещё не решил что взять за основу. Либо это будет WYSIWYG &lt;b&gt;CKeditor&lt;/b&gt; (с которым у меня очень большой опыт общения, по сути я разобрал его вдоль и поперёк ещё тогда, когда он был &lt;b&gt;FCKEditor&lt;/b&gt;-ом), либо придётся писать свой редактор.&lt;br /&gt;&lt;br /&gt;Писать свой редактор означает для меня &lt;b&gt;+3 месяца&lt;/b&gt; к разработке системы, либо придётся ограничиваться базовым функционалом (жирность, выравнивание, ссылки, цвет текста). Вставка таблиц и изображений уже представляет определённые трудности.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-O3GnFrQv2N4/TotZiBgzkeI/AAAAAAAAABI/lxBwNwffpo4/s1600/04217038.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="239" src="http://3.bp.blogspot.com/-O3GnFrQv2N4/TotZiBgzkeI/AAAAAAAAABI/lxBwNwffpo4/s320/04217038.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;Всего четыре кнопки&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;На самом деле кнопок будет больше, но начнём мы с четырёх:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Вставка значения X&lt;/li&gt;&lt;li&gt;Перебор (например перебор строк таблицы, вывод всех новостей и т.д.) элементов X&lt;/li&gt;&lt;li&gt;Условие (если Y, то выполняется одна часть шаблона, если не Y, то другая)&lt;/li&gt;&lt;li&gt;Компоненты и спец.команды (вроде команды выхода из перебора)&lt;/li&gt;&lt;/ul&gt;Для того, чтобы прочитать ещё 2 тонны текста, нажмите на ссылку "Дальше".&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;Как мы видим, у нас есть два типа элементов: X - данные, Y - условие.&lt;br /&gt;Условие Y состоит в свою очередь из данных X (например, Y будет правдой, если X1==X2 или X3&amp;lt;X4).&lt;br /&gt;&lt;br /&gt;При этом X может быть либо значением, либо набором значений. Значение используется в одних случаях (например, в вставке значения), а массив (набор элементов) в другом (например в переборе).&lt;br /&gt;&lt;br /&gt;Таким образом, редактирование шаблона сводится к написанию самого текста (если он нужен), определению HTML вёрстки (которую можно сделать теми же средствами визуального редактора) и вставке в нужных местах Значений, Переборов, Условий и Компонентов.&lt;br /&gt;&lt;br /&gt;После вставки значения или вставки перебора, перед нами открывается диалог выбора переменной, которую мы будем использовать. Диалог нельзя будет закрыть до тех пор, пока вы не выберите нужную переменную (как уже писалось выше, в одном случае переменная должна быть массивом, а в другом - обычным значением).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Из чего выбирать переменные&lt;/b&gt;? Это будет зависить от того, чей шаблон вы редактируете. Если это часть модуля, то перед вами будут данные всех таблиц этого модуля (пример рассмотрим далее) и этой части. А если вы будете редактировать шаблон компонента, то перед вами будут только переменные этого компонента.&lt;br /&gt;&lt;br /&gt;В случае, если мы &lt;b&gt;редактируем часть модуля&lt;/b&gt; (про устройства модулей поговорим позднее), перед нами будет набор из следующих элементов:&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Переменные строки, которая была обнаружена при URL-разборе (про URL разбор и ЧПУ также поговорим в другой раз).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Пример&lt;/b&gt;: в модуле "Новости" есть таблица "Метки новостей", эта таблица связана с частью "Содержимое метки". В случае, если пользователь заходит по адресу /news/metka1, нас направляют на часть вывода метки и выводится будет строка, с URL "metka1". Таким образом, в части выводе метки у нас будут доступны переменные таблицы "Метки новостей" (например "Название метки", "Описание метки").&lt;/li&gt;&lt;li&gt;Переменные текущей перебираемой строки (если мы вызвали диалог в теле перебора)&lt;/li&gt;&lt;li&gt;Набор строк таблиц, которые находятся в модуле (например "Все новости" или "Активные новости")&lt;/li&gt;&lt;li&gt;Переменные: созданные по мере выполнения части, переменные самой части, переменные экземпляра модуля или глобальные переменные.&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;Рассмотрим тривиальную задачу&lt;/b&gt;: в модуле Новости нам нужно сделать часть, которая будет выводить все новости. У нас уже создана таблица новостей, с полями: "Анонс", "Дата", "URL".&lt;br /&gt;Для этого нажимаем "Вставить перебор" и в нём выбираем таблицу "Новости". Далее, в теле этого цикла нажимаем "Вставить значение", выбираем "Значение текущего перебора" и в нём "Анонс", "Дата" и "URL" соответственно.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Модификаторы данных&lt;/b&gt;. Согласитесь, не всегда данные имеют тот вид, который нам необходим. Для этого, после выбора данных, вы можете установить на них модификатор. К примеру, вам нужно вывести количество новостей. Для этого нажимаете "Вставить значение" и выбираем таблицу "Новости". После этого добавляем модификатор "Посчитать количетсво элементов". Допускается многоуровневое наложение модификаторов.&lt;br /&gt;&lt;br /&gt;Модификаторы имеют тип входных данных (массив или значение), тип выходных данных (массив или значение) и набор переменные (X или Y, т.е. значение/массив значений или условие). При указании переменной модификатора, перед нами открывается такое же окно поиска Значения, поверх текущего окна - и так до бесконечности. Ествественно модификаторы могут накладываться друг на друга соответсвенно своим входным и выходным данным. Диалог поиска значений невозможно закрыть до тех пор, пока вы не приведёте данные в нужный вид (значение или массив). Как уже писалось выше, это зависит от того, для чего вы используете эти данные - в перебор принимаются только массивы.&lt;br /&gt;&lt;br /&gt;Модификаторы и их свойства жёстко привязаны к ядру системы.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Компоненты системы&amp;nbsp;&lt;/b&gt;позволят облегчить решение большинства задач. Уже сейчас имеются компоненты для постраничной разбивки, генерации форм, работы с Ajax, массовой загрузки фотографий. Визуальный редактор также является компонентом системы. Сами по себе эти элементы делятся на: отображения, компоненты, функции и формы.&lt;br /&gt;&lt;br /&gt;Компоненты, в отличие от модификаторов, могут быть загружены с сервера обновлений, либо изменены/добавлены самостоятельно.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Исходный код&lt;/b&gt;. Пока визуальный редактор шаблонов находится в разработке, все модули пишутся на специальном языке шаблонизатора Е5, который сейчас насчитывает 300 различных комманд. Их синтаксис будет доступен для всех разработчиков, которые пожелают разрабатывать модули на системе, без использования визуального редактора.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Пример вывода древовидного меню&lt;/b&gt;:&lt;br /&gt;&lt;br /&gt;--------------------------------------------------------------------&lt;br /&gt;[tree cex.pages.rows]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;lt;div style="padding-left: [10*step]px"&amp;gt; - &amp;lt;a href="[cur.wayback3]"&amp;gt;[cur.title]&amp;lt;/a&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;[/tree]&lt;br /&gt;-------------------------------------------------------------------- &lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;tree - перебор&lt;/div&gt;&lt;div style="text-align: left;"&gt;cex - текущий экземпляр модуля&lt;/div&gt;&lt;div style="text-align: left;"&gt;pages.rows - активные страницы сайта&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;step - текущий уровень вложенности цикла&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;cur - текущий элемент цикла (страница сайта)&lt;/div&gt;&lt;div style="text-align: left;"&gt;title - заголовок страницы&lt;br /&gt;wayback3 - возвращает значения URL-полей, начиная с самой верхней страницы сайта (при многоуровневой структура), заканчивая текущей, которые объединены знаком "/", например: "about/company/employers"&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-8959663457523223234?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/8959663457523223234/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_04.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/8959663457523223234'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/8959663457523223234'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_04.html' title='Приступаем к созданию редактора шаблонов'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-O3GnFrQv2N4/TotZiBgzkeI/AAAAAAAAABI/lxBwNwffpo4/s72-c/04217038.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-5316076912403356898</id><published>2011-10-03T11:46:00.000-07:00</published><updated>2011-10-03T21:00:56.916-07:00</updated><title type='text'>Пару слов об экземплярности</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Предупреждаю заранее, что большую часть этого сообщения я писал лёжа на диване, далеко от монитора, а зрение у меня не очень, по этому извините за опечатки.&lt;br /&gt;&lt;br /&gt;В прошлом сообщении я опубликовал схему доступа к данным системы. Глядя на неё, первым вопросом будет вопрос "&lt;b&gt;АААА&lt;/b&gt;!!!&lt;b&gt; Зачем всё так сложно&lt;/b&gt;???!!". А точнее "&lt;b&gt;что такое экземпляр&lt;/b&gt;? зачем столько разных экземпляров? экземпляр модуля, экземпляр таблицы, связи между экземплярами, между строками и ещё между какими-то подтаблицами".&lt;br /&gt;&lt;br /&gt;Одной из целей &lt;b&gt;Е5&lt;/b&gt; была возможность осуществлять как можно больше задач построения сложных структур сайтов. Как известно, большая гибкость осуществляется большой сложностью ядра и структуры данных системы.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-be3Ai79jZbU/TooD6CrnWPI/AAAAAAAAABE/1tXdueq5x9o/s1600/0013kdkw.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="192" src="http://1.bp.blogspot.com/-be3Ai79jZbU/TooD6CrnWPI/AAAAAAAAABE/1tXdueq5x9o/s320/0013kdkw.jpeg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div align="center"&gt;(если вы не готовы к &lt;b&gt;МНОГА БУКОФ&lt;/b&gt;, то не идите по ссылке "дальше")&lt;/div&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Экземпляр модуля&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Мы не будем брать в пример задачи, когда нам нужно уместить два сайта на одной системе. Для начала возьмём простую задачу - сделать две новостные ленты. Даже на сегодняшний день многие популярные движки не имеют такой возможности, а которые и имеют, то обычно ограничиваются поддержкой экземплярности лишь некоторых основных модулей (обычно это ленты статей и страниц сайта). Создание двух лент явдяется поддержкой экземплярности модулем "Новостные ленты".&lt;br /&gt;&lt;br /&gt;В системе Е5 каждый модуль можно "экземплярить" сколько угодно раз. При этом экземпляр модуля не будет полной копией всего модуля. Экземплярность применяется только к данным. Структура и обработчики модуля остаются одними и теми же.&lt;br /&gt;&lt;br /&gt;В Е5 вы можете создать сайт, добавить к нему новый экземпляр модуля "содержание" - &lt;b&gt;страницы сайта&lt;/b&gt;, затем добавить два экземпляра модуля "новости" - &lt;b&gt;новости сайта&lt;/b&gt; и &lt;b&gt;новости компании&lt;/b&gt;. Затем добавить экземпляр модуля "статьи" - &lt;b&gt;ленту статей&lt;/b&gt;. Затем вы можете создать ещё один сайт, добавить к нему ещё один экземпляр модуля "содержание", и уже имеющийся экземпляр модуля "статей" - &lt;b&gt;ленту статей&lt;/b&gt;. Таким образом мы можем транслировать один и тот же экземпляр в сколь угодно разных местах, и добовлять сколь угодно разных экземпляров на сайты.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Экземпляр таблиц&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Раз есть экземпляры модулей, значит нам понадобятся и экземпляры таблиц. Можно было бы просто делать в строках ссылку на экземпляр модуля, но тогда мы бы упустили некоторые важные решения (о них ниже).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Связка экземпляров таблиц с экземпляроми модулей&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Эта идея пришла не сразу. Те герои, которые смогли дочитать до этого места наверняка сказали себе "всё, теперь я точно ничего не понимаю".&lt;br /&gt;&lt;br /&gt;В чём суть? Допустим у нас в системе есть 5 новостных лент (5 экземпляров модуля "Новости"), при этом кроме таблицы "Новости" там также есть таблица "Подписчики". И вот тут загвоздка. Клиент хочет, чтобы у первых трёх лент были общие подписчики, а у всех остальных отдельные. Как реализовать такое? Именно по этому и были созданы&lt;b&gt; экземпляры таблиц&lt;/b&gt; и их связи с экземплярами модулей. Таким образом, после создания требуемой заказчиком системы, мы получим: 5 экземпляров таблиц "новости", 3 экземпляра таблиц "подписчики". Первые три экземпляра модуля будут связаны поочерёдно с трёмя экземплярами таблицы "новости" и с одним экземпляром таблицы "подписчики", а каждый из следующих двух экземпляров будет связан с одним экземпляром "новости" и "подписчиков". Уф..... Надеюсь вы что-нибудь поняли.&lt;br /&gt;&lt;br /&gt;При создании каждого экземпляра модуля, пользователь выбирает для каждой таблицы отдельно - создавать ей новый экземпляр или использовать один из существующих. Для того, чтобы не затруднять пользователя этими сложностями, разработчик модуля заранее определяет умолчания для таблиц - какие таблицы будут по умолчанию создаваться в одном экземпляре, а какие во множественном. Так, например, таблица "Страницы" модуля "Содержание" по умолчанию будет создаваться для каждого экземпляра модуля отдельно, а таблица "Шаблоны дизайна" будет общей для всех экземпляров.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Связи строк&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Вначале хотелось сделать обычную структуру строк - дерево. Но потом мне пришла странная мысль (уже не знаю почему), сделать возможность присоединения одной и той же строки к разным экземплярам или к разным строкам-родителям. В принципе, это удобно (примерно также можно присоединять ноды в друпале). Но для этого пришлось делать специальную таблицу связей строк друг с другом и честно говоря, если сейчас вернуться на этап начальной разработки, то я бы отказался от этой идеи. Именно из-за неё теряется треть скорости загрузки страниц и возможны некоторые серьёзные ошибки (я только догадываюсь об их существовании).&lt;br /&gt;&lt;br /&gt;Общий смысл - вы можете создать дерево разделов на сайте, например раздел "О компании" и к нему куча подразделов - отдельные страницы для всех сотрудников, обширная история и т.д. Затем такую же структуру вам нужно продублировать в закрытом разделе. Что делать? Просто нажимаете "подчинить" рядом со строкой, и выбираете ей нового родителя. Вуаля! Теперь информация проецируется сразу на два раздела. При этом, изменив её в одном месте, она меняется во всех. Подобное устройство строк данных доступно в некоторых современных CMS.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Экземпляр системы&lt;/b&gt; (зоны)&lt;br /&gt;&lt;br /&gt;Практически на каждом сайте существуют несколько рабочих зон. Обычно 1-ая зона это клиентская часть (сам сайт), а вторая зона - админка. Есть более сложные сайты, внутри которых сотни подсайтов, каждый из которых также представляет из себя зону (экземпляр системы).&lt;br /&gt;&lt;br /&gt;В последнее время стало модно использовать мультидоменные CMS, т.е. такие системы управления, которые позволяют работать сразу с несколькими доменами (при этом каждый новый домен может быть отдельным сайтом, а сама система размещается на одном веб-сервере).&lt;br /&gt;&lt;br /&gt;В системе Е5 можно создавать неограниченное количество зон. Каждая зона может быть присоединена либо к домену (www.test.ru), либо к папке внутри домена (www.test.ru/admin), либо к папке во всех доменах (/admin).&lt;br /&gt;&lt;br /&gt;Зона может нескольких типов:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Ссылаться на экземпляр модуля, который будет обрабатывать все её запросы&lt;/li&gt;&lt;li&gt;Вести в админку&lt;/li&gt;&lt;li&gt;Ссылаться на сервер-обновлений&lt;/li&gt;&lt;li&gt;Ссылаться на другую зону (зона-ярлык)&lt;/li&gt;&lt;/ul&gt;Таким образом, вы можете прикрепить к системе неограниченное количество доменов, каждый из которых будет отдельным сайтом, некоторые домены могут быть слиты в один сайт, и на всех них папка /adm или /admin будет открывать доступ в админку.&lt;br /&gt;&lt;br /&gt;Благодаря продвинутой системе доступов, в Е5 можно создать большое количество разнообразных закрытых зон для различных групп пользователей, или даже закрытых сайтов. Например, для одних пользователей вход в админку будет доступен по адресу /admin, а для других - по адресу /manager. Одни пользователи смогут заходить на сайт www.test.ru, а другие не смогут. Кроме того, можно сделать две зоны на один домен или на одну папку, и одним пользователям показывать один сайт, а другим пользователям показывать другой сайт, по тому же адресу.&lt;br /&gt;&lt;br /&gt;В настройке зон есть специальный пункт "&lt;b&gt;IP-конфигурация&lt;/b&gt;", который позволяет делать зону доступной (или недоступной). для:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Определённого IP-адреса&lt;/li&gt;&lt;li&gt;Диапозона адресов&amp;nbsp;&lt;/li&gt;&lt;li&gt;Пользователей определённого города или страны (для этого используется определение по базе WHOIS, одного известного ресурса)&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Эти доступы можно комбинировать между собой. Таким образом, вы можете сделать сайт www.test.ru на русском языке, для посетителей из России и Украины, и на английском, для зарубежных гостей. При этом этот сайт будет совсем недоступен для всех жителей Москвы, но будет доступен для вашего IP-адреса, даже если вы будете в Москве.&lt;br /&gt;&lt;br /&gt;Зоны поддерживают распознование кириллических доменов (за это отдельное спасибо разработчику модуля дешифратора XN доменов, о нём я писал в предыдущих постах, правда пришлось допиливать этот модуль, чтобы он корректно работал и на PHP5 и на PHP4).&lt;br /&gt;&lt;br /&gt;Кстати экземплярность системы не достягается засчёт зон. Зоны это всего-лишь ссылки на экземпляры модуля. А вот уже засчёт них и достягается экземплярность системы.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Надеюсь в следующий раз я напишу в три раза меньше текста и в два раза понятней.&amp;nbsp;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-5316076912403356898?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/5316076912403356898/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_4700.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/5316076912403356898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/5316076912403356898'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_4700.html' title='Пару слов об экземплярности'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/-be3Ai79jZbU/TooD6CrnWPI/AAAAAAAAABE/1tXdueq5x9o/s72-c/0013kdkw.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-394190693794617392</id><published>2011-10-03T08:50:00.000-07:00</published><updated>2011-10-24T11:14:24.970-07:00</updated><title type='text'>Структура данных</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Этот пост будет изобиловать разными техническими терминами, по этому новичкам рекомендую его обходить десятой дорогой.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-1aDNQ0MaRzg/TonCcmMlDTI/AAAAAAAAAAw/RMh2eMAHfD8/s1600/9129669_STP85450.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="105" src="http://2.bp.blogspot.com/-1aDNQ0MaRzg/TonCcmMlDTI/AAAAAAAAAAw/RMh2eMAHfD8/s200/9129669_STP85450.jpg" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Одной из идей системы было то, что любое изменение делается напрямую из админки, и пользователь никак не затрагивает MySQL или файлы на сервере. А это означает, что структура баз данных не должна зависеть от сложности проекта и изменение проекта (добавление модулей, компонентов, данных) никак не должны сказываться на структуре. Т.е. нам нужна максимально ёмкая структура.&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;b&gt;Стандартный подход к данным&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Все мы привыкли к структуре, в которой таблица данных MySQL привязывается к модулю (или несколько таблиц). В каждой таблице есть набор столбцов (переменных модуля), и набор строк, в которых и хранится вся информация модуля.&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-0CGlepi57wk/TonOjMda37I/AAAAAAAAAA0/RSB0NZ3YOaA/s1600/mysql.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/-0CGlepi57wk/TonOjMda37I/AAAAAAAAAA0/RSB0NZ3YOaA/s1600/mysql.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Такой &lt;b&gt;способ хранения данных в MySQL&lt;/b&gt; универсален и позволяет создавать любые модули, но есть некоторые моменты, ограничивающие её удобства:&lt;br /&gt;- Если мы хотим добавить, например поле "Город" в таблице комментариев, то необходимо добавлять столбец Town через MySQL (некоторые CMS предоставляют специальное API), затем редактировать административный раздел, в котором показываются комментарии и (самое главное) - редактировать шаблоны вывода комментариев и формы его добавления (если шаблонов нет, то напрямую в исполняемом .php файле)&lt;br /&gt;- Связь между таблицами нужно устанавливать вручную с помощью специальных полей-ссылок&lt;br /&gt;- Многоуровневую структуру строк таблицы можно организовать только прикрутив специальное поле, которое будет означать владельца строки&lt;br /&gt;&lt;br /&gt;Все эти пункты значительно утяжеляют разработку и модификацию модулей для CMS, усложняют SQL запросы.&lt;br /&gt;&lt;br /&gt;Для CMS-систем одним из важных требований является возможность обновления существующих модулей. Обновление может подразумевать добавление/удаление таблиц из модуля, и добавление/модификацию/удаления столбцов таблицы. Тем самым, общепринятая структура хранений данных в MySQL делает обновление модулей чрезвычайно сложной операцией. Например, обновление осуществляется не только заменой нужных .php файлов, но также загрузкой и запуском специального файла, который производит необходимые действия с базой данных.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Виртуализация данных&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Суть виртуализации заключается в том, что структура, которую видит пользователь на сайте или в админке, отличается от её представления в СУБД MySQL.&lt;br /&gt;&lt;br /&gt;В &lt;b&gt;Е5&lt;/b&gt; существует ограниченный набор таблиц, каждая из которых отвечает за свою логическую составляющую системы. Таким образом, все модули системы &lt;b&gt;Е5&lt;/b&gt; хранятся в 5 таблицах:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Модули&lt;/li&gt;&lt;li&gt;Таблицы модулей&lt;/li&gt;&lt;li&gt;Столбцы таблиц&lt;/li&gt;&lt;li&gt;Строки таблиц&lt;/li&gt;&lt;li&gt;Значение столбцов строк&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;Кроме этого, существуют дополнительные таблицы, которые обеспечивают связь, между таблицами (подчинение таблиц), строками (у одной и той же строки может быть несколько строк-владельцев) и экземплярами (про экземплярность поговорим позднее). Ещё есть специальные таблицы, отвечающие за разграничение прав доступа (пользователи, группы, права).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Сейчас система использует 19 таблиц&lt;/b&gt;. Из них 1 совсем бесполезная (используется для внутренней почты между пользователями системы).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Плюсы виртуализации&lt;/b&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Работа с расширением модулей никак не затрагивает структуру БД&lt;/li&gt;&lt;li&gt;Внутринние связи между разными данными модулей поддерживает ядро системы (т.е. для реализации сложной структуры данных достаточно работать с админкой) - многоуровневость строк, экземплярность модулей, связи между строками и таблицами и т.д.&lt;/li&gt;&lt;li&gt;Не будет необходимости наделять одним и тем же (уже имеющимся в арсенале) функционалом разные модули. В Е5 одно и тоже решение можно применять к разным модулям, таблицам и данным.&lt;/li&gt;&lt;li&gt;Улучшение CMS (наделение её ещё большим функционалом) будет использоваться сразу всеми модулями и всеми данными, при этом их структура останется прежней (например, совсем недавно мы ввели систему доступов к данным, которая стала доступна для всех имеющихся модулей, при этом мы абсолютно не затрагивали структуру этих модулей).&lt;/li&gt;&lt;li&gt;Нет необходимости создавать дополнительные таблицы для новых модулей, а также для дополнительных экземпляров системы или экземпляра модуля.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;&amp;nbsp;Минусы виртуализации&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Доступ к данным из PHP возможен только через API&lt;/b&gt; системы, либо через специальный язык шаблонов (в принципе, этим страдают многие CMS, у которых нет виртуализации данных, как таковой)&lt;br /&gt;&lt;b&gt;Решение&lt;/b&gt;: использование удобного визуального конструктора шаблонов, который сведёт на нет необходимость использования PHP. Уже сейчас язык шаблонов насчитывает порядка 300 комманд.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;В конечном итоге, все данные размещаются в фиксированном количестве таблиц, из-за чего эти &lt;b&gt;таблицы раздуваются до очень больших размеров&lt;/b&gt;.&lt;br /&gt;&lt;b&gt;Решение&lt;/b&gt;: в Е5 все таблицы имеют необходимые индексные поля, которые снижают нагрузку на БД, связанную с их объёмом. Планируется разделять таблицы, при существенном их увеличении. Также планируется вводить поддержку установки системы сразу на нескольких серверах, для оптимизации работы (для очень крупных проектов).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Увеличение нагрузки на сервер&lt;/b&gt;. Виртуализация добавляет промежуточные этапы, между запросом пользователя и непосредственному доступу к данным. Преобразование физической структуры данных к логической &lt;b&gt;занимает некоторое дополнительное время&lt;/b&gt;, чего не происходит в обычных CMS, использующих прямую работу с MySQL.&lt;/li&gt;&lt;/ul&gt;&lt;b&gt;Можно резюмировать&lt;/b&gt;: виртуализация данных имеет место быть при наличии правильного ядра системы, которое обеспечит максимальное удобство и скорость выполнения всех необходимых операций с данными. А также, при наличии правильного языка шаблонов (а ещё лучше - визуального конструктора шаблонов), который удовлетворял бы все современные нужды веб-разработчика.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;Так выглядит &lt;b&gt;структура данных&lt;/b&gt; в Е5 (для просмотра нажмине на миниатюру):&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-RCtqGw68tJA/Tonsh8Bq-fI/AAAAAAAAAA8/bOtxZET0njU/s1600/ss5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="133" src="http://3.bp.blogspot.com/-RCtqGw68tJA/Tonsh8Bq-fI/AAAAAAAAAA8/bOtxZET0njU/s320/ss5.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&amp;nbsp;&lt;b&gt;&lt;br /&gt;Схема доступа к данным&lt;/b&gt;:&lt;a href="http://4.bp.blogspot.com/-nByuXXg2N4E/TonohS1oKSI/AAAAAAAAAA4/jDEVoiORahI/s1600/ss5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-ZaNSc_tb81g/Tonz29FnmKI/AAAAAAAAABA/O_MBERLXAxk/s1600/ss7.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-ZaNSc_tb81g/Tonz29FnmKI/AAAAAAAAABA/O_MBERLXAxk/s320/ss7.jpg" width="238" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-394190693794617392?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/394190693794617392/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_03.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/394190693794617392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/394190693794617392'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_03.html' title='Структура данных'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-1aDNQ0MaRzg/TonCcmMlDTI/AAAAAAAAAAw/RMh2eMAHfD8/s72-c/9129669_STP85450.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-7118478004208679914</id><published>2011-10-02T15:27:00.000-07:00</published><updated>2011-10-02T15:27:16.862-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Вести с полей'/><title type='text'>Что нового сегодня?</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;br /&gt;1. Значительно &lt;strong&gt;ускорена работа с правами доступа&lt;/strong&gt;. А именно - ускорена отправка формы на сервер. Если раньше на сервер отправлялись тысячи кнопок по отдельности, то теперь они вначале компилируются в одно текстовое поле, и уже оно отправляется. Перекладываем нагрузки с сервера на клиента.&lt;br /&gt;&lt;br /&gt;Кстати в систему уже встроен &lt;strong&gt;мульти-аплодер изображений&lt;/strong&gt;, который &lt;strong&gt;сжимает&lt;/strong&gt; фотографии &lt;strong&gt;на стороне клиента&lt;/strong&gt;. Вы можете задавать ширину и высоту желаемых миниатюр в настройках. Этот аплдер легко привязывается к любому модулю галерей. К сожалению я потерял автора самого аплодера, может быть кто-нибудь из читателей вспомнит. Прилагаю скрин аплодера:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-n980KZOtGok/TojkJoxHkUI/AAAAAAAAAAs/NRv8qhbNsfc/s1600/ss4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="138" src="http://2.bp.blogspot.com/-n980KZOtGok/TojkJoxHkUI/AAAAAAAAAAs/NRv8qhbNsfc/s320/ss4.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Правда его пришлось перекомпилировать (благо автор предоставил исходный код), и теперь в нём есть русский язык и поддержка выставления произвольной ширины и высоты. Этот плагин экономит просто кучу времени. Мне часто приходится грузить сотни мегабайтов на сервер. Правда при одновременной обработки 20 фотографий (каждая по 5мбайт), флеш начинает сжирать до 2гб (!!) оперативной памяти.&lt;br /&gt;&lt;br /&gt;2. &lt;strong&gt;Появилось больше полезных ссылок&lt;/strong&gt; в навигации. Так, например, стало возможным перейти к редактированию экземпляра модуля прямиком из редактируемой таблицы данных (если экземпляром является строка-родитель из верхней таблицы, то переходим на редактирование этой строки).&lt;br /&gt;&lt;br /&gt;Также стало возможным приглашение пользователей в группу прямиком из нужной группы. Раньше для этого нужно было редактировать нужного пользователя и отмечать галочками группы, в которых он участвует.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-7118478004208679914?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/7118478004208679914/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_9290.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/7118478004208679914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/7118478004208679914'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_9290.html' title='Что нового сегодня?'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-n980KZOtGok/TojkJoxHkUI/AAAAAAAAAAs/NRv8qhbNsfc/s72-c/ss4.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-5235063692464654955</id><published>2011-10-02T10:32:00.000-07:00</published><updated>2011-10-02T10:34:02.663-07:00</updated><title type='text'>Конфликт решён</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div style="text-align: left;"&gt;Больше пришлось переживать :) Конечно не все так гладко, как хотелось бы, но ошибка устранилась. Правда магия в коде только увеличилась, но теперь всё работает.&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-MzBRI3UyV6Y/ToibC2mo6nI/AAAAAAAAAAo/ahzPySFhGCM/s1600/367414-y.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="212" src="http://2.bp.blogspot.com/-MzBRI3UyV6Y/ToibC2mo6nI/AAAAAAAAAAo/ahzPySFhGCM/s320/367414-y.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;Как и предполагалось, проблемма возникала при проверке группового доступа к модулям. При проверке каждой группы, вначале проверялся доступ для всех модулей, затем из него исключался доступ каждого конкретного модуля (если он указан специфически). Именно тут скрывалась ошибка.&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;Изначально код выглядел так&lt;/b&gt;:&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;//&lt;strong&gt;Доступы по умолчанию&amp;nbsp;&lt;/strong&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;$rules=load_perms(0,0,0,$rules); // Загрузка доступов для всех модулей&lt;br /&gt;$rules=load_perms(0,1,0,$rules,1); &amp;nbsp;// Перекрывание доступов конкретных модулей&lt;/div&gt;&lt;div style="text-align: left;"&gt;//&lt;strong&gt;Доступы для групп&lt;/strong&gt;&amp;nbsp;&lt;/div&gt;&lt;div style="text-align: left;"&gt;foreach($user-&amp;gt;group AS $gr){&lt;br /&gt;&amp;nbsp; $rules=load_perms($gr,0,0,$rules); //Загрузка&lt;br /&gt;&amp;nbsp; $rules=load_perms($gr,1,0,$rules,1); //Перекрывание *&lt;/div&gt;&lt;div style="text-align: left;"&gt;}&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;* - именно из-за этого перекрывания, перекрывались не доступы текущей перебираемой группы, а вообще все доступы&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;По этому мы добавили новую переменную rules2&lt;/b&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;foreach($user-&amp;gt;group AS $gr){&lt;br /&gt;&amp;nbsp; $rules2=load_perms($gr,0,0,$rules);&lt;br /&gt;&amp;nbsp; $rules2=load_perms($gr,1,0,$rules2,1); //перекрываются не все доступы, а только текущей группы&lt;br /&gt;&amp;nbsp; $rules=merge_perm2($rules,$rules2); //функция сливания привелегий&lt;br /&gt;}&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-5235063692464654955?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/5235063692464654955/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_7600.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/5235063692464654955'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/5235063692464654955'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_7600.html' title='Конфликт решён'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-MzBRI3UyV6Y/ToibC2mo6nI/AAAAAAAAAAo/ahzPySFhGCM/s72-c/367414-y.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-4615664223781149569</id><published>2011-10-02T09:04:00.000-07:00</published><updated>2011-10-02T09:20:57.512-07:00</updated><title type='text'>Серьёзный конфликт доступов</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Вот уже на протяжении трёх месяцев логика распределения доступа проходила постоянные улучшения и изменения. Сегодня был замечен очередной логический тупик.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-JOlsIVB6Meg/ToiLhQtWf-I/AAAAAAAAAAk/Tyz7Rjx1Kcg/s1600/56379.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="190" src="http://2.bp.blogspot.com/-JOlsIVB6Meg/ToiLhQtWf-I/AAAAAAAAAAk/Tyz7Rjx1Kcg/s320/56379.jpeg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;В чём его суть&lt;/b&gt;? Допустим у нас есть две группы пользователей. Одним всё разрешено, а другим всё запрещено. Теперь мы добавляем одного и того же пользователя в обе эти группы. По нашим правилам доступы должны складываться в пользу "Разрешить", но увы мы видим запрет для пользователя.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Из-за чего сырбор&lt;/b&gt;? Конечные права доступа выясняются при сложении следующих сущностей - прав по умолчанию + прав всех групп, в которых участвует пользователь + прав самого пользователя. И видимо на втором этапе, права складываются не так, как следует. Всему виной чрезмерное обилие магии в коде. Чтож... будем разбираться.&lt;br /&gt;&lt;br /&gt;Хотелось сегодня посвятить день разработке визуального редактора шаблонов, но к сожалению предётся возиться с системой доступов. Надеюсь оно того стоит.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-4615664223781149569?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/4615664223781149569/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_02.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/4615664223781149569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/4615664223781149569'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_02.html' title='Серьёзный конфликт доступов'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-JOlsIVB6Meg/ToiLhQtWf-I/AAAAAAAAAAk/Tyz7Rjx1Kcg/s72-c/56379.jpeg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-1042281657121360194</id><published>2011-10-01T10:40:00.000-07:00</published><updated>2011-10-05T20:50:40.867-07:00</updated><title type='text'>Вести с полей</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;До открытия тестирования системы осталось завершить несколько финальных штрихов. Но ведь это самое сложное - подвести черту, после которой уже нельзя будет отмотать назад и сделать иначе.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Что же осталось доработать&lt;/b&gt;?&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Визуальный редактор для языка шаблонов&lt;/li&gt;&lt;li&gt;Дизайн административного кабинета&lt;/li&gt;&lt;li&gt;Шаблоны таблиц&lt;/li&gt;&lt;li&gt;Обновление модулей и компонентов (сейчас доступна только их загрузка)&lt;/li&gt;&lt;li&gt;Статистика посещаемости&lt;/li&gt;&lt;li&gt;Сортировка и фильтрация строк в админке&lt;/li&gt;&lt;li&gt;Правильная обработка математических и логических выражений&lt;/li&gt;&lt;li&gt;Обход CRON-а (скорее всего будет свой сервер для запуска задач по расписанию), чтобы избавить пользователей от мороки настройки CRON-а&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;И ещё список задач на будущее:&lt;/b&gt;&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;Возможность отката действий (отмена удаления документа)&lt;/li&gt;&lt;li&gt;Хранение разных версий документа (строки)&amp;nbsp;&lt;/li&gt;&lt;li&gt;Групповая модерация документа (документооборот)&amp;nbsp;&lt;/li&gt;&lt;li&gt;Сортировка строк методом drag&amp;amp;drop&lt;/li&gt;&lt;/ol&gt;&lt;b&gt;Что заимствовано из готовых решений&lt;/b&gt;:&lt;br /&gt;&lt;ol style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;Декодер доменных имён&lt;/b&gt; XN (позволяет без проблем работать, например, с .рф доменами).&lt;br /&gt;Автор: Matthias Sommerfeld&lt;/li&gt;&lt;li&gt;Визуальный редактор &lt;b&gt;CKEditor&lt;/b&gt;&lt;br /&gt;Автор: Frederico Knabben&lt;/li&gt;&lt;li&gt;Файловый редактор &lt;b&gt;elFinder&amp;nbsp;&lt;/b&gt;(с поддержкой прав доступа к папкам и файлам, интегрирован с CKEditor, открывается не в новом окне, а в текущем)&lt;br /&gt;Автор: Dmitry "dio" Levashov, Troex Nevelin, Valentin Razumnyh&lt;/li&gt;&lt;li&gt;Массовый загрузчик изображений &lt;strong&gt;imgUploadv25&lt;/strong&gt; c сжатием на стороне клиента&lt;br /&gt;Автор: Ady Levy&amp;nbsp;&lt;/li&gt;&lt;/ol&gt;Ну и естественно используется JQuery. Кстати пункты 2 и 3 опциональны, и являются расширениями системы (компонентами), которые загружаются отдельно. Все эти решения распространяются под свободными лицензиями GPL и BSD.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-1042281657121360194?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/1042281657121360194/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_01.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/1042281657121360194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/1042281657121360194'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post_01.html' title='Вести с полей'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1474859558012829398.post-5023404437900215337</id><published>2011-10-01T08:06:00.000-07:00</published><updated>2011-10-01T08:47:14.409-07:00</updated><title type='text'>Приветствие и введение</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div style="margin-left: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-3xCL23C3f9M/TocS1nmAg9I/AAAAAAAAAAM/p88GdABzBmA/s1600/logo2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-3xCL23C3f9M/TocS1nmAg9I/AAAAAAAAAAM/p88GdABzBmA/s1600/logo2.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-zCDX7vgu73g/TocT7WRuFpI/AAAAAAAAAAQ/yf5yhXhCGAo/s1600/e_b3073f4c.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;/a&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;b&gt;Добро пожаловать&lt;/b&gt; в блог разработчика CMS E5. Здесь я буду стараться рассказывать о ходе разработки этой CMS. Система разрабатывается уже более года, а идеи для разработки назревали с 2006 года. Этот блог немного запоздал и в первых постах я постараюсь рассказать обо всех уже пройденных этапах.&lt;/div&gt;&lt;br /&gt;Для тех кто не знает: &lt;b&gt;CMS - Система управления содержанием &lt;/b&gt;(content managment system). Применяется для управления веб-сайтами (редактирование страниц, добавление новостей и т.д.) без прибегания к помощи программистов. Т.е. основной задачей рядовой CMS является предоставление возможности поддерживать свой сайт обычными офисными сотрудниками.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-8HYijVL4O6c/Toc18XsBZjI/AAAAAAAAAAg/2Fkjdxkv6sE/s1600/white.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="213" src="http://1.bp.blogspot.com/-8HYijVL4O6c/Toc18XsBZjI/AAAAAAAAAAg/2Fkjdxkv6sE/s320/white.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;Система E5 будет &lt;b&gt;полностью бесплатной&lt;/b&gt;. Все компоненты и модули можно будет бесплатно загрузить с сервера-обновлений. Кроме того, пользователи могут организовывать свои серверы-обновлений, делать свои редакции системы и писать свои модули.&lt;br /&gt;&lt;br /&gt;Что же за идеи сподвигли меня заняться написанием CMS? Идеи эти не новы и посещали, пожалуй, всех программистов, которые имели дело с разработкой сайтов. Суть их сводится к создании системы, способной &lt;b&gt;конструировать и модифицировать модули&lt;/b&gt;. Настолько простой, чтобы ей могли пользоваться обычные офисные сотрудники (без знания PHP, MySQL и т.д.).&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Почему же не воспользоваться уже существующей системой&lt;/b&gt;? В Drupal, 1C-Bitrix, Umi-cms и CMS.Builder уже реализован конструктор модулей. Но эти конструкторы в конечном итоге заставляют нас переходить на всё тот же PHP, который, ко всему прочему, оказывается ещё и жёстко привязанным к ядру системы (работа с модулями осуществляется через API системы).&lt;br /&gt;&lt;br /&gt;Да - я хочу невозможного! Я хочу, чтобы пользователь, владея одной только мышью мог создавать &lt;b&gt;модуль интернет-магазина за десять минут&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Зачем нужен конструктор модулей&lt;/b&gt;? Ведь можно обойтись стандартными модулями. Ведь так?&lt;br /&gt;Не так :) Каждый пятый сайт обладает своим уникальным функционалом, которого нет в стандартных движках. Особенно это актуально, если вы работаете в серьёзной веб-студии или на госзаказ. Более того - если вы договорились с заказчиком о реализации сайта на стандартном движке (скажем жумла или вордпресс), то в процессе разработки могут всплыть требования, которые этот движок удовлетворить не сможет (например добавление меток к комментариям).&lt;br /&gt;&lt;br /&gt;Если мы затронем модуль интернет-магазинов, то даже на платных платформах дела обстоят очень плохо. Каждый, кто имел дело с системами ShopScript, знает чего стоит разобраться в движке системы (там проблеммой является даже банальный поиск файлов, в которых лежит нужный код).&lt;br /&gt;&lt;br /&gt;Есть интересный факт - подавляющее число веб-студий (особенно профессиональные) владеют собственной CMS. Но зачем она им, ведь в мире столько готовых решений? Именно за тем, что эти решения не подходят в некоторых проектах (как правило самых дорогих и основных). Но и конструктор модулей веб-студии не нужен, потому что за это у них отвечает веб-программист. Это означает, что любое изменение в системе обойдётся клиентам в кругленькую сумму.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Конструктор модулей - альтернатива веб-программисту&lt;/b&gt;? Зная спектр задач, с которыми приходится сталкиваться программисту, мы все дружно скажем: "Нееет! Это детская игрушка, которая создаст видимость гибкости системы". В следующих постах я подробней расскажу, какие задачи может решать контсруктор модулей в E5.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Почему у меня родилась эта идея&lt;/b&gt;? Есть такие люди, которые всё всегда хотят привести к какой-то системе, и по максимуму автоматизировать все рутинные процессы. Мне часто приходилось делать однообразную работу для сайтов и я всегда мечтал оптимизировать эти процессы. В детстве я писал собственную СУБД и этот опыт пригодился при написании одного портала с каталогом компаний. Особенностью портала был глубинный поиск компаний по критериям, и в каждом разделе была своя структура критериев. По сути, каждая карточка была своеобразным сайтом, а раздел - модулем. Этот проект дал существенный толчок к осуществлению этой нереальной идеи конструктора модулей.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Я не единственный&lt;/b&gt;, кого посещали такие идеи. Есть много схожих проектов и мой не претендует на уникальность. Более того - качество моего программирования оставляет желать лучшего, а количество обнаруживаемых ошибок и дыр в коде заставляет иногда надолго оставлять это творчество.&lt;br /&gt;&lt;br /&gt;Конечно &lt;b&gt;мне хочется думать&lt;/b&gt;, что моя система принесёт небольшой вклад в развитие интернета, но я не питаю иллюзий насчёт неё. Пока это просто хорошее средство реализации собственных проектов. Да - я уже делаю сайты на этой системе (реализовано 38 проектов, рекордное время изготовления сайта - 1 час, с учётом рисования дизайна, его вёрстки и установки).&lt;br /&gt;&lt;br /&gt;Некоторые выборочные &lt;b&gt;скриншоты&lt;/b&gt; (тестовый дизайн админки)&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;Страница входа&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-7mUMyr-QTMA/TocuAzbbG_I/AAAAAAAAAAU/DeB2fycLPjg/s1600/ss.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="217" src="http://1.bp.blogspot.com/-7mUMyr-QTMA/TocuAzbbG_I/AAAAAAAAAAU/DeB2fycLPjg/s320/ss.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;Настройка доступов&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Q83wgyNwMzc/Tocvkk1h4tI/AAAAAAAAAAY/yUONqkXtMoo/s1600/ss2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://4.bp.blogspot.com/-Q83wgyNwMzc/Tocvkk1h4tI/AAAAAAAAAAY/yUONqkXtMoo/s320/ss2.jpg" width="305" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-Q83wgyNwMzc/Tocvkk1h4tI/AAAAAAAAAAY/yUONqkXtMoo/s1600/ss2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt; &lt;/a&gt;&lt;/div&gt;&lt;div align="center"&gt;&amp;nbsp;Главная страница модуля&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/-1vlOGajNSEg/TocyFxPTS9I/AAAAAAAAAAc/zG6rVTrM3SU/s1600/ss3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://2.bp.blogspot.com/-1vlOGajNSEg/TocyFxPTS9I/AAAAAAAAAAc/zG6rVTrM3SU/s320/ss3.jpg" width="292" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div align="center"&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1474859558012829398-5023404437900215337?l=rucms.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://rucms.blogspot.com/feeds/5023404437900215337/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/5023404437900215337'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1474859558012829398/posts/default/5023404437900215337'/><link rel='alternate' type='text/html' href='http://rucms.blogspot.com/2011/10/blog-post.html' title='Приветствие и введение'/><author><name>e5</name><uri>http://www.blogger.com/profile/01895354840554040767</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-3xCL23C3f9M/TocS1nmAg9I/AAAAAAAAAAM/p88GdABzBmA/s72-c/logo2.png' height='72' width='72'/><thr:total>0</thr:total></entry></feed>
