<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
	<channel>
		<title>Блог Open Constructor</title>
		<link>http://www.openconstructor.org/blog/</link>
		<description>Open Constructor - это программа для разработки и поддержки сайтов с открытым кодом, распространяемая по лицензии GNU GPL version 2</description>
		<language>ru</language>
		<generator>Open Constructor</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/openconstructor" /><feedburner:info uri="openconstructor" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
			<title>Выпущен релиз Open Constructor 3.10</title>
			<description>&lt;p&gt;Сегодня мы выпускаем релиз Open Constructor 3.10.0, основным достоинством которого является поддержка PHP5. Также мы сделали удобнее работу с гибридными данными и исправили баги в инсталляторе.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://openconstructor.googlecode.com/files/openconstructor-3.10.0.zip"&gt;Скачать Open Constructor 3.10.0&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Что нового?&lt;/h3&gt;
&lt;p&gt;Долгожданная поддержка PHP5. Обратите внимание, что PHP5 должен быть установлен как модуль, а не FCGI. С PHP5 на FCGI доступно будет только создание статических страниц, гибридные данные работать не будут.&lt;/p&gt;
&lt;p&gt;Поддержка пользовательских плагинов для Smarty. Вы можете написать например собственный плагин для склонения числительных (1 комментарий, 2 комментария, 5 комментариев). Сохраните его в /res/smarty/plugins/ и вы сможете использовать его в Smarty-шаблонах. Примеры плагинов&amp;nbsp;вы можете найти в&amp;nbsp;&lt;a href="http://www.smarty.net/manual/ru/plugins.php"&gt;руководстве по созданию плагинов &lt;/a&gt;для Smarty. &lt;/p&gt;
&lt;p&gt;&lt;a href="http://code.google.com/p/openconstructor/issues/detail?id=44"&gt;Вложенная подгрузка гибридных документов в объектах списков&lt;/a&gt;. Теперь вывод связанных данных не требует объектов с инъекциями.&amp;nbsp;Как использовать вложенную подгрузку гибридных данных мы расскажем в отдельной статье.&lt;/p&gt;
&lt;p&gt;В папке res при установке будут создаваться папки /res/css, /res/js и /res/img. Мы рекомендуем хранить в этих папках таблицы стилей, javascript-файлы и файлы изображений сайта, это сильно облегчит перенос сайта на другой хостинг. Вам достаточно будет создать бекап на одном сервере и восстановить его на другом, не нужно будет отдельно переносить например картинки.&lt;/p&gt;
&lt;p&gt;Полный список изменений и исправлений&amp;nbsp;вы можете посмотреть&amp;nbsp;&lt;a href="http://code.google.com/p/openconstructor/issues/list?can=1&amp;amp;q=label%3A3.10&amp;amp;colspec=ID+Type+Status+Priority+Milestone+Owner+Summary&amp;amp;cells=tiles"&gt;в баг-трекере на Google Code&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Как перейти на Open Constructor 3.10&lt;/h3&gt;
&lt;p&gt;Чтобы перевести существующий сайт, разработанный на Open Constructor 3.9.0 или 3.10-beta, нужно создать бекап и восстановить его в Open Constructor 3.10.0, все необходимые изменения будут применены автоматически.&lt;/p&gt;Если у вас возникли проблемы при переходе на Open Constructor 3.10, пожалуйста опишите&amp;nbsp;их в &lt;a href="http://code.google.com/p/openconstructor/issues/list"&gt;нашем баг-трекере&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/si-AAGXdYVs" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.news/article/.55/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/si-AAGXdYVs/</link>
			<category>Новости</category>
			<pubDate>Tue, 30 Jun 2009 13:20:39 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.news/article/.55/</feedburner:origLink></item>
		<item>
			<title>Разработка несложных сайтов на базе Open Constructor</title>
			<description>&lt;h2&gt;Введение&lt;/h2&gt;
&lt;p&gt;В этой статье я объясню разработчикам, не имевшим ранее опыта создания сайтов на системе Open Constructor (OC), как разработать простой сайт, состоящий только из статических страниц.&lt;/p&gt;
&lt;h3&gt;Нам даны:&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Макеты дизайна главной и внутренних страниц&lt;/li&gt;
&lt;li&gt;Карта сайта с указанием названий разделов и URI&lt;/li&gt;&lt;/ol&gt;
&lt;h3&gt;Задание:&lt;/h3&gt;
&lt;p&gt;Разработать сайт на базе ОС&lt;/p&gt;
&lt;h3&gt;Информация до начала разработки&lt;/h3&gt;
&lt;p&gt;Для начала я рекомендую прочесть «&lt;a href="http://openconstructor.googlecode.com/files/openconstructor-manual-3.9.0-draft-0.5a.pdf"&gt;Документацию разработчика&lt;/a&gt;». А так же, не помешает иметь некоторый опыт работы с другими системами управления сайтами.&lt;/p&gt;
&lt;p&gt;Сайт, созданный на ОС (aka «Модель ОС»), состоит из:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Шаблонов&lt;/strong&gt; (весь HTML сайта)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Объектов&lt;/strong&gt; — выбирает контент из базы данных и передает в шаблон для оформления (несколько объектов могут использовать один и тот же шаблон), который впоследствии добавляется в структуру сайта в разделе...&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Карты сайта&lt;/strong&gt; — вся структура сайта&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Данных&lt;/strong&gt; (статьи, новости, файлы, и др.)&lt;/li&gt;&lt;/ol&gt;
&lt;h3&gt;Краткий план действий&lt;/h3&gt;
&lt;ol&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;ol&gt;
&lt;li&gt;Создаем страницы в соответствии с картой сайта&lt;/li&gt;
&lt;li&gt;Указываем, какие шаблоны должны использоваться для главной и внутренних страниц&lt;/li&gt;
&lt;li&gt;Добавляем объекты во вновь созданные страницы&lt;/li&gt;&lt;/ol&gt;
&lt;li&gt;Добавляем контент на страницы&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Держа в голове вышеуказанный «план боевых действий», приступаем к работе.&lt;/p&gt;
&lt;h2&gt;1. Анализ макетов дизайна&lt;/h2&gt;
&lt;p&gt;Перед нами макеты дизайна главной и внутренней страницы сайта:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/main-page.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Главная страница&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/inner-page.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Внутренняя страница&lt;/p&gt;
&lt;p&gt;Анализируем, из каких блоков состоит главная&amp;nbsp; страница:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/main-page-color.jpg"&gt;&lt;/p&gt;
&lt;p&gt;А также анализируем дизайн внутренних страниц:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/inner-page-color.jpg"&gt;&lt;/p&gt;
&lt;p&gt;{run_block id=whatever} — это элемент шаблона, так называемый маркер, в который мы можем вставлять объекты (шапку, футер, сайдбар и т.п.).&lt;/p&gt;
&lt;h2&gt;2. Создание разделов данных&lt;/h2&gt;
&lt;p&gt;В силу особенности ОС, до создания объектов создаем раздел данных, откуда объекты будут брать данные. Мы будем использовать тип данных «HTML код» для хранения контента страниц, поскольку только этот тип данных позволяет привязывать документ к конкретной странице в карте сайта.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/data-html.png"&gt;&lt;/p&gt;
&lt;p&gt;Называем раздел «Content»:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/data.png"&gt;&lt;/p&gt;
&lt;h2&gt;3. Создание шаблонов и объектов&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Создание шаблонов&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Шаблон — это HTML нашего сайта. В шаблонах мы создаем структуру нашего сайта с помощью HTML.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Создание объектов&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Cоздаем объекты, которые содержат эти шаблоны. Тип шаблона и объекта должен совпадать. Например, если шаблон имеет тип «Список страниц» (как шапка и футер), то объект тоже должен быть такого типа, для того, чтобы функции, заложенные в шаблон, работали корректно.&lt;/p&gt;
&lt;h3&gt;Создание шаблона главной страницы&lt;/h3&gt;
&lt;p&gt;Как вы видели, главная страница имеет двухколоночную структуру.&lt;/p&gt;
&lt;p&gt;Для создания шаблона выполняем несколько операций.&lt;/p&gt;
&lt;p&gt;Сначала выбираем тип шаблона, который мы хотим создать, затем создаем шаблон и вводим нижеследующий код:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/main-page-template.png"&gt;&lt;/p&gt;
&lt;p&gt;Код шаблона главной страницы:&lt;/p&gt;
&lt;p class=code&gt;{run_block id=PRE}&lt;br&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "&lt;a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&lt;/a&gt;"&amp;gt;&lt;br&gt;&amp;lt;html xmlns="&lt;a href="http://www.w3.org/1999/xhtml"&gt;http://www.w3.org/1999/xhtml&lt;/a&gt;"&amp;gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;&amp;nbsp;{$page-&amp;gt;getHeadTags(true)}{* передаем true чтобы оформить как xml *}&lt;br&gt;&amp;nbsp;&amp;lt;title&amp;gt;{$page-&amp;gt;getTitle()|escape}&amp;lt;/title&amp;gt;&lt;br&gt;&amp;lt;/head&amp;gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&amp;nbsp;&amp;lt;div class="wrapper"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;div class="header"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{run_block id=header}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;div class="banner"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{run_block id=banner}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;div class="content"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="center"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{run_block id=center}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="right"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{run_block id=right}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;br class="clear" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="footer"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{run_block id=footer}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;br class="clear" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;br&gt;{run_block id=POST}&lt;/p&gt;
&lt;p&gt;Любой верстальщик поймет, что это за код и как он будет отображаться в браузере. Этот код — самый что ни на есть обычный XHTML, в котором находятся несколько тегов шаблонизатора Smarty.&lt;/p&gt;
&lt;h3&gt;Шаблон шапки&lt;/h3&gt;
&lt;p&gt;Шаблон шапки имеет тип «Список страниц» и может выводить список страниц первого уровня автоматически, и это будет играть роль верхнего меню.&lt;/p&gt;
&lt;p class=code&gt;{* логотип *}&lt;br&gt;{if $page-&amp;gt;is('/')}{* мы на главной *}&lt;br&gt;&amp;nbsp;&amp;lt;img src="/res/files/logo.gif" alt="logo" title="logo" /&amp;gt;&lt;br&gt;{else}{* мы во внутрненних страницах *}&lt;br&gt;&amp;nbsp;&amp;lt;a href="/"&amp;gt;&amp;lt;img src="/res/files/logo.gif" alt="logo" title="logo" /&amp;gt;&amp;lt;/a&amp;gt;&lt;br&gt;{/if}&lt;br&gt;&amp;lt;ul class="menu"&amp;gt;&lt;br&gt;{* выводим пункты главного меню *}&lt;br&gt;{foreach from=$pages item=p}&lt;br&gt;&amp;nbsp;{if $p.at == 2}{* пункт выбран *}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li title="{$p.header}" class="active"&amp;gt;&amp;lt;span&amp;gt;{$p.header}&amp;lt;/span&amp;gt;&amp;lt;/li&amp;gt;&lt;br&gt;&amp;nbsp;{elseif $p.at == 1}{* выбран подпункт *}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li title="{$p.header}" class="active"&amp;gt;&amp;lt;a href="{$p.href}" title="{$p.header}"&amp;gt;{$p.header}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br&gt;&amp;nbsp;{else}{* пункт не выбран *}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;li title="{$p.header}"&amp;gt;&amp;lt;a href="{$p.href}" title="{$p.header}"&amp;gt;{$p.header}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br&gt;&amp;nbsp;{/if}&lt;br&gt;{/foreach}&lt;br&gt;&amp;lt;/ul&amp;gt;&lt;br&gt;&amp;lt;p&amp;gt;+7 (495) 232-99-66&amp;lt;/p&amp;gt;&lt;br&gt;&amp;lt;br class="clear" /&amp;gt;&lt;/p&gt;
&lt;p&gt;Что мы тут видим? Видим логотип, который на внутренних страницах является ссылкой на главную страницу, и Smarty-код, который генерирует список страниц, которые были указаны на разделе «Карта сайта».&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/main-header.png"&gt;&lt;/p&gt;
&lt;h3&gt;Объект шапки&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/edit-header-object.png"&gt;&lt;/p&gt;
&lt;h3&gt;Шаблон футера&lt;/h3&gt;
&lt;p&gt;Футер имеет схожий шаблон:&lt;/p&gt;
&lt;p class=code&gt;&amp;lt;p class="copyright"&amp;gt;&lt;br&gt;&amp;nbsp;Copyright &amp;amp;copy; 2008 Брокерский дом&amp;nbsp;&amp;lt;br /&amp;gt;&lt;br&gt;&amp;nbsp;100000, Москва, 2-я&amp;nbsp;ул., д. 1, стр. 1&amp;lt;br /&amp;gt;&lt;br&gt;&amp;nbsp;Телефон: +8 985 111-11-11&lt;br&gt;&amp;lt;/p&amp;gt;&lt;br&gt;&amp;lt;ul class="menu"&amp;gt;&lt;br&gt;{foreach from=$pages item=p}&lt;br&gt;&amp;nbsp;&amp;lt;li title="{$p.header}"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;{if $p.at == 2}&lt;br&gt;&amp;nbsp;&amp;nbsp;{$p.header}&lt;br&gt;&amp;nbsp;&amp;nbsp;{elseif $p.at ==1}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;a href="{$p.href}" title="{$p.header}"&amp;gt;&amp;lt;span class="active-parent"&amp;gt;{$p.header}&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;{else}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;a href="{$p.href}" title="{$p.header}"&amp;gt;{$p.header}&amp;lt;/a&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;{/if}&lt;br&gt;&amp;nbsp;&amp;lt;/li&amp;gt;&lt;br&gt;{/foreach}&lt;br&gt;&amp;lt;/ul&amp;gt;&lt;br&gt;&amp;lt;p class="agents"&amp;gt;&amp;lt;img alt="Предложение агентам" src="/res/files/icon-agents.gif" /&amp;gt;&amp;lt;a href="/services/for-agents/"&amp;gt;&amp;lt;span&amp;gt;Предложение&amp;lt;br /&amp;gt; агентам&amp;lt;/span&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/main-footer.png"&gt;&lt;/p&gt;
&lt;h3&gt;Объект футера&lt;/h3&gt;
&lt;p&gt;Объект футера создается так же, как и объект шапки.&lt;/p&gt;
&lt;h3&gt;Шаблон верхней иллюстрации&lt;/h3&gt;
&lt;p class=code&gt;&amp;lt;h1&amp;gt;Брокерский дом&amp;lt;/h1&amp;gt;&lt;br&gt;&amp;lt;p&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vestibulum mi massa, imperdiet ac, egestas commodo, auctor in, dolor. Nulla semper, mi in viverra rhoncus, enim est lobortis pede, eget tempor nulla nibh id velit. Pellentesque tincidunt. Etiam aliquam luctus lacus. Nulla a est nec lectus sollicitudin porta. Vestibulum dapibus tincidunt sapien. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Sed a nunc eu tellus placerat elementum.&amp;lt;/p&amp;gt;&lt;br&gt;&amp;lt;p&amp;gt;&amp;lt;a href="#"&amp;gt;Подробнее о компании&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/main-banner.jpg"&gt;&lt;/p&gt;
&lt;h3&gt;Объект верхней иллюстрации&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/edit-banner-object.png"&gt;&lt;/p&gt;
&lt;h3&gt;Шаблон центрального блока&lt;/h3&gt;
&lt;p class=code&gt;{if $header}&lt;br&gt;&amp;nbsp;&amp;lt;h1&amp;gt;{$header}&amp;lt;/h1&amp;gt;&lt;br&gt;{/if}&lt;br&gt;&amp;lt;table class="mainpage"&amp;gt;&lt;br&gt;{* создаем таблицу с двумя столбцами *}&lt;br&gt;{foreach_row from=$pages item=doc cols=2 table=no}&lt;br&gt;&amp;nbsp;{foreach_cell}&lt;br&gt;&amp;nbsp;&amp;nbsp;{* содержимое ячеек таблицы *}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;&amp;lt;a href="{$doc.href}"&amp;gt;{$doc.header}&amp;lt;/a&amp;gt;&amp;lt;/h2&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;{$doc.intro}&amp;lt;/p&amp;gt;&lt;br&gt;&amp;nbsp;{/foreach_cell}&lt;br&gt;{/foreach_row} &lt;br&gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/main-central.png"&gt;&lt;/p&gt;
&lt;h3&gt;Объект центрального блока (основной контент)&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/edit-main-central-object.png"&gt;&lt;/p&gt;
&lt;h3&gt;Шаблон правого сайдбара&lt;/h3&gt;
&lt;p class=code&gt;&amp;lt;p class="openfund"&amp;gt;&amp;lt;img alt="Открытые паевые фонды" src="/res/files/icon-fund.gif" /&amp;gt;&amp;lt;a href="#"&amp;gt;Открытые&amp;lt;br /&amp;gt; паевые фонды&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;br&gt;&amp;lt;br class="clear" /&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/main-right.png"&gt;&lt;/p&gt;
&lt;h3&gt;Объект правого сайдбара&lt;/h3&gt;
&lt;p&gt;Объект правого сайдбара создается так же, как и верхняя иллюстрация (объект типа «Включение шаблона»).&lt;/p&gt;
&lt;p&gt;Мы закончили создание шаблонов и объектов главной страницы.&lt;/p&gt;
&lt;h3&gt;Шаблон внутренних страниц&lt;/h3&gt;
&lt;p class=code&gt;{run_block id=PRE}&lt;br&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "&lt;a href="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&lt;/a&gt;"&amp;gt;&lt;br&gt;&amp;lt;html xmlns="&lt;a href="http://www.w3.org/1999/xhtml"&gt;http://www.w3.org/1999/xhtml&lt;/a&gt;"&amp;gt;&lt;br&gt;&amp;lt;head&amp;gt;&lt;br&gt;&amp;nbsp;{$page-&amp;gt;getHeadTags(true)}{* передаем true чтобы оформить как xml *}&lt;br&gt;&amp;nbsp;&amp;lt;title&amp;gt;{$page-&amp;gt;getTitle()|escape}&amp;lt;/title&amp;gt;&lt;br&gt;&amp;lt;/head&amp;gt;&lt;br&gt;&amp;lt;body&amp;gt;&lt;br&gt;&amp;nbsp;&amp;lt;div class="wrapper"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;div class="header"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{run_block id=header}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;div class="inner-content"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="left"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{run_block id=left}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{run_block id=left-2}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="center"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{run_block id=center}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="right"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{run_block id=right}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;br class="clear" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;div class="footer"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{run_block id=footer}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;br class="clear" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/body&amp;gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;br&gt;{run_block id=POST}&lt;/p&gt;
&lt;p&gt;Шаблоны и объекты шапки и футера оставляем такими же, как и на главной странице.&lt;/p&gt;
&lt;h3&gt;Шаблон центрального блока (основной контент)&lt;/h3&gt;
&lt;p&gt;Создаем шаблон типа HTML-текст для блока center, где будет находиться основной контент нашего сайта: &lt;/p&gt;
&lt;p class=code&gt;&amp;lt;div class="content-text"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;lt;h1&amp;gt;{$title}&amp;lt;/h1&amp;gt;&lt;br&gt;&amp;nbsp;{$content}&lt;br&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/inner-central.png"&gt;&lt;/p&gt;
&lt;h3&gt;Объект центрального блока&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/edit-inner-central-object.png"&gt;&lt;/p&gt;
&lt;h3&gt;Шаблон левого меню&lt;/h3&gt;
&lt;p&gt;Шаблон левого меню имеет тип «Список страниц», как и верхнее меню:&lt;/p&gt;
&lt;p class=code&gt;&amp;lt;ul class="leftmenu"&amp;gt;&lt;br&gt;{* перебираем пункты первого уровня *}&lt;br&gt;{foreach from=$pages item=top}&lt;br&gt;&amp;nbsp;{* перебираем пункты вротого уровня *}&lt;br&gt;&amp;nbsp;{foreach from=$top.children item=p}&lt;br&gt;&amp;nbsp;&amp;nbsp;{if $p.at == 2}{* пункт выбран *}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;li title="{$p.header}" class="active"&amp;gt;{$p.header}&amp;lt;/li&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;{elseif $p.at ==1}{* выбран подпункт *}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;li title="{$p.header}" class="active-parent"&amp;gt;&amp;lt;a href="{$p.href}" title="{$p.header}"&amp;gt;{$p.header}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;{else}{* пункт не выбран *}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;li title="{$p.header}"&amp;gt;&amp;lt;a href="{$p.href}" title="{$p.header}"&amp;gt;{$p.header}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;{/if}&lt;br&gt;&amp;nbsp;&amp;nbsp;{* проверяем существуют ли пункты третьего уровня *}&lt;br&gt;&amp;nbsp;&amp;nbsp;{if $p.children}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;li class="inner"&amp;gt;&amp;lt;ul class="small"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{* выводим меню третьего уровня *}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{foreach from=$p.children item=child}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{if $child.at == 1}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;li title="{$child.header}" class="active-parent"&amp;gt;&amp;lt;a href="{$child.href}" title="{$child.header}"&amp;gt;{$child.header}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{elseif $child.at == 2}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;li title="{$child.header}" class="active"&amp;gt;{$child.header}&amp;lt;/li&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{else}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;li title="{$child.header}"&amp;gt;&amp;lt;a href="{$child.href}" title="{$child.header}"&amp;gt;{$child.header}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{/if}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{/foreach}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;{/if}&lt;br&gt;&amp;nbsp;{/foreach}&lt;br&gt;{/foreach}&lt;br&gt;&amp;lt;/ul&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/left-menu.png"&gt;&lt;/p&gt;
&lt;h3&gt;Объект левого меню&lt;/h3&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/left-menu-object.png"&gt;&lt;/p&gt;
&lt;p&gt;Этот объект требует настройки — мы должны указать глубину страниц, которые будут включаться в меню:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/parameters.png"&gt;&lt;/p&gt;
&lt;h3&gt;Шаблон правого сайдбара&lt;/h3&gt;
&lt;p&gt;Создадим шаблон правого сайдбара внутренних страниц, так как он будет отличаться от сайдбара главной страницы. Шаблон и объект будут типа «Включение шаблона».&lt;/p&gt;
&lt;h3&gt;Объект правого сайдбара&lt;/h3&gt;
&lt;p&gt;Объект правого сайдбара будет создаваться так же, как и верхняя иллюстрация главной страницы&lt;/p&gt;
&lt;h2&gt;4. Сборка сайта из объектов&lt;/h2&gt;
&lt;h3&gt;1.&amp;nbsp;Создаем страницы нашего сайта&lt;/h3&gt;
&lt;p&gt;Теперь «собираем» сайт в единое целое. Для этого добавляем объекты в те места, которые были предусмотрены в шаблоне главной страницы (помните теги {run_block id=whatever}?).&lt;/p&gt;
&lt;p&gt;Для достижения этой цели, нам необходимо создать структуру (карту) сайта, используя переданный нам вначале документ «Карта сайта», в котором черным выделены страницы первого уровня, красным — второго и зеленым — третьего):&lt;/p&gt;
&lt;style type=text/css&gt;
	table.sitemap td {
		padding:2px 5px;
		}
	
	table.sitemap td.main {
		font-weight:bold;
		}
	
	table.sitemap td.first {
		padding-left:15px;
		font-weight:bold;
		}
		
	table.sitemap td.second {
		padding-left:25px;
		color:#006600;
		}
		
	table.sitemap td.third {
		padding-left:35px;
		color:#993300;
		}
		
	table.sitemap {
		width:100%;
		}
		
	table.sitemap, table.sitemap td {
		border:1px solid #ccc;
		border-collapse:collapse;
		}
&lt;/style&gt;

&lt;table class=sitemap&gt;

&lt;tr&gt;
&lt;td class=main width="50%"&gt;Главная&lt;/td&gt;
&lt;td class=main&gt;/&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=first width="50%"&gt;О компании Lorem Ipsum&lt;/td&gt;
&lt;td class=first&gt;/about&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Структура&lt;/td&gt;
&lt;td class=second&gt;/structure&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Руководство&lt;/td&gt;
&lt;td class=second&gt;/headquaters&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Реквизиты и лицензии&lt;/td&gt;
&lt;td class=second&gt;/requisites-and-licenses&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Контактная информация&lt;/td&gt;
&lt;td class=second&gt;/contact-information&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=first width="50%"&gt;Услуги&lt;/td&gt;
&lt;td class=first&gt;/services&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Брокерские операции&lt;/td&gt;
&lt;td class=second&gt;/brokerage-service&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;Торговые площадки&lt;/td&gt;
&lt;td class=third&gt;/trading-floors&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;Интернет-трейдинг&lt;/td&gt;
&lt;td class=third&gt;/internet-trading&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;Как стать нашим клиентом&lt;/td&gt;
&lt;td class=third&gt;/become-our-client&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;Документы&lt;/td&gt;
&lt;td class=third&gt;/documents&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Управление активами&lt;/td&gt;
&lt;td class=second&gt;/asset-management&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;Доверительное управление&lt;/td&gt;
&lt;td class=third&gt;/trusted-asset-management&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;Паевые фонды&lt;/td&gt;
&lt;td class=third&gt;/unit-funds&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;Для пенсионных фондов и страховых компаний&lt;/td&gt;
&lt;td class=third&gt;/pension-funds-and-insurance-companies&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Услуги на срочном рынке&lt;/td&gt;
&lt;td class=second&gt;/future-market-services&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;Консалтинговое сопровождение&lt;/td&gt;
&lt;td class=third&gt;/consulting-support&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;Опционные стратегии&lt;/td&gt;
&lt;td class=third&gt;/option-strategies&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;Риск-менеджмент по опционам&lt;/td&gt;
&lt;td class=third&gt;/option-risk-management&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;Опционный деск&lt;/td&gt;
&lt;td class=third&gt;/option-desk&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;Субброкеридж на FORTS&lt;/td&gt;
&lt;td class=third&gt;/forts-subbrokerage&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;Как стать нашим клиентом&lt;/td&gt;
&lt;td class=third&gt;/become-our-client&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Инвестиционно-банковские услуги&lt;/td&gt;
&lt;td class=second&gt;/investment-and-banking&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Депозитарные услуги&lt;/td&gt;
&lt;td class=second&gt;/depository&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Агентам&lt;/td&gt;
&lt;td class=second&gt;/for-agents&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Юридические услуги&lt;/td&gt;
&lt;td class=second&gt;/legal-services&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=first width="50%"&gt;Тарифы&lt;/td&gt;
&lt;td class=first&gt;/tariffs&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Биржевой рынок&lt;/td&gt;
&lt;td class=second&gt;/exchange-market&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Внебиржевой рынок&lt;/td&gt;
&lt;td class=second&gt;/off-exchange-market&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Срочный рынок&lt;/td&gt;
&lt;td class=second&gt;/future-market&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Единый фиксированный&lt;/td&gt;
&lt;td class=second&gt;/fixed&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Вознаграждение за использование ИТС QUIK&lt;/td&gt;
&lt;td class=second&gt;/quik-reward&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Вознаграждение брокера за иные услуги по Договору об оказании брокерских услуг&lt;/td&gt;
&lt;td class=second&gt;/broker-reward&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Тарифы на депозитарное обслуживание&lt;/td&gt;
&lt;td class=second&gt;/depository&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=second width="50%"&gt;Тарифы торговых площадок&lt;/td&gt;
&lt;td class=second&gt;/trading-floors&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;Классичесий рынок РТС&lt;/td&gt;
&lt;td class=third&gt;/rts-classic&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;Биржевой, Срочный рынок РТС&lt;/td&gt;
&lt;td class=third&gt;/rts-stock-future&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;ЗАО ММВБ&lt;/td&gt;
&lt;td class=third&gt;/mmvb&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;ЗАО «Фондовая биржа ММВБ»&lt;/td&gt;
&lt;td class=third&gt;/mmvb-stock-exchange&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=third width="50%"&gt;НП ФБ «Санкт–Петербург» (ОАО «Газпром»)&lt;/td&gt;
&lt;td class=third&gt;/saint-petersburg-se&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;
&lt;td class=first width="50%"&gt;404&lt;/td&gt;
&lt;td class=first&gt;/404&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;p&gt;Создадим нужные нам страницы:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/create-page-button.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/create-page.png"&gt;&lt;/p&gt;
&lt;p&gt;Папка — это URL страницы.&lt;/p&gt;
&lt;h3&gt;2.&amp;nbsp;Указываем шаблоны главной и внутренних страниц&lt;/h3&gt;
&lt;p&gt;При создании страниц указываем шаблон этих страниц. Для главной страницы мы используем шаблон «main», а для внутренних — «inner»:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/edit-main-page.png"&gt;&lt;/p&gt;
&lt;p&gt;В итоге карта сайта должна выглядеть вот так:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/sitemap-full.png"&gt;&lt;/p&gt;
&lt;h3&gt;3.&amp;nbsp;Добавляем объекты во вновь созданные страницы&lt;/h3&gt;
&lt;p&gt;Теперь вставляем объекты в нужные нам страницы в разделе «Карта сайта». Логично преположить, что некоторые объекты (например, шапка) будут добавлены во все страницы, поскольку присутствуют во всех страницах.&lt;/p&gt;
&lt;p&gt;Добавить объект можно двумя способами:&lt;/p&gt;
&lt;p&gt;1 способ — когда &lt;strong&gt;один объект необходимо добавить в большое количество страниц&lt;/strong&gt;, например, во все внутренние страницы нашего сайта.&lt;/p&gt;
&lt;p&gt;2 способ — когда &lt;strong&gt;один объект необходимо добавить только в одну страницу&lt;/strong&gt;, например, на главную страницу.&lt;/p&gt;
&lt;p&gt;Теперь добавляем объекты (1-м способом) во все внутренние страницы и на главную страницу сайта. Для примера возмем объект шапки (header). Для этого откроем сам объект:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/edit-header-object.png"&gt;&lt;/p&gt;
&lt;p&gt;В нижней части окна объекта нажимаем на кнопку «Места применения объекта». Откроется окно, где выбираем страницы и блок страницы, куда необходимо добавить объект:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/places-of-usage.png"&gt;&lt;/p&gt;
&lt;p&gt;Обратите внимание, что мы сейчас добавили объект шапки и на главную страницу, поскольку объекты шапки и футера идентичны для всех страниц.&lt;/p&gt;
&lt;p&gt;Таким образом добавляем другие объекты в нужные нам страницы.&lt;/p&gt;
&lt;p&gt;Теперь нам надо добавить некоторые объекты, которые еще не добавлены на главную страницу используя 2-й способ добавления объектов (на главную страницу уже добавлены объекты шапки и футера — мы их добавили выше). Для этого, переходим в раздел «Карта сайта» и нажимаем кнопку «Добавить объект»:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/add-object-button.png"&gt;&lt;/p&gt;
&lt;p&gt;В открывшемся окне выбираем нужный нам объект (не забудьте также обратить внимание на тип объекта; объект «banner» — это объект верхней иллюстрации):&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/add-object-banner.png"&gt;&lt;/p&gt;
&lt;p&gt;Таким образом добавляем другие объекты главной страницы. В итоге главная страница должна выглядеть так:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/main-page-sitemap.png"&gt;&lt;/p&gt;
&lt;p&gt;Обратите внимание на выпадающее меню, справа от объектов. Пункты этого меню совпадают с тем id, что мы давали в шаблоне главной страницы — например, {run_block id=header} или {run_block id=center}.&lt;/p&gt;
&lt;p&gt;Этот способ привязки объектов к страницам лучше использовать с простыми сайтами, с таким, который мы сейчас создаем.&lt;/p&gt;
&lt;h2&gt;Стили (CSS)&lt;/h2&gt;
&lt;p&gt;Чтобы подключить стили (CSS) к сайту, создаем папку css в корневой папке вашего сайта и в эту папку помещаем css-файл вашего сайта. Тогда этот файл стиля появится в свойствах шаблона и будет использован по умолчанию (тег CSS автоматически добавится в HTML).&lt;/p&gt;
&lt;h2&gt;5. Добавление контента&lt;/h2&gt;
&lt;p&gt;Контент добавляется через раздел «Данные» в ОС:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/data-full.png"&gt;&lt;/p&gt;
&lt;p&gt;Как вы видите, напротив названия страницы стоит его URI. Таким образом можно указать, где будет отображаться именно эта статья. Что бы добавить текст для конкретной страницы, поступаем следующим образом:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/add-content.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Выбираем страницу, где именно этот текст будет отображаться, через дроп-даун бокс. Список страниц в этом дроп-даун боксе берется из «Карты сайта».&lt;/p&gt;
&lt;p&gt;Вот так можно очень быстро собрать сайт на базе ОС.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/Oj2YVtVn2JA" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.40/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/Oj2YVtVn2JA/</link>
			<category>How-to</category>
			<pubDate>Wed, 16 Apr 2008 07:18:16 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.40/</feedburner:origLink></item>
		<item>
			<title>Динамические условия фильтрации списка гибридных документов</title>
			<description>&lt;p&gt;Иногда требуется отфильтровать список гибридных документов по одному из нескольких полей.&lt;/p&gt;
&lt;p&gt;Пример:&lt;/p&gt;
&lt;p&gt;На сайте есть каталог бумаги, и необходимо организовать навигацию по нескольким форматам и видам бумаги.&lt;/p&gt;
&lt;p&gt;Создаем гибридный раздел данных «Бумага» со следующим набором полей:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;format: формат бумаги. Тип поля «Перечисление (enum)», возможные значения A1, A2, A3, A4.&lt;/li&gt;
&lt;li&gt;surface: поверхность. Тип поля «Перечисление (enum)», возможные значения матовая (matt), глянцевая (glossy).&lt;/li&gt;
&lt;li&gt;сolor: цвет. Тип поля «Перечисление (enum)», возможные значения белый (white), коричневый (brown) и т. д.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;&lt;img src="http://www.openconstructor.org/res/images/enum_types.png"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/field_format.png"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Нужно сделать меню со следующими пунктами: Бумага A3; Бумага A4; Глянцевая бумага; Белая бумага. Это значит нужно фильтровать список документов по одному из полей format, surface или color в зависимости от выбранного пункта меню. Обратите внимание на то, что в меню выводятся не все варианты, а только избранные.&lt;/p&gt;
&lt;p&gt;Задачу можно решить, создав три объекта списка и поместив их на разные страницы. Первый объект будет отвечать за фильтрацию по полю format, второй — по surface, третий — по color.&lt;/p&gt;
&lt;p&gt;Но есть &lt;strong&gt;более простое решение&lt;/strong&gt; с использованием только одного объекта списка. Для этого создаем объект и настраиваем у него одну фильтрацию. Этот объект будет находиться на странице /sort/ и подразумевается, что там настроена маршрутизация. В поле «Где» пишем «$sort.where», в поле «Значение» пишем «sort.is» (Context).&lt;br&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/list_filter.png"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ставим этот объект на страницу /sort/. Теперь пункты меню доступны по следующим адресам:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Бумага A3: /sort/index.php/-where/format/-is/a3/&lt;/li&gt;
&lt;li&gt;Бумага A4: /sort/index.php/-where/format/-is/a4/&lt;/li&gt;
&lt;li&gt;Глянцевая бумага: /sort/index.php/-where/surface/-is/glossy/&lt;/li&gt;
&lt;li&gt;Белая бумага: /sort/index.php/-where/color/-is/white/&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Чтобы использовать динамическую фильтрацию, не обязательно чтобы типы полей были «Перечисление», в нашем примере можно заменить поле «Поверхность» на поле «Глянцевая» типа boolean.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Шаблон списка документов который выводит меню + список:&lt;/p&gt;
&lt;p class=code&gt;&amp;lt;div&amp;gt;&lt;br&gt;&amp;nbsp; {* пункты меню *}&lt;br&gt;&amp;nbsp; {set&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; menu_k = ','|explode:'format/a4,format/a3,surface/glossy,color/white'&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; menu_v = ','|explode:'Бумага A4,Бумага A3,Глянцевая бумага,Белая бумага'&lt;br&gt;&amp;nbsp; }&lt;br&gt;&amp;nbsp; {* active - ключ текущего пункта; href - для генерирования ссылки *}&lt;br&gt;&amp;nbsp; {set&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; active = $ctx-&amp;gt;getParam('sort.where')|cat:'/'|cat:$ctx-&amp;gt;getParam('sort.is')&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; href = $ctx-&amp;gt;getPatternFor('.', 'sort.where,sort.is', ',')&lt;br&gt;&amp;nbsp; }&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp; {*&lt;br&gt;&amp;nbsp;&amp;nbsp; * Меню&lt;br&gt;&amp;nbsp;&amp;nbsp; *}&lt;br&gt;&amp;nbsp; &amp;lt;ul&amp;gt;&lt;br&gt;&amp;nbsp; {foreach from=$menu_k item=k key=i}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;li&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {if $k eq $active}{* выбранный пункт меню *}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;b&amp;gt;{$menu_v.$i}&amp;lt;/b&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {else}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {set crit = '/'|explode:$k}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="{$href|sprintf:$crit[0]:$crit[1]}"&amp;gt;{$menu_v.$i}&amp;lt;/a&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {/if}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/li&amp;gt;&lt;br&gt;&amp;nbsp; {/foreach}&lt;br&gt;&amp;nbsp; &amp;lt;/ul&amp;gt;&lt;br&gt;&amp;nbsp; &lt;br&gt;&amp;nbsp; {*&lt;br&gt;&amp;nbsp;&amp;nbsp; *&amp;nbsp; Список документов&lt;br&gt;&amp;nbsp;&amp;nbsp; *}&lt;br&gt;&amp;nbsp; &amp;lt;div&amp;gt;&lt;br&gt;&amp;nbsp; {foreach from=$docs item=doc}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;h3&amp;gt;{$doc.header} [{$doc.format.header}]&amp;lt;/h3&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;p&amp;gt;Цвет: {$doc.color.header}, Поверхность: {$doc.surface.header}&amp;lt;/p&amp;gt;&lt;br&gt;&amp;nbsp; {/foreach}&lt;br&gt;&amp;nbsp; &amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/ZQ7BWl0e4qw" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.39/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/ZQ7BWl0e4qw/</link>
			<category>How-to</category>
			<pubDate>Wed, 2 Apr 2008 15:07:55 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.39/</feedburner:origLink></item>
		<item>
			<title>Передача аргументов шаблону объекта</title>
			<description>&lt;p&gt;В ОС при выполнении объекта, можно передавать аргументы в шаблон объекта.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Вариант 1. Задание аргументов из настроек объекта&lt;/h2&gt;
&lt;p&gt;В свойствах объекта, в секции настроек шаблона можно задать аргументы, которые будут передаваться шаблону. Аргументы задаются в формате query_string.&lt;/p&gt;
&lt;p&gt;Допустим, на сайте есть блок со списком новостей на главной и на внутренней странице. Оба блока идентичны, но в блоке на главной есть ссылка на rss. В обоих объектах можно использовать один и тот же шаблон и в шаблоне проверять аргумент-флаг, который показывает, выводить ссылку на rss или нет.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Шаблон:&lt;/strong&gt;&lt;/p&gt;
&lt;p class=code&gt;{if &lt;strong&gt;$args.rss&lt;/strong&gt;}&amp;lt;a href="/feeds/news/"&amp;gt;RSS&amp;lt;/a&amp;gt;{/if}&lt;br&gt;&amp;lt;ul&amp;gt;&lt;br&gt;{foreach from=$news item=i}&lt;br&gt;&amp;nbsp; &amp;lt;li&amp;gt;&amp;lt;a href="{$i.href}"&amp;gt;{$i.header}&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;br&gt;{/foreach}&lt;br&gt;&amp;lt;/ul&amp;gt;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;В настройках объекте на главной в поле «Передавать параметры:» пишем rss=1. А во втором объекте оставляем это поле пустым. Все.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;h2&gt;Вариант 2. Передача аргументов при определении блока&lt;/h2&gt;
&lt;p&gt;В первом варианте пришлось создать два объекта и один шаблон. Можно обойтись и одним объектом, если на главной и на внутренней страницах используются разные шаблоны страниц, или объекты находятся на разных блоках. Для этого ищем вызов блока (run_block) новостей в шаблоне главной страницы и передаем аргумент rss. Например, если список находится в блоке center.2, то это будет выглядеть так:&lt;/p&gt;
&lt;p class=code&gt;...&lt;br&gt;{run_block id=center.2 &lt;strong&gt;rss=on&lt;/strong&gt;}&lt;br&gt;...&lt;/p&gt;
&lt;p&gt;Какой вариант использовать? Это зависит от задачи: если передаваемый аргумент относится к месторасположению блока, то лучше использовать второй вариант, в остальных случаях — первый.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/XMJ7N6vTaBI" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.38/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/XMJ7N6vTaBI/</link>
			<category>How-to</category>
			<pubDate>Tue, 1 Apr 2008 14:50:54 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.38/</feedburner:origLink></item>
		<item>
			<title>Тег foreach_cell для Smarty</title>
			<description>&lt;p&gt;В&amp;nbsp;OC существует набор тегов foreach_row, foreach_col&amp;nbsp;и foreach_cell для Smarty, которые используются для генерирования таблиц.&amp;nbsp;Эти теги&amp;nbsp;используются в паре foreach_row + foreach_cell или foreach_col + foreach_cell.&lt;/p&gt;
&lt;p&gt;Во всех примерах используется шаблон типа Список Гибридных Документов.&lt;/p&gt;
&lt;h2&gt;Пример 1. Вывод списка документов в таблице в 4 колонки&lt;/h2&gt;
&lt;p class=code&gt;{foreach_row from=$docs item=doc &lt;strong&gt;cols=4&lt;/strong&gt;}&lt;br&gt;&amp;nbsp; {foreach_cell}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="{$doc.href}"&amp;gt;{$doc.header}&amp;lt;/a&amp;gt;&lt;br&gt;&amp;nbsp; {/foreach_cell}&lt;br&gt;{/foreach_row}&lt;/p&gt;
&lt;h2&gt;&lt;br&gt;Пример 2. Задание аттрибутов таблицы вручную&lt;/h2&gt;
&lt;p class=code&gt;&amp;lt;table border="0" cellspacing="0" id="table-docs" class="new-docs" style="font-size: 85%;"&amp;gt;&lt;br&gt;{foreach_row from=$docs item=doc cols=4 &lt;strong&gt;table=no&lt;/strong&gt;}&lt;br&gt;&amp;nbsp; {foreach_cell}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="{$doc.href}"&amp;gt;{$doc.header}&amp;lt;/a&amp;gt;&lt;br&gt;&amp;nbsp; {/foreach_cell}&lt;br&gt;{/foreach_row}&lt;br&gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h2&gt;&lt;br&gt;Пример 3. Построчная зебра&lt;/h2&gt;
&lt;p class=code&gt;{foreach_row from=$docs item=doc cols=4 &lt;strong&gt;tr=no&lt;/strong&gt;}&lt;br&gt;&amp;nbsp; &amp;lt;tr class="{cycle values="plain,gray"}"&amp;gt;&lt;br&gt;&amp;nbsp; {foreach_cell}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="{$doc.href}"&amp;gt;{$doc.header}&amp;lt;/a&amp;gt;&lt;br&gt;&amp;nbsp; {/foreach_cell}&lt;br&gt;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br&gt;{/foreach_row}&lt;/p&gt;
&lt;h2&gt;&lt;br&gt;Пример 4. Заполнение пустых ячеек&lt;/h2&gt;
&lt;p&gt;По умолчанию в последней строке (foreach_row) или столбце (foreach_col) добавляются пустые ячейки (&amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;) вместо недостающих документов. Для ручного вывода недостающих ячеек используется параметр expand тега foreach_row/foreach_col. Если задать expand=yes, то foreach_cell будет вызываться с null элементом в недостающих ячейках.&lt;/p&gt;
&lt;p class=code&gt;{foreach_row from=$docs item=doc cols=4 &lt;strong&gt;expand=yes&lt;/strong&gt;}&lt;br&gt;&amp;nbsp; {foreach_cell}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {if $doc}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="{$doc.href}"&amp;gt;{$doc.header}&amp;lt;/a&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {else}{* пустая ячейка *}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; N/A&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {/if}&lt;br&gt;&amp;nbsp; {/foreach_cell}&lt;br&gt;{/foreach_row}&lt;/p&gt;
&lt;h2&gt;&lt;br&gt;Пример 5. Управление всеми тегами таблицы вручную&lt;/h2&gt;
&lt;p class=code&gt;&amp;lt;table border="0" cellspacing="0" id="table-docs" class="new-docs" style="font-size: 85%;"&amp;gt;&lt;br&gt;{foreach_row from=$docs item=doc cols=3 &lt;strong&gt;table=off tr=off&lt;/strong&gt;}&lt;br&gt;&amp;nbsp; &amp;lt;tr class="r-{cycle values="1,2,3"}"&amp;gt;&lt;br&gt;&amp;nbsp; {foreach_cell &lt;strong&gt;td=off&lt;/strong&gt;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;td id="doc-{$doc._id}"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="{$doc.href}"&amp;gt;{$doc.header}&amp;lt;/a&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/td&amp;gt;&lt;br&gt;&amp;nbsp; {/foreach_cell}&lt;br&gt;&amp;nbsp; &amp;lt;/tr&amp;gt;&lt;br&gt;{/foreach_row}&lt;br&gt;&amp;lt;/table&amp;gt;&lt;/p&gt;
&lt;h2&gt;&lt;br&gt;Пример 6. Доступ к состоянию цикла&lt;/h2&gt;
&lt;p class=code&gt;{foreach_row from=$docs item=doc cols=4 &lt;strong&gt;status=st&lt;/strong&gt;}&lt;br&gt;&amp;nbsp; {foreach_cell}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;code&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; row: {$st.col}, col: {$st.row}&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; iteration: {$st.iteration}, index: {$st.index}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/code&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;a href="{$doc.href}"&amp;gt;{$doc.header}&amp;lt;/a&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;code&amp;gt;Full status: {$st|@debug_print_var}&amp;lt;/code&amp;gt;&lt;br&gt;&amp;nbsp; {/foreach_cell}&lt;br&gt;{/foreach_row}&lt;/p&gt;
&lt;p&gt;Здесь мы через параметр status указали имя переменной, в которой будет доступно состояние цикла (st).&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;Во всех примерах был показан foreach_row. Если его заменить на foreach_col, то документы будут выводиться в таблице не слева направо, а сверху вниз.&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/ghKJ2CKo_lI" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.37/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/ghKJ2CKo_lI/</link>
			<category>How-to</category>
			<pubDate>Mon, 31 Mar 2008 09:44:54 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.37/</feedburner:origLink></item>
		<item>
			<title>Видеоинструкция по установке CMS Open Constructor версии 3.9.0</title>
			<description>&lt;p&gt;В этой статье мы рассмотрим установку Open Constructor-a на локальный сервер. &lt;/p&gt;
&lt;p&gt;В качестве локального сервера был использован пакет &lt;a href="http://www.wampserver.com/en/"&gt;WampServer&lt;/a&gt;, который включает в себя Apache 2.0.61, PHP 4.4.7, MySQL 4.1.22 (&lt;a href="http://www.openconstructor.org/download/"&gt;требования Open Constructor к серверу и компьютеру клиента&lt;/a&gt;). А в качестве FTP сервера был использован FileZilla. &lt;/p&gt;
&lt;p&gt;Перед установкой Open Constructor-a надо создать базу в MySQL и пользователя на FTP сервер. В качестве примера мы используем имя пользователя базы данных — oc_test, и название базы — oc_test. Пользователь FTP — test, пароль — 123456. &lt;/p&gt;
&lt;p&gt;В первую очередь, создаем пользователя базы данных и саму базу. &lt;/p&gt;
&lt;p&gt;После этого создаем пользователя FTP, указываем Home directory (в нашем случае D:\wamp) и привилегии пользователя. &lt;/p&gt;
&lt;p&gt;Потом распаковываем архив с Open Constructor-ом в корень домашней папки Wamp-a (по умолчанию www). &lt;/p&gt;
&lt;p&gt;После этого запускаем Internet Explorer (версии не ниже 6.0) и в адресной строке пишем путь к Open Constructor-у (на примере — http://localhost/openconstructor/). При этом запускается скрипт установки Open Constructor-a. &lt;/p&gt;
&lt;p&gt;В соответствующие поля вводим имя пользователя и пароль FTP, корень Open Constructor-a относительно корня FTP, название базы данных, имя пользователя базы и пароль. &lt;/p&gt;
&lt;p&gt;Если вы все сделали правильно, то откроется окно входа в Open Constructor. Там вводим свой логин (по умолчанию root) и пароль (по умолчанию — без пароля) и, вуаля, Open Constructor готов к работе! &lt;/p&gt;&lt;embed src=http://www.jeroenwijering.com/embed/mediaplayer.swf width=650 height=508 flashvars="height=508&amp;amp;width=650&amp;amp;file=http://www.openconstructor.org/res/images/tutorial.flv&amp;amp;showdownload=true" allowfullscreen="true" allowscriptaccess="always"&gt;&lt;/embed&gt; 
&lt;p&gt;Для нормального воспроизведения видео необходим &lt;a href="http://www.adobe.com/go/BONRN"&gt;Adobe Flash Player&lt;/a&gt; версии не ниже 9.0.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/OfmeNvERiz4" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.36/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/OfmeNvERiz4/</link>
			<category>How-to</category>
			<pubDate>Fri, 1 Feb 2008 10:43:10 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.36/</feedburner:origLink></item>
		<item>
			<title>Использование гибридных данных на примере сайта cinema.uz</title>
			<description>&lt;p&gt;На сайте cinema.uz несколько связок данных, которые желательно, а иногда просто необходимо выводить вместе.&lt;/p&gt;
&lt;h2&gt;Афиша — фильм — кинотеатр&lt;/h2&gt;
&lt;p&gt;Например, связка «афиша — фильм — кинотеатр»: обязательно должно быть указано, какой фильм, когда и в каком кинотеатре идет.&lt;/p&gt;
&lt;p&gt;Обновление афиши для редакторов сайта не представляет сложности:&lt;/p&gt;
&lt;p&gt;1. &lt;strong&gt;создаем гибридный документ фильма&lt;/strong&gt;, который будет идти в кинотеатрах — указываем его название и жанр, прикрепляем картинку, пишем описание фильма и вводный текст.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/cinema_afisha_film.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Добавляем в афишу фильм «Ради тебя»&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. &lt;strong&gt;сообщаем о том, где, когда и во сколько будет идти фильм&lt;/strong&gt; — нужный кинотеатр выбираем из списка уже введенных кинотеатров, указываем первый и последний день показа (фильм будет в афише именно в этом промежуток времени), фильм выбираем из списка уже созданных фильмов.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/cinema_afisha.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Фильм «&lt;em&gt;Ради тебя&lt;/em&gt;» будет показан в афише с&amp;nbsp;21 марта&amp;nbsp;2007 года по 21 апреля 2008 года&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. &lt;strong&gt;получаем готовую афишу&lt;/strong&gt; — на странице афиши видим список фильмов, которые будут идти в ближайшее время. Кликнув на фильм, попадаем на страницу, где находится информация о фильме и по дням указаны кинотеатры, в которых он будет идти.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/cinema_afisha_film_page.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Выбираем на сайте день и кинотеатр, куда мы пойдем смотреть фильм «Ради тебя»&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2&gt;Актер — фильм&lt;/h2&gt;
&lt;p&gt;Связка «актер — фильм» также полезна: на сайте можно узнать, какие актеры снимались в определенном фильме, и в каких фильмах снимался определенный актер.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/cinema_actress_page.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Страница актрисы Айшварии Рай содержит биографию, фотографию и ссылку на фото-галерею Айшварии, список фильмов с ее участием, ссылки на взятые у нее&amp;nbsp;интервью, а также количество голосов, отданных за нее посетителями сайта&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/cinema_actress.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Информация об актерах, исполнителях и режиссерах имеет одинаковый вид, поэтому эти 3 группы объединены в один раздел гибридных данных&lt;/em&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;&lt;br&gt;Актер — интервью&lt;/h2&gt;
&lt;p&gt;Связка «актер — интервью» позволяет узнать обо всех интервью&amp;nbsp;актера на странице&amp;nbsp;интервью, и на его личной странице на сайте.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/cinema_interview_page.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Интервью Шахрукх Кхана и ссылки на все остальные его интервью&amp;nbsp;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/cinema_interview.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Посетители оставляют свои вопросы на сайте, актер на них отвечает, после чего интервью готово к публикации&lt;/em&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2&gt;Фильм — обзор фильма&lt;/h2&gt;
&lt;p&gt;Связка «фильм — обзор фильма» — можно сначала почитать обзор фильма, а потом перейти на страницу фильма, а можно сначала узнать все о фильме, а затем прочесть его обзор. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/cinema_film_overview_page.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Обзор Азиза Хасанова фильма «Никогда не говори прощай» на сайте&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/cinema_film_overview.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Обзор Азиза Хасанова фильма «Никогда не говори прощай» в Open Constructor&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Поле «Дата поступления в магазин» необходимо для формирования новинок на сайте, «количество проданных» — для формирования лидеров продаж, «рейтинг» — для определения популярных фильмов, «страна», «жанр», «год» — для формирования каталога. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/cinema_film.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Вот так выглядит гибридный документ фильма «Никогда не говори прощай»&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/cinema_film_page.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Вот так выглядит фильм «Никогда не говори прощай» на cinema.uz&lt;/em&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/Oju1PPjmJs8" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.34/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/Oju1PPjmJs8/</link>
			<category>How-to</category>
			<pubDate>Tue, 8 Jan 2008 11:59:59 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.34/</feedburner:origLink></item>
		<item>
			<title>Использование форм в Open Constructor / отправка письма с прикреплeнным файлом</title>
			<description>&lt;p&gt;В дополнение к &lt;a href="http://www.openconstructor.org/blog/index.php/.category.how-to/article/.22/"&gt;статье «Использование форм в Open Constructor»&lt;/a&gt;, расскажу об отправке писем с прикреплeнным файлом.&lt;/p&gt;
&lt;p&gt;Создание HTML кода и настройка объекта описаны в той статье, поэтому не буду повторяться.&lt;/p&gt;
&lt;p&gt;В качестве примера можно взять такую форму:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/attach1.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Чтобы создать этот код формы открываем во вкладке «Шаблоны» &lt;strong&gt;Разное / Включение шаблона&lt;/strong&gt;, создаем шаблон и вписываем в него HTML код формы.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=codespan&gt;&amp;lt;tr&amp;gt;&lt;br&gt;&amp;lt;td valign="top"&amp;gt;&amp;lt;b&amp;gt;Приложите файл с резюме&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;lt;td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;input name="attachment" class="bordered_1px" type="file"&amp;gt;&amp;lt;br /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;span class="form"&amp;gt;DOC, ODT или PDF, размер не более 500Кб&amp;lt;/span&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;{if $smarty.get.failed.attachment}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="error"&amp;gt;{$smarty.get.failed.attachment}&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;{/if}&lt;br&gt;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;lt;/tr&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Хочу обратить ваше внимание на то что, если форма отправляет письмо с прикрепленным файлом, нужно указать enctype в таге &amp;lt;form&amp;gt;:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=codespan&gt;&amp;lt;form action="/contact-us/submit/?cid={$cid}" method="post" enctype="multipart/form-data"&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;В &lt;strong&gt;объекте «Разное / Отправка писем»&lt;/strong&gt; указываем несколько параметров.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/attach2.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;В поле «Тип» выбираем значение File.&lt;/p&gt;
&lt;p&gt;В поле «Тип файла» обязательно &lt;strong&gt;указываем расширения файлов&lt;/strong&gt;, через запятую без пробелов, которые будут разрешены для отправки вместе с письмом, иначе вы не сможете закачать файл.&lt;/p&gt;
&lt;p&gt;В поле «Размер» также обязательно &lt;strong&gt;указываем минимальный и максимальный размер отправляемого файла&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ещe хочу обратить ваше внимание на чек-бокс в левом нижнем углу — если его отметить, загрузка файла пользователем сайта будет обязательна. То есть если вдруг посетитель сайта не укажет файл для отправки, попытается отправить файл с неразрешенным расширением или же файл не будет подходить по размерам, то будет показано сообщение из поля «Ошибка».&lt;/p&gt;
&lt;p&gt;Реализовать отправку письма с несколькими прикрепленными файлами возможно 2 способами:&lt;/p&gt;
&lt;h2&gt;&lt;br&gt;Первый способ&lt;/h2&gt;
&lt;p&gt;Создать HTML код с несколькими полями для прикрепления файлов и в объекте настроить их все по отдельности. Для этого в объекте отправки письма нажимаем кнопку «Добавить файл» и настраиваем его. Преимущество этого способа состоит в том, что можно настраивать каждый по-разному.&lt;/p&gt;
&lt;h2&gt;&lt;br&gt;Второй способ &lt;/h2&gt;
&lt;p&gt;Объясним на примере. Необходимо вместе с сообщением отправить несколько идентичных файлов, но точное их количество неизвестно.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/attach3.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Как и в предыдущем примере описывать подробно создание HTML кода и настройку объекта не буду.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=codespan&gt;&amp;lt;div id=”attach”&amp;gt;&lt;br&gt;&amp;lt;p&amp;gt;Вы можете отправить нам дополнительную информацию о Вашем проекте.&amp;lt;br&amp;gt;&lt;br&gt;При желании Вы можете отправить 5 файлов. Размер каждого файла не должен превышать 1 MB.&amp;lt;/p&amp;gt;&lt;br&gt;&amp;lt;div&amp;gt;&amp;lt;input name="attachment[]" class="bordered_1px" type="file"&amp;gt;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;a href="javascript: addFile();" id="addmore" title="Добавить еще один файл"&amp;gt;Добавить еще один файл&amp;lt;/a&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Далее в объекте указываем все параметры. А в поле «Тип» выбираем значение Files. Это означает что в поле attachment нашей формы будет передан массив файлов.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/attach4.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Обратите внимание на то, что при выборе «Тип» Files поле с загрузкой файла нельзя сделать обязательным для заполнения.&lt;/p&gt;
&lt;p&gt;Преимуществом данного способа является то, что можно закачать несколько файлов с одинаковыми характеристиками (размер, расширение), отвечающими всем требованиям настройки объекта.&lt;br&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/-HwSrArTXm4" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.32/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/-HwSrArTXm4/</link>
			<category>How-to</category>
			<pubDate>Tue, 25 Sep 2007 13:35:48 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.32/</feedburner:origLink></item>
		<item>
			<title>Использование stub-блоков в Open Constructor</title>
			<description>&lt;p&gt;Stub-блоки — одна из очень гибких особенностей Open Constructor, и небольшой пример, который мы разберем, это покажет.&lt;/p&gt;
&lt;p&gt;Что же такое stub-блок? Чем он отличается от обычного блока?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Обычные блоки&lt;/strong&gt; в шаблонах страниц задаются так:&lt;/p&gt;
&lt;p class=code&gt;{run_block id=head}&lt;/p&gt;
&lt;p&gt;Объект, размещенный в таком блоке, осуществит выборку данных и выведет эти данные, используя соответствующий шаблон.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Stub-блоки&lt;/strong&gt; в шаблонах страниц задаются так:&lt;/p&gt;
&lt;p class=code&gt;{def_block id=stub1}&lt;/p&gt;
&lt;p&gt;Stub-блоки отличаются от обычных тем, что объект, который находится в stub блоке загружается (т. е. осуществляет выборку данных), но не запускается (не осуществляет вывод&amp;nbsp; этих данных).&lt;/p&gt;
&lt;p&gt;Где это можно использовать?&lt;/p&gt;
&lt;p&gt;Приведем простой пример.&lt;/p&gt;
&lt;p&gt;На сайте есть список открытых вакансий. Вакансии реализованы гостевой книгой, где в поле Тема (subject) лежит наименование вакансии, а в контенте (content) — требования к вакансии.&amp;nbsp; Остальные поля гостевой книги мы использовать не будем.&lt;/p&gt;
&lt;p&gt;Итак, список вакансий есть. Как и где их выводить, мы обсуждать не будем, чтобы не уйти в сторону от основной темы.&lt;/p&gt;
&lt;p&gt;Теперь на сайте нужна форма, в которой можно предложить свою кандидатуру на одну из вакансий. В форме будут поля, которые реализуются элементарно, такие как: имя, e-mail, телефон.&lt;/p&gt;
&lt;p&gt;Но как быть со списком вакансий (drop-box)?&lt;/p&gt;
&lt;p&gt;Данные для этого списка&amp;nbsp; можно получить из списка вакансий. Вот тут нам и пригодится stub-блок.&lt;/p&gt;
&lt;p&gt;Идея такая: на странице с формой будут 2 объекта:&amp;nbsp; первый объект — список вакансий, который будет находиться в stub-блоке, второй объект — форма подачи заявки, которая будет находиться в обычном блоке.&lt;/p&gt;
&lt;p&gt;Как это делается:&lt;/p&gt;
&lt;p&gt;В &lt;strong&gt;шаблоне страницы&lt;/strong&gt; поместим где-нибудь в самом начале шаблона определение блока {def_block id=stub1}&lt;/p&gt;
&lt;p&gt;Далее&amp;nbsp; создадим объект «список всех сообщений», который будет помещен в этот блок на странице с формой. Шаблон объекта создадим такой:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=code&gt;{foreach from=$messages item=message}&lt;br&gt;&amp;nbsp;&amp;lt;option&amp;gt;{$message.subject}&amp;lt;/option&amp;gt;&lt;br&gt;{/foreach}&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Поскольку объект «список вакансий» будет находиться в stub-блоке на странице с формой, он загрузит данные о вакансиях, но не выведет его. Мы выведем его в другом месте. В шаблоне формы.&lt;/p&gt;
&lt;p&gt;Саму форму реализуем «включением шаблона».&lt;/p&gt;
&lt;p&gt;Код шаблона будет такой:&lt;/p&gt;
&lt;div class=code&gt;
&lt;p&gt;{set cid = $ctx-&amp;gt;newCaptchaId()}&lt;br&gt;&amp;lt;form method="post" action="sent/?cid={$cid}" enctype="multipart/form-data"&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Имя&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;input type="text" name="name" value="{$smarty.get.name|escape}"&amp;gt;&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{if $smarty.get.failed.name}&amp;lt;div class=error&amp;gt;{$smarty.get.failed.name}&amp;lt;/div&amp;gt;{/if}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;E-mail&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;input type="text" name="email" value="{$smarty.get.email|escape}"&amp;gt;&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{if $smarty.get.failed.email}&amp;lt;div class=error&amp;gt;{$smarty.get.failed.email}&amp;lt;/div&amp;gt;{/if}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Телефон&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;input type="text" name="phone" value="{$smarty.get.phone|escape}"&amp;gt;&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{if $smarty.get.failed.phone}&amp;lt;div class=error&amp;gt;{$smarty.get.failed.phone}&amp;lt;/div&amp;gt;{/if}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Вакансия&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;select name="vacancy"&amp;gt;{run_block id=stub1}&amp;lt;/select&amp;gt;&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Файл с резюме&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;input type="file" name="attachment"&amp;gt;&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;small&amp;gt;Принимается файлы в форматах doc, pdf, размером не более 500Кб&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;img class=captcha src="/res/captcha/{$cid}.png" onclick="this.src = '/res/captcha/{$cid}.png?' + (new Date()).getTime();"&amp;gt;&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;small&amp;gt;Введите символы, которые Вы видите на картинке.&amp;lt;/small&amp;gt;&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;input type="text" name="f_cid" value="" size="6"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;{if $smarty.get.failed.f_cid}&amp;lt;div class=error&amp;gt;{$smarty.get.failed.f_cid}&amp;lt;/div&amp;gt;{/if}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;input type="submit" value="Отправить"&amp;gt;&lt;br&gt;&amp;lt;/form&amp;gt;&lt;/p&gt;&lt;/div&gt;
&lt;p&gt;&lt;br&gt;Как видно в коде,&amp;nbsp; внутри&amp;nbsp; тега &amp;lt;select&amp;gt; поля «Вакансия» стоит блок {run_block id=stub1}, который и выведет данные из stub-блока stub1.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/KJbueSZ2KSI" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.31/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/KJbueSZ2KSI/</link>
			<category>How-to</category>
			<pubDate>Fri, 7 Sep 2007 08:26:07 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.31/</feedburner:origLink></item>
		<item>
			<title>Cоздание страницы со скачиваемыми файлами</title>
			<description>&lt;p&gt;Иногда при создании сайта требуется страница, на которой нужно организовать скачивание определённых файлов. В данной статье рассмотрен пример создания такой страницы.&lt;/p&gt;
&lt;p&gt;Для начала нам нужно создать раздел данных, где будут храниться файлы.&lt;/p&gt;
&lt;p&gt;Для этого переходим во вкладку «Данные» и создаём раздел файлов.&lt;/p&gt;
&lt;p&gt;В поле «Разрешенные типы файлов» нужно &lt;strong&gt;обязательно&lt;/strong&gt; указать через запятую без пробелов расширения файлов, которые будут храниться в данном разделе, иначе вы не сможете закачать ни одного файла.&lt;/p&gt;
&lt;p&gt;Для создания шаблона&amp;nbsp;блока&amp;nbsp;закачки файлов требуется перейти во вкладку «Шаблоны», открыть «&lt;strong&gt;Файлы / Список файлов&lt;/strong&gt;», создать шаблон и написать в него HTML код блока.&lt;/p&gt;
&lt;p&gt;HTML код блока: &lt;/p&gt;
&lt;div class=code&gt;&amp;lt;div class="downloads"&amp;gt;&lt;br&gt;&amp;nbsp;{if $header}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;{$header}&amp;lt;/h2&amp;gt;&lt;br&gt;&amp;nbsp;{/if}&lt;br&gt;&amp;nbsp;&amp;lt;table cellpadding="0" cellspacing="5"&amp;gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;{foreach from=$files item=file}&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;&amp;lt;img src="/images/book_file.gif" width="24" height="30" border="0" alt="{$file.header}"&amp;gt;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;a href="{$file.href}" title="{$file.header}"&amp;gt;{$file.header}&amp;lt;/a&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;span&amp;gt; {$file.type|upper} {$file.size|filesize_format}&amp;lt;/span&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;{/foreach}&lt;br&gt;&amp;nbsp;&amp;lt;/table&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;Хочу обратить внимание на:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;img src="/images/{$file.type}.gif " — в зависимости от типа файла будет грузиться соответствующая иконка&lt;/li&gt;
&lt;li&gt;{$file.size|filesize_format} — модификатор filesize_format не является встроенным и написан отдельно, он используется для перевода размера файла из байтов в килобайты или мегабайты&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Далее создаём объект «&lt;strong&gt;Файлы / Список файлов&lt;/strong&gt;» и связываем этот объект с созданным шаблоном.&lt;/p&gt;
&lt;p&gt;В объекте можно указать количество отображаемых файлов и по какому принципу их сортировать.&lt;/p&gt;
&lt;p&gt;Далее ставим этот объект на нужную нам страницу и смотрим, что у нас получилось. &lt;/p&gt;&lt;/div&gt;
&lt;div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/L8rVKRYc6VA" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.28/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/L8rVKRYc6VA/</link>
			<category>How-to</category>
			<pubDate>Fri, 31 Aug 2007 07:30:16 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.28/</feedburner:origLink></item>
		<item>
			<title>Создаем блог на Open Constructor’e</title>
			<description>&lt;p&gt;Идея написать такую статью висела в отдаленных локациях мозга уже очень давно. Блог для современного фреймворка — это все равно что Hello World! для языка программирования, так что идея, что называется, висела в воздухе.&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;Анализ&lt;/h3&gt;
&lt;p&gt;Прежде чем начать, давайте быстренько набросаем на бумаге структуру данных. Обычный пост блога включает в себя, как правило, следующие поля:&lt;/p&gt;
&lt;ul&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;/ul&gt;
&lt;p&gt;Все, как видите, очень просто. Блог мы будем создавать по стандартному шаблону: в шапке название, слева категории, справа посты. В общем, поехали.&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;Структура данных&lt;/h3&gt;
&lt;p&gt;Начнем с того, что создадим структуру данных для нашего блога. Итак, устанавливаем Open Constructor, заходим как root и открываем вкладку «Данные». Эта вкладка у нас пока что девственно пуста. Так как блог у нас не втискивается ни в один стандартный тип данных, приходится создавать раздел гибридных данных.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://www.openconstructor.org/res/images/oc_blog_1.gif" target=_blank&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_1_s.gif"&gt;&lt;/a&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_2.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;В открывшемся окне заполняем поля и жмем «Создать». Вуаля. Раздел готов к конфигурированию. Итак, вспомним еще раз нашу структуру. Как видим поле «Заголовок» уже присутствует по умолчанию. Тем лучше, нам работы меньше. Поехали дальше. Жмем «Добавить поле».&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_3.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_4.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Текст поста, скорее всего, будет простым полем с HTML-текстом. После создания не забываем разрешить базовые HTML-теги. &lt;a href="http://www.openconstructor.org/blog/index.php/.category.how-to/article/.6/"&gt;Подробнее о фильтрации тегов и их аттрибутов&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_5.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Дата создания заводится также просто как примитивное поле типа Date. На категории же немного притормозим.&lt;/p&gt;
&lt;p&gt;Чтобы создать поле типа «Дерево», нам нужно сначала это дерево посадить. Для этого открываем вкладку «Каталог», нажимаем в панели инструментов «Создать узел», вводим ключ и название дерева. Готово!&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://www.openconstructor.org/res/images/oc_blog_6.gif" target=_blank&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_6_s.gif"&gt;&lt;/a&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Теперь можно вернуться к профилю гибридного раздела и создать поле «Категория».&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_7.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_8.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;С комментариями тоже не все так просто. По умолчанию специального типа «Комментарии» в Open Constructor’е нет. Но блин какой же это блог без камментов? Тлог блин какой-то никому не нужный. Выход к счастью есть. Очень похожим на комментарии является тип данных «Гостевая книга». И в самом деле, что такое комментарии, как не гостевая книга, отдельная для каждого поста? Ура! Решение найдено. Возвращаемся во вкладку «Данные» и создаем прототип для комментариев. Ничего не буду объяснять. Все и так понятно по скриншотам.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://www.openconstructor.org/res/images/oc_blog_9.gif" target=_blank&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_9_s.gif"&gt;&lt;/a&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_10.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_11.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Просто как 1, 2, 3...&lt;/p&gt;
&lt;p&gt;Ну вот и все. Структура данных готова.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_12.gif"&gt;&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;Структура сайта&lt;/h3&gt;
&lt;p&gt;Переходим во вкладку «Карта сайта». Здесь тоже пока девственно пусто. Но это ненадолго. Включим мозг и быстренько представим себе структуру обычного блога. Наверное, что-то вроде этого:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Главная&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Страница категории&lt;/li&gt;
&lt;li&gt;Страница поста&lt;/li&gt;&lt;/ul&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_14.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Не забываем при создании страницы категории и поста поставить галочку «Маршрутицировать вируальные URI на подразделы».&lt;/p&gt;
&lt;p&gt;Страницы просто так хоть и создаются, но без шаблона работать отказываются. Ну что ж, я думаю, мы уже созрели для этого. Переходим во вкладку «Шаблоны», открываем раздел «Сайт / Страница» и нажимаем кнопку «Создать шаблон».&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://www.openconstructor.org/res/images/oc_blog_15.gif" target=_blank&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_15_s.gif"&gt;&lt;/a&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Не знаю, умеете ли вы создавать шаблоны страниц, но на всякий случай поясню, что run_block и есть разбиение страницы на логические блоки. Шаблон, как я уже писал выше, у нас стандартный рабоче-крестьянский: лево-право, шапка-подвал.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_16.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Вернемся во вкладку «Карта сайта» и выбираем для страницы Root наш шаблон «Страница». Жмем кнопку «Сохранить». Прекрасненько. Каркас страницы готов. Да, не забудьте написать файл стилей для нашего шаблона и привязать его к страницам.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_17.gif"&gt;&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3&gt;Список категорий&lt;/h3&gt;
&lt;p&gt;Прежде чем выводить список категорий, создадим несколько.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://www.openconstructor.org/res/images/oc_blog_18.gif" target=_blank&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_18_s.gif"&gt;&lt;/a&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Когда список готов, переходим во вкладку «Объекты». Знакомо-таки, да? Чистехонько. Немного обезобразим эту чистоту. Переходим в раздел «Гибридные данные / Структура» и жмем кнопку «Создать объект».&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://www.openconstructor.org/res/images/oc_blog_19.gif" target=_blank&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_19_s.gif"&gt;&lt;/a&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_20.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;После создания объекта на странице его конфигурации:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Чекаем чекбокс «Категория» в группе «Поля по которым формируется иерархия»&lt;/li&gt;
&lt;li&gt;Кликаем по кнопке «Создать новый» напротив поля «Использовать шаблон»&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;В окне создания нового объекта кликаем по кнопке «Шаблон по умолчанию», дабы не заморачиваться пока что, и сохраняем шаблон.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_21.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Возвращаемся в окошко профиля объекта, там новорожденный шаблон уже выбран. Жмем кнопку «Сохранить». Объект готов. Теперь нужно его присобачить в правильное место.&lt;/p&gt;
&lt;p&gt;Нажимаем кнопку «Места применения объекта». В открывшемся окошке чекаем все страницы, выбираем блок «right» и сохраняем. &lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_22.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;А теперь можно посмотреть, что получилось. Открываем в браузере адрес &lt;a href="http://blog/"&gt;http://blog/&lt;/a&gt; (или как там у вас) и наслаждаемся.&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;Список постов&lt;/h3&gt;
&lt;p&gt;Переходим к самому важному, а именно списку постов на главной странице. Для начала внесем несколько постов в блог. Открываем вкладку «Данные», входим в раздел «Гибридные данные / Блог» и жмем кнопку с зеленым плюсом.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;a href="http://www.openconstructor.org/res/images/oc_blog_23.gif" target=_blank&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_23_s.gif"&gt;&lt;/a&gt; 
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Возьмем рыбку из Яндекс.Рефератов и нашлепаем три-четыре поста в блог.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_24.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Создаем объект вывода. По уже проторенной дорожке идем во вкладку «Объекты», но теперь в раздел «Гибридные данные / Список документов». Создаем объект.&lt;/p&gt;
&lt;p&gt;Настройка объекта следующая:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Создаем шаблон. Правда вместо шаблона по умолчанию пишем свой.&lt;/li&gt;
&lt;li&gt;Задаем идентификатор узла – category.&lt;/li&gt;
&lt;li&gt;Создаем шаблон для URL. Ссылки будут вида /post/index.php/.1, где .1 – это идентификатор поста&lt;/li&gt;
&lt;li&gt;Выбираем для вывода поля «Заголовок», «Дата создания» и «Текст поста»&lt;/li&gt;
&lt;li&gt;Настраиваем сортировку по полю «Дата создания» по убыванию&lt;/li&gt;
&lt;li&gt;Прикручиваем этот объект к блоку left на главной странице и в странице категории.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_25.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_26.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Открываем в браузере http://blog/ и смотрим на результат. Кликаем по одной из категорий, и снова наслаждаемся результатом.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_27.gif"&gt;&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;Страница поста&lt;/h3&gt;
&lt;p&gt;И опять та же последовательность действий. Создаем объект вывода в разделе «Гибридные данные / Гибридный документ». &lt;/p&gt;
&lt;p&gt;Настраиваем объект:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Идентификатор документа post&lt;/li&gt;
&lt;li&gt;Выбираем для вывода поля «Заголовок», «Дата создания», «Текст поля» и «Комментарии»&lt;/li&gt;
&lt;li&gt;Пишем шаблон.&lt;/li&gt;
&lt;li&gt;Назначаем этому объекту блок left на странице поста.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_28.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Готово!&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;Комментарии&lt;/h3&gt;
&lt;p&gt;Так как, комментарии это отдельный подраздел данных для типа «Блог», для их вывода нужно создавать отдельный объект вывода сообщений гостевой книги.&lt;/p&gt;
&lt;p&gt;Настраиваем объект так, как указано на скриншоте. Назначаем его блоку PRE на странице поста.&lt;/p&gt;
&lt;p&gt;Создадим теперь объект вывода сообщений из гостевой книги. Для этого переходим в раздел «Гостевая книга / Список всех сообщений».&lt;/p&gt;
&lt;p&gt;Настраиваем объект:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Создаем шаблон. Можно принять тот, что по умолчанию.&lt;/li&gt;
&lt;li&gt;Заголовок объекта указываем «Комментарии»&lt;/li&gt;
&lt;li&gt;Ставим галочку «Выводить в обратном порядке»&lt;/li&gt;
&lt;li&gt;Чтобы было понятно, что список комментариев нужен для конкретного поста – указываем определение раздела через контекст как .post.comments/id&lt;/li&gt;
&lt;li&gt;Назначаем этот объект блоку left2 на странице поста (не забудьте предварительно добавить этот блок в шаблон страницы)&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_34.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Комментариев у нас пока нет, чтобы иметь возможность запостить их, добавляем в шаблон списка комментариев форму добавления комментариев.&lt;/p&gt;
&lt;p&gt;Получается вот такой код:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class=code&gt;{set cid = $ctx-&amp;gt;newCaptchaId()}&lt;br&gt;&amp;lt;div class="block"&amp;gt;&lt;br&gt;{if $header}&lt;br&gt;&amp;nbsp;&amp;lt;h1 class="head"&amp;gt;{$header}&amp;lt;/h1&amp;gt;&lt;br&gt;{/if}&lt;br&gt;&amp;nbsp;&amp;lt;div class="blockcont"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;ul&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;{foreach from=$messages item=message}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;li class="item" title="{$message.subject}"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h5 class="pubname"{if $message.published == 0} style="color: #666666;"{/if}&amp;gt;{$message.subject}&amp;lt;/h5&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;i&amp;gt;&amp;lt;a href="&lt;a href="mailto:%7B$message.email%7D%22%7Bif"&gt;mailto:{$message.email}"{if&lt;/a&gt; $message.published == 0} style="color: #666666;"{/if}&amp;gt;{$message.author}&amp;lt;/a&amp;gt;&amp;lt;/i&amp;gt; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{if $message.date}&amp;lt;nobr class="date"&amp;gt;{$message.date}&amp;lt;/nobr&amp;gt;{/if}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{if $message.html}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="intro"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{$message.html}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{/if}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;a href="{$message.href}"{if $message.published == 0} style="color: #666666;"{/if} class="more" title="{$more}"&amp;gt;{$more}&amp;lt;/a&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/li&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;{/foreach}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/ul&amp;gt;&lt;br&gt;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;lt;form method="POST" action="./sent?cid={$cid}"&amp;gt;&lt;br&gt;&amp;nbsp;Имя &amp;lt;input type="text" name="f_author" /&amp;gt;&amp;lt;br /&amp;gt;&lt;br&gt;&amp;nbsp;E-mail &amp;lt;input type="text" name="f_email" /&amp;gt;&amp;lt;br /&amp;gt;&lt;br&gt;&amp;nbsp;Сообщение &amp;lt;br /&amp;gt;&amp;lt;textarea name="f_message"&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br&gt;&amp;nbsp;&amp;lt;img src="/res/captcha/{$cid}.png" id="img-captcha" onclick="this.src = '/res/captcha/{$cid}.png?' + (new Date()).getTime();"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;lt;input type="text" name="f_cid" value="" size="10" id="comment-captcha"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;lt;br /&amp;gt;&amp;lt;br /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;lt;input type="Submit" /&amp;gt;&lt;br&gt;&amp;nbsp;&amp;lt;/form&amp;gt;&lt;br&gt;&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Ну а теперь необходимо создать страницу обработчик для добавления комментария. Как видно из формы она имеет алиас sent и находится уровнем ниже страницы поста.&lt;/p&gt;
&lt;p&gt;Вкратце добавление комментария состоит из следующих этапов:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Загрузка поста&lt;/li&gt;
&lt;li&gt;Запуск обработчика сообщения гостевой книги&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Для каждого из них потребуется свой объект. Я думаю, Вы уже достаточно набили руку на создании объектов, поэтому просто приведу скриншоты с конфигурацией.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_31.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/oc_blog_33.gif"&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Напоследок добавим редирект со страницы добавления комментария обратно к странице поста. Для этого напишем объект PHP-кода.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Создаем раздел PHP-кода&lt;/li&gt;
&lt;li&gt;Добавляем код «POST обработки комментариев»&lt;br&gt;&lt;/li&gt;
&lt;p class=code&gt;&amp;lt;?php&lt;br&gt;&amp;nbsp;$name = $_POST['f_author'];&lt;br&gt;&amp;nbsp;$email = @$_POST['f_email'];&lt;br&gt;&amp;nbsp;$expires = time()+3888000;//Cookies Lifetime is 45 days&lt;br&gt;&amp;nbsp;setcookie('comment[author]', $name, $expires, '/');&lt;br&gt;&amp;nbsp;setcookie('comment[email]', $email, $expires, '/');&lt;br&gt;&amp;nbsp;$obj = &amp;amp;$ctx-&amp;gt;getObject(17);&lt;br&gt;&amp;nbsp;$ref = explode('?', $_SERVER['HTTP_REFERER']);&lt;br&gt;&amp;nbsp;header("Location: ".$ref[0].'#c'.$obj-&amp;gt;success);&lt;br&gt;?&amp;gt;&lt;/p&gt;
&lt;li&gt;Создаем объект «Включения РНР-кода» и назначем ему блок POST на странице добавления комментария.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Ну вот и все. Можно добавлять комментарии. Блог готов.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/ZsKDYGfJ_7g" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.27/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/ZsKDYGfJ_7g/</link>
			<category>How-to</category>
			<pubDate>Fri, 31 Aug 2007 06:51:08 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.27/</feedburner:origLink></item>
		<item>
			<title>Использование форм в Open Constructor</title>
			<description>&lt;p&gt;В Open Constructor имеется удобный обработчик форм, который берёт на себя всю работу по отправке писем, валидацию формы на основе регулярных выражений и многое другое. Остаётся только написать html форму.&lt;/p&gt;
&lt;p&gt;Для создания кода формы используется «Включение шаблона», для этого во вкладке «Шаблоны» открываем &lt;b&gt;Разное / Включение шаблона,&lt;/b&gt; создаём шаблон и пишем в него HTML код формы.&lt;/p&gt;
&lt;p&gt;В качестве примера возьмем такую форму&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/form.gif"&gt;&lt;/p&gt;
&lt;p&gt;HTML код формы:&lt;/p&gt;
&lt;div class=code&gt;{set cid = $ctx-&amp;gt;newCaptchaId()}&lt;br&gt;&amp;lt;br /&amp;gt;&lt;br&gt;Все поля, выделенные &amp;lt;b&amp;gt;жирным&amp;lt;/b&amp;gt;, обязательны для заполнения.&amp;lt;br&amp;gt;&amp;lt;br /&amp;gt;&lt;br&gt;&amp;lt;form action="/contact-us/submit/?cid={$cid}" method="post"&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;table&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td valign="top"&amp;gt;&amp;lt;b&amp;gt;Ваше имя&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input name="name" type="text" size="35" value="{$smarty.get.name|escape}"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{if $smarty.get.failed.name}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="error"&amp;gt;{$smarty.get.failed.name}&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{/if}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td valign="top"&amp;gt;&amp;lt;b&amp;gt;E-mail&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input name="email" type="text" size="35" value="{$smarty.get.email|escape}"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{if $smarty.get.failed.email}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="error"&amp;gt;{$smarty.get.failed.email}&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{/if}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td valign="top"&amp;gt;&amp;lt;b&amp;gt;Сообщение&amp;lt;/b&amp;gt;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;textarea name="message" rows=5 cols=40 wrap="off"&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{if $smarty.get.failed.message}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="error"&amp;gt;{$smarty.get.failed.message}&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{/if}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/table&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;table&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;tr&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;Пожалуйста, введите текст,&amp;lt;br&amp;gt; изображенный на картинке:&amp;lt;/td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;img src="/res/captcha/{$cid}.png" style="border: 1px solid #000; margin-top: 5px;" onclick="this.src = '/res/captcha/{$cid}.png?' + (new Date()).getTime();"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input type="text" style="margin: 0 10px;" name="f_cid"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{if $smarty.get.failed.f_cid}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class="error" style="margin: 0 10px;"&amp;gt;{$smarty.get.failed.f_cid}&amp;lt;/div&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{/if}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;td&amp;gt;&amp;lt;input src="/images/otpravit.gif" style="margin-left: 30px;" type="image"&amp;gt;&amp;lt;/td&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/tr&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/table&amp;gt;&lt;br&gt;&amp;lt;/form&amp;gt;&lt;/div&gt;
&lt;p&gt;В примере форма находится на странице /contact-us/, в параметре формы «action» указано /contact-us/submit/, где форма будет обработана объектом «Отправка писем» (описано далее).&lt;/p&gt;
&lt;p&gt;Далее создаём объект &lt;b&gt;Разное / Включение шаблона&lt;/b&gt; и связываем этот объект с созданным шаблоном.&lt;/p&gt;
&lt;p&gt;При нажатии кнопки «Отправить», данные формы будут отправлены на /contact-us/submit/.&lt;/p&gt;
&lt;p&gt;На странице /contact-us/submit/ нужно поставить объект «Отправка писем», но сначала создадим для этого объекта шаблон.&lt;br&gt;Перейдем во вкладку «Шаблоны», откроем &lt;b&gt;Разное / Включение шаблона&lt;/b&gt;, создадим шаблон и напишем в него HTML код письма (для упрощения работы лучше взять за основу шаблон по умолчанию). &lt;/p&gt;
&lt;div class=code&gt;&amp;lt;html&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;head&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;Отправка сообщения&amp;lt;/title&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;meta http-equiv="Content-Type" content="text/html; charset={$charset}"&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/head&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;body&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Имя: {$msg.name|escape}&amp;lt;br&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;E-mail: {$msg.email}&amp;lt;br&amp;gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Сообщение:&amp;lt;br&amp;gt; {$msg.message|nl2br|escape}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/body&amp;gt;&lt;br&gt;&amp;lt;/html&amp;gt;&lt;/div&gt;
&lt;p&gt;После создания шаблона во вкладке «Объекты» создаётся объект &lt;b&gt;Разное / Отправка писем&lt;/b&gt;. &lt;/p&gt;
&lt;p&gt;В данном объекте задаются все основные параметры. Объект настраивается следующим образом:&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/parametr.gif"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/pole1.gif"&gt; &lt;img src="http://www.openconstructor.org/res/images/pole2.gif"&gt;&lt;/p&gt;
&lt;p&gt;Все параметры, описанные в объекте передаются в шаблон чезер массив $msg.&lt;/p&gt;
&lt;p&gt;Если данные не прошли валидацию, то объект вернет пользователя снова на форму с соответствующими сообщениями об ошибках.&lt;/p&gt;
&lt;p&gt;О Captcha подробно было рассказано в статье «Использование CAPTCHA в формах»&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/b9k8qr9J9Fg" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.22/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/b9k8qr9J9Fg/</link>
			<category>How-to</category>
			<pubDate>Tue, 31 Jul 2007 06:44:24 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.22/</feedburner:origLink></item>
		<item>
			<title>Список мелочей, из-за которых могут возникнуть проблемы с установкой Open Constructor</title>
			<description>&lt;p&gt;Наиболее распространенной причиной проблем с установкой Open Constructor является неправильная конфигурация сервера.&lt;/p&gt;
&lt;h2&gt;&lt;br&gt;PHP&lt;/h2&gt;
&lt;p&gt;На сервере &lt;strong&gt;должен стоять PHP4&lt;/strong&gt;. Поддержка PHP5 планируется в ближайшее время.&lt;/p&gt;
&lt;p&gt;Проблемы могут возникнуть, если PHP стоит не как &lt;strong&gt;модуль Apache&lt;/strong&gt;, а как CGI.&lt;/p&gt;
&lt;p&gt;В конфигурации PHP &lt;strong&gt;должен быть выключен безопасный режим: safe_mode = Off&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;&lt;br&gt;MySQL&lt;/h2&gt;
&lt;p&gt;До выхода следующего релиза &lt;strong&gt;рекомендуется использовать MySQL версии 4.1&lt;/strong&gt;. MySQL ниже 4.1 не поддерживается. &lt;/p&gt;
&lt;p&gt;Поддержка MySQL 5 уже введена. Она пойдет в релиз с версии 3.9.1. Те, кто не могут дождаться релиза, могут взять последнюю SVN версию из /branches/3.9.x&lt;/p&gt;
&lt;p&gt;Адрес SVN: &lt;a href="http://code.google.com/p/openconstructor/source"&gt;http://code.google.com/p/openconstructor/source&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;&lt;br&gt;FTP&lt;/h2&gt;
&lt;p&gt;Даже если вы ставите Open Constructor на Windows для локальной разработки, для работы Open Constructor &lt;strong&gt;необходимо наличие FTP сервера&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Должен быть настроен FTP account&lt;/strong&gt;, имеющий доступ к директории, в которой хранятся файлы сайта.&lt;/p&gt;
&lt;p&gt;Хорошей практикой считается делать домашним каталогом FTP пользователя папку на один уровень выше, чем корневой каталог HTTP.&lt;/p&gt;
&lt;p&gt;Например, если HTTP файлы лежат в /wwwroot/mysite1/httpdocs, то домашним каталогом FTP пользователя нужно настроить /wwwroot/mysite1/&lt;/p&gt;
&lt;p&gt;В данном случае во время установки Open Constructor в диалоге настройки FTP соединения в графе «Корень сайта:» нужно будет указать httpdocs, т. е. путь к корневому каталогу HTTP относительно домашнего каталога FTP.&lt;/p&gt;
&lt;p&gt;Windows пользователи, у которых FTP сервер еще не установлен, могут воспользоваться бесплатным FileZilla Server (&lt;a href="http://filezilla.sourceforge.net/"&gt;http://filezilla.sourceforge.net/&lt;/a&gt;)&lt;/p&gt;
&lt;h2&gt;&lt;br&gt;Internet Explorer&lt;/h2&gt;
&lt;p&gt;Если конфигурация PHP, MySQL и FTP соответствует требованиям, но ошибки при установке все равно возникают, возможно вы пытаетесь поставить Open Constructor из браузеров FireFox или Opera.&lt;/p&gt;
&lt;p&gt;Установка и работа в админке должна производиться &lt;strong&gt;только из Internet Explorer&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Для &lt;strong&gt;FireFox&lt;/strong&gt; можно использовать плагин IE Tab (&lt;a href="http://ietab.mozdev.org/"&gt;http://ietab.mozdev.org/&lt;/a&gt;), который умеет открывать окно Internet Explorer как Tab в FireFox. Нужно добавить в настройки IE Tab в site filter правило */openconstructor/*, чтобы для всех страниц админки Open Constructor использовался плагин IE Tab.&lt;/p&gt;
&lt;h2&gt;&lt;br&gt;JRE&lt;/h2&gt;
&lt;p&gt;Еще один немаловажный фактор: в Open Constructor для редактирования PHP кода и шаблонов &lt;strong&gt;используется Java Applet&lt;/strong&gt;. Applet обеспечивает подсветку синтаксиса, форматирование кода.&lt;/p&gt;
&lt;p&gt;Тем, у кого Java еще не установлен, нужно скачать Java Runtime Environment (JRE) для работы Java. Рекомендуется скачать последнюю версию JRE.&lt;/p&gt;
&lt;p&gt;Во всех версиях после JRE—1.5.0.07 для выравнивания кода (сдвига нескольких строк вправо или влево) можно использовать комбинации Ctrl+Up и Ctrl+Down.&lt;/p&gt;
&lt;p&gt;В более ранних версиях, а именно JRE—1.5 до Update 07 включительно, в добавок к этому вы можете выделить строки и нажать Tab или Shift+Tab для сдвига вправо или влево соответственно.&lt;/p&gt;
&lt;p&gt;Последний JRE можно скачать отсюда: &lt;a href="http://java.com/en/download/manual.js"&gt;http://java.com/en/download/manual.js&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;JRE 5.0 Update 07 можно скачать отсюда: &lt;a href="http://java.sun.com/products/archive/"&gt;http://java.sun.com/products/archive/&lt;/a&gt; &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/jDyRlQ_2B_8" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.faq/article/.20/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/jDyRlQ_2B_8/</link>
			<category>FAQ</category>
			<pubDate>Tue, 17 Jul 2007 07:24:25 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.faq/article/.20/</feedburner:origLink></item>
		<item>
			<title>Преимущества и недостатки Open Constructor, с которыми я столкнулся вначале</title>
			<description>&lt;p&gt;Пока у меня было две возможности поработать на Open Constructor: окончание второй языковой версии очень крупного сайта и создание небольшого сайта на двух языках. Но уже это дало мне почувствовать преимущества и недостатки системы.&lt;/p&gt;
&lt;h2&gt;&lt;br&gt;Преимущества&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Большое количество шаблонов по умолчанию&lt;/strong&gt;, которые наглядно объясняют, что можно сделать в этом разделе.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Практически все изменения на сайте можно делать через браузер&lt;/strong&gt;. FTP нужен только для изменения картинок, которые используются в самом дизайне сайта (кнопки, логотип, иллюстрации), css и js.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Удобный визуальный редактор с хорошей подсветкой кода&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;&lt;img src="http://www.openconstructor.org/res/images/applet_php.gif"&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Удобно изменять расположение блоков на сайте&lt;/strong&gt;, не изменяя при этом шаблон.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Возможность повторного использования одного шаблона&lt;/strong&gt;.&lt;/li&gt;&lt;/ol&gt;
&lt;h2&gt;&lt;br&gt;Недостатки&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Наличие текста в шаблонах&lt;/strong&gt;. На многоязычном сайте приходится создавать и редактировать одинаковые шаблоны с одинаковым содержанием, но на разных языках, что ведет к увеличению количества шаблонов.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Неудобство создания многоязыковых сайтов&lt;/strong&gt;. Приходится использовать либо другой домен и копировать полностью сайт и Open Constructor, либо создавать новую папку и поднимать там сайт с самого начала. Тогда как в CMS Irokez изначально выбирается количество языков, которые будут использоваться на сайте, и в процессе создания появляется нужное количество полей, значение которых будет зависеть от выбранного языка. Например: в Open Constructor приходится для каждой страницы создавать свой документ с даннами, а в Irokez количество полей для ввода контента соответствует количеству языков и содержится это всё в одном документе.&lt;/li&gt;
&lt;li&gt;Я считаю, что &lt;strong&gt;Open Constructor нежелательно использовать для создание сайтов-визиток&lt;/strong&gt;, потому что огромное количество функций при создании сайта не используются, тогда как для создания больших сайтов эта CMS удобна на все 100%. &lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Позже я узнал, что недостатки, касающиеся многоязыковых сайтов, являются последствиями тех решений, которые были приняты при разработке системы. &lt;/p&gt;
&lt;p&gt;Разработчики решили, что две версии одного сайта должны быть разными, но не всегда так хочет клиент. Поэтому в итоге получаются две абсолютно одинаковые версии одного сайта. &lt;/p&gt;
&lt;p&gt;Но об этом подробнее в комментариях расскажут разработчик и информационный архитектор системы. &lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/9vpQFEyCvR0" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.imho/article/.19/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/9vpQFEyCvR0/</link>
			<category>IMHO</category>
			<pubDate>Fri, 13 Jul 2007 07:13:09 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.imho/article/.19/</feedburner:origLink></item>
		<item>
			<title>CMS Open Constructor — бесплатная CMS с открытым исходным кодом (GNU GPL v2) для веб-студий</title>
			<description>&lt;h3&gt;CMS Open Constructor для веб-студий или фрилансеров&lt;/h3&gt;
&lt;p&gt;Всю гибкость CMS Open Constructor могут почувствовать разработчики, имеющие базовые знания HTML, CSS, Smarty — знания PHP не нужны.&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;Open Constructor — не классическая CMS&lt;/h3&gt;
&lt;p&gt;Open Constructor нельзя назвать классической модульной CMS, поскольку подход к созданию сайтов на Open Constructor отличается от того, что привыкли ожидать пользователи модульных CMS.&lt;/p&gt;
&lt;p&gt;В отличие от большинства модульных CMS, которые собирают сайт нужной конфигурации из готовых модулей, Open Constructor предназначен именно для создания сайтов «с нуля».&lt;/p&gt;
&lt;p&gt;В Open Constructor нет таких понятий, как «модуль» или «тема оформления», с помощью которых в модульных CMS быстро собираются готовые сайты.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/constructor_data.gif"&gt;&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;Гибкий Open Constructor&lt;/h3&gt;
&lt;p&gt;В отличие от многих модульных CMS, в Open Constructor имеется необычайно гибкий инструментарий, позволяющий создавать &lt;a href="http://esector.ru/projects/index.php/browse/.esp.website/"&gt;&lt;u&gt;сайты высокой сложности&lt;/u&gt;&lt;/a&gt;, практически не прибегая к программированию, используя готовые встроенные разделы данных, такие как «публикации», «фотогалереи», «статьи», «гостевые книги», или создавая собственные структуры данных — «гибридные данные». &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Гибридные данные&lt;/strong&gt; — мощная отличительная особенность CMS Open Constructor. Можно создавать свои разделы данных, используя комбинацию из примитивных типов данных, таких как: числа, дата, время, простой текст, HTML текст, логический. &lt;/p&gt;
&lt;p&gt;В дополнение к примитивам, есть типы данных — файл, документ (фактически, связь с другим документом системы), массив документов, раздел данных, рейтинг документа. Созданные подобным образом разделы гибридных данных впоследствии функционируют также, как и «родные» разделы данных — «статьи», «публикации».&lt;/p&gt;
&lt;p&gt;Кроме того, документы «гибридных типов данных» можно привязывать к одной или нескольким узлам «деревьев», создавая каталоги классифицированных документов. &lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/tree.gif"&gt;&lt;/p&gt;
&lt;p&gt;Например, если создать дерево жанров (фантастика, комедия, драма) и гибридный тип документов «фильм», то связав их, можно сделать каталог фильмов с возможностью выборки фильмов по его жанру, причем каждый фильм может быть привязан к одному или сразу нескольким жанрам. &lt;/p&gt;
&lt;p&gt;Деревья и гибридные документы также создаются без программирования на PHP, используются только стандартные средства Open Constructor.&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;Вывод данных в CMS Open Constructor — дизайн отдельно, контент отдельно&lt;/h3&gt;
&lt;p&gt;Все вышеупомянутые разделы данных не содержат никакой информации о дизайне и коде, поскольку данные полностью отделены от дизайна и представления. &lt;/p&gt;
&lt;p&gt;Для вывода данных используются «объекты обработки и вывода» или просто «&lt;strong&gt;объекты&lt;/strong&gt;» в терминологии Open Constructor. &lt;/p&gt;
&lt;p&gt;Каждый объект связывает данные определенного типа с &lt;strong&gt;шаблоном вывода&lt;/strong&gt;. Все шаблоны пишутся вручную, хотя для примера у каждого раздела есть «шаблон по умолчанию», который может быть использован как образец. В качестве шаблонизатора используется Smarty.&lt;/p&gt;
&lt;p&gt;Существуют и специализированные объекты, которые вместо вывода совершают определенные действия, например авторизацию, добавление комментария или отправку письма. &lt;/p&gt;
&lt;p&gt;Для всех типов данных есть объекты вывода документа, списка документов, листалки списка, для списков гибридных документов можно задавать методы сортировки и фильтрации. Если сортировка или фильтрация не достаточны, например, в случае, когда список документов — продукты в «корзине» пользователя и ID документов (выбранных товаров) хранится в сессии, есть объект «инъекция». Инъекцией можно передать список ID документов из сессии в объект перед тем, как данные будут выведены.&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;В CMS Open Constructor все страницы реально существуют&lt;/h3&gt;
&lt;p&gt;Open Constructor не использует распространенный подход CMS, когда одним index.php обрабатываются все страницы сайта.&lt;/p&gt;
&lt;p&gt;Все создаваемые страницы в карте сайта — реально существующие. Это дает и дополнительную гибкость для дизайна, который может меняться на разных страницах, и красивые, понятные и человеку, и поисковым системам URL.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/sitemap.gif"&gt;&lt;/p&gt;
&lt;p&gt;Каждая страница имеет свой шаблон, в шаблоне страницы задаются блоки, и для каждой страницы сайта можно указать, в каком блоке какой «объект обработки и вывода» будет находиться. Например, форма авторизации на главной странице может быть в левой колонке, на других страницах — в верхней строке или там, где этого захочет разработчик. &lt;/p&gt;
&lt;h3&gt;&lt;br&gt;Подсветка синтаксиса (HTML, PHP, XML, JavaScript), обнаружение ошибок компиляции шаблона&lt;/h3&gt;
&lt;p&gt;Для шаблонов в GUI предусмотрен редактор с подсветкой синтаксиса. &lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/applet_php.gif"&gt;&lt;/p&gt;
&lt;p&gt;При сохранении и компиляции шаблона редактор укажет на ошибки, если таковые будут обнаружены. Такая двухуровневая шаблонизация, где есть отдельно шаблон страницы и шаблоны объектов, позволяет при создании шаблона страницы не думать о каждом объекте в отдельности, так как у каждого объекта будет свой отдельный шаблон.&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.openconstructor.org/res/images/applet_smarty_error.gif"&gt;&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;CMS Open Constructor поддерживает кеширование блоков и кеширование страниц&lt;/h3&gt;
&lt;p&gt;Можно настроить как кеширование страницы целиком, так и кеширование отдельного объекта.&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;Возможность внедрять собственный PHP код&lt;/h3&gt;
&lt;p&gt;Хотя возможностей системы в большинстве случаев хватает, в то же время Open Constructor не ограничивает пользователя, и при необходимости можно использовать PHP код, для которого предусмотрен тип данных «PHP код», и соответствующий тип «объектов обработки и вывода». Объект PHP кода можно привязать как к блоку, если объект осуществляет вывод данных, так и к какому-либо событию, которое может произойти на странице, например аутентификации пользователя, загрузки объектов.&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;UTF-8, расширенный поиск, bread crumbs, Captcha, система пользователей&lt;/h3&gt;
&lt;p&gt;Использование UTF-8 позволяет создавать многоязычные сайты. &lt;/p&gt;
&lt;p&gt;Open Constructor имеет встроенную систему поиска по разделам сайта (система поиска имеет русский и английский стеммер), а для гибридных типов данных доступны также настраиваемые системы фильтрации и сортировки данных. &lt;/p&gt;
&lt;p&gt;Есть механизмы работы с «хлебными крошками» (bread crumbs). &lt;/p&gt;
&lt;p&gt;Для защиты от спама есть встроенный механизм CAPTCHA, причем &lt;a href="http://blog.esector.ru/blog/index.php/entry/.34/"&gt;&lt;u&gt;имеющий одну особенность&lt;/u&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Системой безопасности контролируются все ресурсы Open Constructor, у каждого из ресурсов есть пользователь — владелец ресурса и группа пользователей, что очень похоже на систему безопасности файловой системы операционных систем семейства Unix. Пользователь может входить в любое количество групп, что позволяет гибко настроить роли пользователей в управлении сайтом.&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;Ложка дегтя&lt;/h3&gt;
&lt;p&gt;Хотя для обработки простых форм, таких как отправка комментария, отправка письма или авторизация пользователя существуют готовые объекты, более сложные задачи, связанные с регистрацией пользователей или обработкой не предусмотренных системой данных, требуют от программиста, создающего код обработки, соответствующих знаний не только PHP, но и понимания того, как устроен Open Constructor изнутри, а также знакомства с API, которое пока не достаточно хорошо документировано.&lt;/p&gt;
&lt;p&gt;Кроме того, есть специфичные требования к хостингу, что может не подойти под стандартный план хостинга, в частности выключенный safe-mode, хотя хорошему хостинг-провайдеру эти требования выполнить будет не сложно.&lt;/p&gt;
&lt;p class=quote&gt;Если эта ложка дегтя не испортила вам вкуса всей бочки меда, приглашаем &lt;a href="http://www.openconstructor.org/"&gt;&lt;u&gt;попробовать Open Constructor&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;br&gt;Требования к Серверу:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;OS: Linux,Unix,Windows 2000/XP&lt;/li&gt;
&lt;li&gt;Apache: 1.3 и выше &lt;/li&gt;
&lt;li&gt;FTP*: любой. FTP сервер обязателен, поскольку Open Constructor публикует файлы через FTP. для Windows в качестве ftp сервера можно использовать бесплатный FileZilla Server. &lt;/li&gt;
&lt;li&gt;MySQL: 4.1.x &lt;/li&gt;
&lt;li&gt;PHP: 4.4.x установленный как модуль (а не как CGI) c mbstring, gd2, safe-mode должен быть выключен &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;* При установке сервера убедитесь в следующем:&lt;/p&gt;
&lt;div&gt;имеет ли FTP-пользователь право писать файлы в файловую систему правильно ли указан корень сайта относительно home папки ftp-юзера &lt;/div&gt;
&lt;h3&gt;&lt;br&gt;Требования к веб-клиенту:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Browser: IE 5.5 и выше &lt;/li&gt;
&lt;li&gt;JRE*: 1.4 и выше. JRE нужен для встроенного аплета редактора PHP и шаблонов Smarty с подсветкой синтаксиса, и многих других функций, таких как выравнивание кода (indent/outdent) &lt;/li&gt;&lt;/ul&gt;
&lt;h3&gt;&lt;br&gt;Установка CMS Open Constructor&lt;/h3&gt;
&lt;p&gt;Последняя версия Open Constructor и документация: &lt;a href="http://www.openconstructor.org/"&gt;&lt;u&gt;http://www.openconstructor.org/&lt;/u&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Скаченный дистрибутив распаковывается и папка «openconstructor» копируется в корень сайта.&lt;/p&gt;
&lt;p&gt;Для установки из Internet Explorer (другие браузеры не подходят) нужно открыть страницу /openconstructor сайта и следовать инструкциям.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;Ссылки по теме: &lt;a href="http://groups.google.com/group/openconstructor"&gt;&lt;u&gt;http://groups.google.com/group/openconstructor&lt;/u&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/Ityo3MTmo9I" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.imho/article/.11/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/Ityo3MTmo9I/</link>
			<category>IMHO</category>
			<pubDate>Tue, 3 Jul 2007 09:09:45 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.imho/article/.11/</feedburner:origLink></item>
		<item>
			<title>Несколько страниц 404</title>
			<description>&lt;p&gt;Покажу на примере сайта &lt;a href="http://www.mobitravel.ru/"&gt;http://www.mobitravel.ru&lt;/a&gt;, как можно создать несколько 404 страниц.&lt;/p&gt;
&lt;p&gt;Сайт Мобильных путешествий находится на &lt;a href="http://www.mobitravel.ru/"&gt;http://www.mobitravel.ru&lt;/a&gt;, cайт Avtors.ru находится на &lt;a href="http://www.mobitravel.ru/avtor"&gt;http://www.mobitravel.ru/avtor&lt;/a&gt; и у каждого из них своя 404 страница, т. е. /404/ и /avtor/404/.&lt;br&gt;&lt;br&gt;Open Constructor&amp;nbsp;по умолчанию использует страницу /404/ при 404-ой ошибке.&lt;br&gt;&lt;br&gt;Внутри,&amp;nbsp;Open Constructor разделяет 404 на два вида, и при использовании нескольких 404 страниц, нужно различать эти два вида ошибок:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;nbsp;страница не найдена, т. е. на сайте нет запрашиваемого файла или запрашиваемая страница не опубликована&lt;/li&gt;
&lt;li&gt;&amp;nbsp;искусственно сгенерированная 404 ошибка, т. е. при помощи $ctx-&amp;gt;throw404(). Обычно&amp;nbsp;используется, если запрашиваемый документ не найден или не опубликован.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;Они обрабатываются по-разному, в первом случае посылается заголовок HTTP/1.1 404 Not Found и инклудится файл /404/index.php. А во втором случае посылается ответ HTTP/1.1 302 Moved Temporarily на /404/?from=.&lt;br&gt;&lt;br&gt;И так создаем следующий PHP код:&lt;/p&gt;&lt;pre class=code&gt;&lt;p&gt;$subsite = '/avtor/';&lt;br&gt;$subsite404 = $subsite.'404/';&lt;br&gt;$href404 = null;&lt;/p&gt;
&lt;p&gt;if(strpos($_SERVER['REQUEST_URI'], $subsite) === 0) { // превый вид 404&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $href404 = $subsite404.'?from='.rawurlencode($_SERVER['REQUEST_URI']);&lt;br&gt;} elseif(isset($_GET['from']) &amp;amp;&amp;amp; strpos($_GET['from'], $subsite) === 0) { // второй вид 404&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $href404 = $subsite404.'?from='.rawurlencode($_GET['from']);&lt;br&gt;}&lt;/p&gt;
&lt;p&gt;if($href404) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sendRedirect('http://'.$_SERVER['HTTP_HOST'].$href404);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; die();&lt;br&gt;}&lt;?php&lt;br&gt;&lt;/p&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Создаем для этого кода объект «Обратный вызов» и ставим его на страницу /404/ в событие onInitialize&lt;br&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/8pQWEjr04TY" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.10/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/8pQWEjr04TY/</link>
			<category>How-to</category>
			<pubDate>Mon, 2 Jul 2007 16:53:04 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.10/</feedburner:origLink></item>
		<item>
			<title>Иньекции в список Гибридных данных</title>
			<description>&lt;p&gt;В сложных проектах возникают задачи, в которых стандартные возможности гибридных данных, такие как фильтрация или сортировка, не позволяют определить список выводимых документов. &lt;br&gt;&lt;br&gt;В качестве примера можно привести корзину электронного магазина, в которой записаны id выбранных товаров. &lt;br&gt;&lt;br&gt;Для того, чтобы вывести такой список гибридных документов (предположим, что он хранится в переменной $idlist в виде строки разделенных запятой id документов, напр. «1,3,7,86») в Open Constructor&amp;nbsp;используется прием, называемый «иньекция». &lt;br&gt;&lt;br&gt;Объект, который будет формировать контент, помещается в stub блок (объекты, находящиеся в stub блоках по умолчанию не выводятся и используются для «запуска вручную» из PHP кода или шаблона SMARTY), и нижеприведенным кодом иньектируем $idlist в объект.&lt;br&gt;&lt;br&gt;В дальнейшем можно «вывести» объект, т. е. добавить сгенерированный объектом HTML в генерируемую страницу или «не выводить», а присвоить переменной для последующего использования.&lt;br&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;Smarty&lt;/p&gt;&lt;pre class=code&gt;{*--- без вывода ---*}&lt;br&gt;{inject block='stub' field='ids' value=$idlist} &lt;br&gt;{assign_by_ref var=stub value=$ctx-&amp;gt;getObjectAt('stub')}&lt;br&gt;{set documents=$stub-&amp;gt;getDocuments()} &lt;br&gt;&amp;nbsp;&lt;br&gt;{*--- с выводом ---*}&lt;br&gt;{inject block='stub' field='ids' value=$idlist} &lt;br&gt;{run_block id='stub'}&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;&lt;br&gt;PHP&lt;/p&gt;&lt;pre class=code&gt;//--- без вывода ---&lt;br&gt;$obj = &amp;amp;$ctx-&amp;gt;getObjectAt('stub');&lt;br&gt;$ctx-&amp;gt;inject($obj, 'ids', $idlist); // $obj-&amp;gt;ids = $idlist;&lt;br&gt;$docs=$obj-&amp;gt;getDocuments();&lt;br&gt;&amp;nbsp;&lt;br&gt;//--- вывод ---&lt;br&gt;$obj = &amp;amp;$ctx-&amp;gt;getObjectAt('stub');&lt;br&gt;$ctx-&amp;gt;inject($obj, 'ids', $idlist);&lt;br&gt;$obj-&amp;gt;exec($ctx-&amp;gt;_smarty);&lt;/pre&gt;
&lt;p&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/nTFEEG_3GGw" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.9/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/nTFEEG_3GGw/</link>
			<category>How-to</category>
			<pubDate>Mon, 2 Jul 2007 16:48:22 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.9/</feedburner:origLink></item>
		<item>
			<title>Использование CAPTCHA в формах</title>
			<description>&lt;p&gt;Чтобы использовать Captcha, нужно:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;В форму вставить картинку, которую пользователь должен распознать, и текстовое поле, куда он введет распознанный текст&lt;/li&gt;
&lt;li&gt;В обработчике формы проверить введенное пользователем значение&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Например, нужно создать форму для посылки письма. Допустим форма находится на странице /form/, а обработчик на странице /form/sendmail/.&lt;br&gt;&lt;br&gt;В шаблоне формы пишем:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=code&gt;&lt;pre&gt;&amp;nbsp;&lt;br&gt;{* Запрашиваем новый одноразовый "билет" Captcha и записываем его в переменную "cid" *}&lt;br&gt;{set cid=$ctx-&amp;gt;newCaptchaId()}&lt;br&gt;&amp;nbsp;&lt;br&gt;{* Передаем идентификатор билета в обрабочик через QUERY_STRING *}&lt;br&gt;&amp;lt;form action="/form/sendmail/?&lt;strong&gt;ticket_id={$cid}&lt;/strong&gt;" method="POST"&amp;gt;&lt;br&gt;	&amp;lt;!-- Здесь вводятся данные для посылки письма --&amp;gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;	&amp;lt;div&amp;gt;&lt;br&gt;		Рапознайте текст &amp;lt;img src="/res/captcha/&lt;strong&gt;{$cid}.png&lt;/strong&gt;"&amp;gt; :&lt;br&gt;		&amp;lt;input type="text" name="ticket_text"&amp;gt;&lt;br&gt;	&amp;lt;/div&amp;gt;&lt;br&gt;&amp;lt;/form&amp;gt;&lt;br&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;br&gt;&lt;br&gt;Если для отправки письма в обработчике формы используется стандарный объект Open Constructor «Отправка писем», то в свойствах этого объекта в секции Captcha задаем:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Идентификатор ключа &lt;strong&gt;ticket_id&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Ключ &lt;strong&gt;ticket_text&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;отчекиваем «Закрывать пустую сессию»&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Если обработчик отправки письма написан вручную разработчиком, то можно следующим php кодом проверить Captcha:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=code&gt;&lt;pre&gt;&amp;nbsp;&lt;br&gt;// до этого должен быть вызван session_start();&lt;br&gt;$ticket_id = (string) @$_GET['ticket_id'];&lt;br&gt;$ticket_text = strtolower((string) @$_POST['ticket_text']);&lt;br&gt;$ticket_expected = (string) @$_SESSION['_cid'][$ticket_id];&lt;br&gt;&amp;nbsp;&lt;br&gt;// проверяем валидность&lt;br&gt;$isCorrect = $ticket_text &amp;amp;&amp;amp; $ticket_expected &amp;amp;&amp;amp; ($ticket_text == $ticket_expected);&lt;br&gt;&amp;nbsp;&lt;br&gt;// удаляем билет из сессии&lt;br&gt;if($ticket_expected) {&lt;br&gt;&amp;nbsp;unset($_SESSION['_cid'][$ticket_id]);&lt;br&gt;&amp;nbsp;if(!sizeof((array) @$_SESSION['_cid']))&lt;br&gt;&amp;nbsp;&amp;nbsp;unset($_SESSION['_cid']);&lt;br&gt;}&lt;br&gt;&amp;nbsp;&lt;br&gt;if($isCorrect) {&lt;br&gt;&amp;nbsp;// оправляем письмо&lt;br&gt;} else {&lt;br&gt;&amp;nbsp;// сообщаем пользователю что он разпознал текст неверно&lt;br&gt;}&lt;br&gt;&amp;nbsp;&lt;br&gt;// закрываем пустую сессию&lt;br&gt;if(isset($_SESSION) &amp;amp;&amp;amp; !sizeof($_SESSION)) {&lt;br&gt;&amp;nbsp;@session_unset();&lt;br&gt;&amp;nbsp;@session_destroy();&lt;br&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;br&gt;&lt;br&gt;Если пользователю нужно предоставить возможность выбрать картинку для распознания, то для вставки картинки в шаблон нужно:&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class=code&gt;&lt;pre&gt;&amp;nbsp;&lt;br&gt;&amp;lt;!-- если пользователь кликнет картинку, она заменится на новую--&amp;gt;&lt;br&gt;&amp;lt;img src="/res/captcha/{$cid}.png" &lt;br&gt;&lt;strong&gt;    onclick="this.src = '/res/captcha/{$cid}.png?' + (new Date()).getTime();"&lt;/strong&gt; /&amp;gt;&lt;br&gt;&amp;nbsp;&lt;/pre&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/AdS0jdgQAPw" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.8/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/AdS0jdgQAPw/</link>
			<category>How-to</category>
			<pubDate>Mon, 2 Jul 2007 16:45:23 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.8/</feedburner:origLink></item>
		<item>
			<title>Вывод рейтинга за указанный промежуток времени</title>
			<description>&lt;p&gt;Объекты вывода гибридных документов, позволяют работать с рейтингом документов за определенный период времени.&lt;br&gt;&lt;br&gt;Чтобы объект вычислял рейтинг документов только за прошлый месяц, в свойствах объекта нужно задать вот такой&amp;nbsp;период: &lt;/p&gt;
&lt;p class=code&gt;# %Y-%m-01 -1 month :: # %Y-%m-01&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;«# %Y-%m-01» означает «первый день текущего месяца»&lt;/p&gt;
&lt;p&gt;«-1 month» означает «месяц назад от указанного времени»&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Подробный синтаксис:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;При настройке гибридных объектов можно сделать так, чтобы они запрашивали рейтинг на определенный интервал времени. Для этого используется поле «Период оценок». Если ничего не указать, то подразумевается общий рейтинг.&lt;br&gt;&lt;br&gt;Период оценок имеет следующий формат:&lt;/p&gt;
&lt;p&gt;&amp;lt;начало периода&amp;gt;[:: {&amp;lt;продолжительность&amp;gt; | &amp;lt;конец периода&amp;gt;}]&lt;br&gt;&lt;br&gt;&lt;strong&gt;Начало периода&lt;/strong&gt; может быть задано тремя способами:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;число&amp;gt; — значит секунды. Если положительное, то считается как UNIX_TIMESTAMP, если отрицательное, то началом периода считается time() + &amp;lt;это число&amp;gt;&lt;/li&gt;
&lt;li&gt;{$&amp;lt;имя ctx параметра&amp;gt;} — для получения начала периода запрашивается $ctx-&amp;gt;getParam('&amp;lt;имя ctx параметра&amp;gt;'); Полученное значение трактуется как секунды в первом пункте, т. е. значение может быть положительным и отрицательным числом&lt;/li&gt;
&lt;li&gt;# &amp;lt;дата&amp;gt; — таким образом можно задать начало периода в формате который понимает strtotime();&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Продолжительность&lt;/strong&gt; может быть задана двумя способами:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&amp;lt;число&amp;gt; — значит секунды. Если чило положительное, то оно значит продолжительность в секундах. Если отрицательное, то для вычисления конца периода, система вычисляет time() + &amp;lt;это число&amp;gt;&lt;/li&gt;
&lt;li&gt;{$&amp;lt;имя ctx параметра&amp;gt;} — система запрашивает продолжительность у $ctx; Дальше полученное значение трактуется как секунды в первом пункте, т. е. значение может быть положительным и отрицательным числом.&lt;/li&gt;&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Конец периода&lt;/strong&gt; задается следующим образом:&lt;/p&gt;
&lt;p&gt;# &amp;lt;дата&amp;gt; — там образом можно передать дату конца периода в формате который понимает strtotime()&lt;br&gt;&lt;br&gt;&lt;strong&gt;Примеры:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;-86400 — рейтинг на последний день&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;-172800 :: -86400 — рейтинг на позавчерашний день&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;-172800 :: 86400 — рейтинг на позавчерашний день&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;# last month — рейтинг за последний месяц&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;# last month :: # now — рейтинг за последний месяц&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;{$begin} :: {$end} — рейтинг от $ctx-&amp;gt;getParam('begin') до $ctx-&amp;gt;getParam('end')&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;# 2006-02-01 :: # 2006-03-01 00:00:00 — рейтинг за февраль 2006&amp;nbsp;года&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/yBUQI0acXT0" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.7/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/yBUQI0acXT0/</link>
			<category>How-to</category>
			<pubDate>Mon, 2 Jul 2007 16:38:17 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.7/</feedburner:origLink></item>
		<item>
			<title>Фильтрация HTML тегов и атрибутов</title>
			<description>Open Constructor предоставляет возможность фильтровать HTML, вводимый пользователем при создании и редактировании документов. Для этого нужно настроить фильтрацию HTML в свойствах раздела (или гибридного поля).&lt;br&gt;&lt;br&gt;Вот примеры настройки фильтрации: 
&lt;ul&gt;
&lt;li&gt;разрешить теги p, br, b и очистить все их аттрибуты:&lt;br&gt;&lt;br&gt;
&lt;div class=code&gt;&amp;lt;p&amp;gt;&amp;lt;br&amp;gt;&amp;lt;b&amp;gt;&lt;/div&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;разрешить теги p, br и очистить все их аттрибуты кроме атрибута align тега p:&lt;br&gt;&lt;br&gt;
&lt;div class=code&gt;&amp;lt;p align&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;разрешить теги p, br, b. Разрешить аттрибут align для p и аттрибуты id, class &lt;b&gt;для всех разрешенных тегов &lt;/b&gt;(т. е. для p, br и b ):&lt;br&gt;&lt;br&gt;
&lt;div class=code&gt;&amp;lt;p align&amp;gt;&amp;lt;br&amp;gt;&amp;lt;b&amp;gt;&amp;lt;** id,class&amp;gt;&lt;/div&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;разрешить все теги, очистить все их аттрибуты:&lt;br&gt;&lt;br&gt;
&lt;div class=code&gt;&amp;lt;*&amp;gt;&lt;/div&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;разрешить все теги и все их аттрибуты(тоже что и &amp;lt;*&amp;gt;&amp;lt;** *&amp;gt;):&lt;br&gt;&lt;br&gt;
&lt;div class=code&gt;&amp;lt;* *&amp;gt;&lt;/div&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;разрешить все теги и все их аттрибуты кроме style, class, align, width, height:&lt;br&gt;&lt;br&gt;
&lt;div class=code&gt;&amp;lt;* *!style,class,align,width,height&amp;gt;&lt;/div&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;разрешить тег a и все его аттрибуты кроме target и style; тег img и его атрибуты src, alt, id, class; тег p и его аттрибуты align, id, class; теги b и i и их аттрибуты id, class:&lt;br&gt;&lt;br&gt;
&lt;div class=code&gt;&amp;lt;a *!target&amp;gt;&amp;lt;img src,alt&amp;gt;&amp;lt;p align&amp;gt;&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;&amp;lt;** id,class&amp;gt;&amp;lt;** !style&amp;gt;&lt;/div&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;разрешить теги b и i и все их аттрибуты кроме style и разрешает тег a и все его аттрибуты:&lt;br&gt;&lt;br&gt;
&lt;div class=code&gt;&amp;lt;b&amp;gt;&amp;lt;i&amp;gt;&amp;lt;a&amp;gt;&amp;lt;** *!style&amp;gt;&amp;lt;a style&amp;gt;&lt;/div&gt;&lt;br&gt;&lt;/li&gt;
&lt;li&gt;разрешает все теги и все их аттрибуты(так как у второго правила больше приоритет):&lt;br&gt;&lt;br&gt;
&lt;div class=code&gt;&amp;lt;* !*&amp;gt;&amp;lt;** *&amp;gt;&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;br&gt;Кроме этого Open Constructor при очистке закрывает все незакрытые парные теги c проверкой вложенности inline и блочных тегов.&lt;/p&gt;
&lt;p&gt;То есть&lt;br&gt;&lt;/p&gt;
&lt;div class=code&gt;&amp;lt;div&amp;gt;Text &amp;lt;b&amp;gt;text &amp;lt;i&amp;gt; text &amp;lt;div&amp;gt; text &amp;lt;img src="something.gif"&amp;gt;&amp;lt;/img&amp;gt;&lt;/div&gt;&lt;br&gt;переобразуется в&lt;br&gt;&lt;br&gt;
&lt;div class=code&gt;&amp;lt;div&amp;gt;Text &amp;lt;b&amp;gt;text &amp;lt;i&amp;gt; text &amp;lt;/i&amp;gt;&amp;lt;/b&amp;gt;&amp;lt;div&amp;gt; text &amp;lt;img src="something.gif"&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/openconstructor/~4/1QoJVJgwuYE" height="1" width="1"/&gt;</description>
			<guid isPermaLink="false">http://www.openconstructor.org/blog/index.php/.category.how-to/article/.6/</guid>
			<link>http://feedproxy.google.com/~r/openconstructor/~3/1QoJVJgwuYE/</link>
			<category>How-to</category>
			<pubDate>Mon, 2 Jul 2007 15:49:30 GMT</pubDate>
		<feedburner:origLink>http://www.openconstructor.org/blog/index.php/.category.how-to/article/.6/</feedburner:origLink></item></channel>
</rss><!-- - - - - - - - - - - - - - - Page generation report - - - - - - - - - - - - - - 

Initializing..................................................  4.1%  [ 0.011 sec ]
Loading sitemap...............................................  0.8%  [ 0.002 sec ]
Creating Smarty instance......................................  4.0%  [ 0.011 sec ]
Loading objects...............................................  5.7%  [ 0.015 sec ]
Registering objects...........................................  0.2%  [ 0.001 sec ]
Building crumbs...............................................  0.0%  [ 0.000 sec ]
- D/RSS [hybridhl]............................................ 30.4%  [ 0.079 sec ]
Fetching content.............................................. 31.3%  [ 0.082 sec ]
Sending output [ 155,321 bytes, buffer = 12,000 bytes ]....... 53.8%  [ 0.140 sec ]
Date: Fri, 30 Jul 2010 21:05:16 GMT
SQL queries used: 7
Speed:   3.8 pps  [ 0.261 sec ]

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -  -->
