<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-24732753522340294</id><updated>2011-11-23T15:50:52.873+04:00</updated><category term='mgrValidated'/><category term='htmlentities'/><category term='mysql'/><category term='xls'/><category term='шаблон'/><category term='фильтр'/><category term='счетчик посещений'/><category term='manager'/><category term='wtf'/><category term='join'/><category term='createdon'/><category term='ispmanager'/><category term='setTemplateVar'/><category term='кросспостинг'/><category term='extender'/><category term='теги'/><category term='infinitiv.org.ua'/><category term='setlocale'/><category term='PHP-ExcelReader'/><category term='fckeditor'/><category term='Page Hit Counter'/><category term='strtotime'/><category term='dateFilter'/><category term='phx'/><category term='GET'/><category term='mediatemple'/><category term='resource browser'/><category term='дата'/><category term='custom filter'/><category term='mcpuck'/><category term='Ditto'/><category term='фронт-энд редактор'/><category term='cp1251'/><category term='$_SESSION'/><category term='vps'/><category term='Inherit Parent Template'/><category term='DittoCal'/><title type='text'>Записки конструктора (архив)</title><subtitle type='html'>дневник Максима Коринца (yentsun), разработчика MODx (блог на данный момент не поддерживается)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>18</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-3546461634531603469</id><published>2008-07-28T14:24:00.000+04:00</published><updated>2008-07-28T14:37:45.039+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='фронт-энд редактор'/><category scheme='http://www.blogger.com/atom/ns#' term='mgrValidated'/><category scheme='http://www.blogger.com/atom/ns#' term='$_SESSION'/><title type='text'>Легко и просто определить, авторизован менеджер или нет</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Задача:&lt;/span&gt; Находясь на фронт-энде (страницах сайта), нам нужно определить, авторизован ли менеджер или нет и, например, вывести на страницу какой-либо элемент только для менеджера. Я использую это в собственном блоке редактирования сайта с фронт-энда.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Решение:&lt;/span&gt; Используем переменную сессии MODx &lt;span style="font-style:italic;"&gt;mgrValidated&lt;/span&gt;. Она равна 1, если менеджер сайта авторизован. &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Например:&lt;/span&gt;&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;return $_SESSION['mgrValidated']==1 ? $modx-&amp;gt;getChunk('chunk-for-manager-only') : '';&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-3546461634531603469?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/3546461634531603469/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=3546461634531603469' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/3546461634531603469'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/3546461634531603469'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2008/07/blog-post.html' title='Легко и просто определить, авторизован менеджер или нет'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-4023400546290694008</id><published>2008-05-28T11:35:00.000+04:00</published><updated>2008-05-28T12:08:26.794+04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='manager'/><category scheme='http://www.blogger.com/atom/ns#' term='vps'/><category scheme='http://www.blogger.com/atom/ns#' term='ispmanager'/><title type='text'>замена папки "manager" для администраторской панели ISPmanager (VPS)</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Проблема:&lt;/span&gt; вы покупаете VPS-сервер, скажем на расчудесной Агаве, и вам в качестве системы управления этим сервером предлагается (в моем случае выбора не было) ISPmanager. Так вот адрес административной панели ISPmanager, как правило, выглядит следующим образом: http://имя_домена/manager. Как же нам установить MODx? Поддержка Агавы, заявила, что изменить этот адрес нельзя, но можно поиграть с mod_rewrite... Итак. Допустим что у нас нет времени на игры с mod_rewrite и нет желания менять папку manager в самой установке MODx.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Решение: &lt;/span&gt;Меняем папку для ISPmanager. "manager" как адрес админ-панели ISPmanager для сервера всего лишь псевдоним (alias), физически этой папки не существует. Как известно, псевдонимы прописываются в файле конфигурации Apache. Открываем файл конфигурации (ISPmanager-&gt;Инструменты-&gt;Менеджер файлов... путь: /etc/httpd/conf/httpd.conf, конечно же, это мой частный случай), ищем строку "manager". Мне не удалось найти ее, и я было отчаялся, однако вспомним, что в файл конфигурации можно включать внешние блоки директивой Include. Ищем слово "include". На этот раз успешно: найдена интересная строка &lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;Include /usr/local/ispmgr/etc/ispmgr.inc&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Открываем файл ispmgr.inc и находим строку &lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;Alias /manager /usr/local/ispmgr/bin/&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; Меняем &lt;span style="font-style:italic;"&gt;/manager&lt;/span&gt; на, скажем, &lt;span style="font-style:italic;"&gt;/ispmanager&lt;/span&gt; и перезапускаем сервер. &lt;br /&gt;&lt;br /&gt;И вот! Админ-панель ISPmanager находится по адресу &lt;span style="font-style:italic;"&gt;http://имя_домена/ispmanager&lt;/span&gt;, а мы  спокойно можем приступать к установке MODx.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-4023400546290694008?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/4023400546290694008/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=4023400546290694008' title='Комментарии: 14'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/4023400546290694008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/4023400546290694008'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2008/05/manager-ispmanager-vps.html' title='замена папки &quot;manager&quot; для администраторской панели ISPmanager (VPS)'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-6040637626077313118</id><published>2008-03-20T14:14:00.000+03:00</published><updated>2008-03-20T15:23:02.373+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='infinitiv.org.ua'/><category scheme='http://www.blogger.com/atom/ns#' term='wtf'/><title type='text'>вопрос этикета</title><content type='html'>сегодня случайно наткнулся на любопытный ресурс &lt;a href="http://infinitiv.org.ua/"&gt;infinitiv.org.ua&lt;/a&gt;. Это недоделанная копия моего текущего проекта. Домен infinitiv.org.ua зарегистрирован на Максима Рогальского, ранее принимавшего участие в жизни modx.ru.&lt;br /&gt;&lt;br /&gt;Уважаемый Максим... какого черта происходит?&lt;br /&gt;&lt;br /&gt;UPD:&lt;br /&gt;а вот еще сайты...&lt;br /&gt;http://intway.zp.ua/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-6040637626077313118?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/6040637626077313118/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=6040637626077313118' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/6040637626077313118'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/6040637626077313118'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2008/03/blog-post_20.html' title='вопрос этикета'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-3243817474533111806</id><published>2008-03-18T12:01:00.000+03:00</published><updated>2008-03-18T12:53:05.108+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='custom filter'/><category scheme='http://www.blogger.com/atom/ns#' term='Ditto'/><category scheme='http://www.blogger.com/atom/ns#' term='кросспостинг'/><category scheme='http://www.blogger.com/atom/ns#' term='фильтр'/><title type='text'>"Гибридный" вывод новостей (дочерние документы+категории)</title><content type='html'>Мы привыкли делать вывод новостей, статей, каталога продукции и тд., находящихся в определенной папке.  То есть, имеем мы категории новостей (например: Новости шоу-бизнеса, Интервью, Мнения ...), они же у нас родительские документы к самим этим новостям. Есть и другие способы вывода, может быть из других родительских документов, из множества родительских документов, но суть одна - мы всегда выводим статьи из каких-либо папок. А что если какие-то документы, находясь в одной папке, должны выводиться и в других категориях (папках)? Не дублировать же их всюду?&lt;br /&gt;&lt;br /&gt;Недавно столкнувшись с такой вот задачей "кросспостинга", я придумал следующее решение. &lt;span style="font-style:italic;"&gt;Сразу замечу, можно легко решить проблему "свалив" все документы в одну папку и настроить категории только с помощью TV. Ditto при этом настроить элементарно. Однако в мою задачу входит сохранение уже существующей структуры папок и документов в них&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Для начала нужно определиться - документ в БД должен существовать в единственном экземпляре, никаких дублей! Задать категории, в которых он должен отобразиться помимо своей родительской мы можем с помощью TV (например типа список checkbox). Единственной проблемой теперь встает настройка вывода Ditto, который должен вывести все документы из родительского документа а также проверить принадлежность к заданной категории документов из других папок. На ум сразу же пришло использование параметра &lt;span style="font-weight:bold;"&gt;&amp;filter&lt;/span&gt;, который может "отсеять" документы не принадлежащие к заданной папке И (именно логическое AND) не содержащие в определенном TV "упоминаний" о текущей категории. Однако есть досадная деталь: множество фильтров Ditto (например &amp;filter=`test1,34,2|test2,78,1` поддерживают лишь логическое ИЛИ). Единственным выходом оказалось изучение и написание собственного (custom) фильтра. Сделать это можно на основе примерного фильтра в файле &lt;span style="font-weight:bold;"&gt;example.extender.inc.php&lt;/span&gt;. И подключить его параметром &lt;span style="font-weight:bold;"&gt;&amp;extenders&lt;/span&gt;. не буду вдаваться в подробности кода, там достаточно все элементрано:&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;// ---------------------------------------------------&lt;br /&gt;// Group: Filters&lt;br /&gt;// Define custom or basic filters within the extender to expand Ditto's filtering capabilities&lt;br /&gt;// ---------------------------------------------------&lt;br /&gt;&lt;br /&gt;$filters[&amp;quot;custom&amp;quot;][&amp;quot;exampleFilter&amp;quot;] = array(&amp;quot;parent,artist_category&amp;quot;,&amp;quot;exampleFilter&amp;quot;); &lt;br /&gt;  // Variable: $filters[&amp;quot;custom&amp;quot;][&amp;quot;exampleFilter&amp;quot;]&lt;br /&gt;  // Add the filter exampleFilter to the custom filters &lt;br /&gt;  // list with the source pagetitle and the callback&lt;br /&gt;  // exampleFilter&lt;br /&gt;if (!function_exists(&amp;quot;exampleFilter&amp;quot;)) {&lt;br /&gt;  // wrap functions in !function_exists statements to ensure that they are not defined twice&lt;br /&gt;  &lt;br /&gt;  // ---------------------------------------------------&lt;br /&gt;  // Function: exampleFilter&lt;br /&gt;  // &lt;br /&gt;  // Takes the resource array for an individual document&lt;br /&gt;  // and asks for the return of a 0 or 1 with 0 removing &lt;br /&gt;  // the document and 1 leaving it in the result set. &lt;br /&gt;  // In this case, if the lower case value of the pagetitle&lt;br /&gt;  // is foo, it is removed while all other documents are shown&lt;br /&gt;  // ---------------------------------------------------&lt;br /&gt;  function exampleFilter($resource) {&lt;br /&gt;  global $modx;&lt;br /&gt;  $id = $modx-&amp;gt;documentObject['id'];&lt;br /&gt;    if (!stristr($resource['artist_category'], $id) &amp;amp;&amp;amp; $resource['parent'] != $id) {&lt;br /&gt;      return 0;&lt;br /&gt;    } else {&lt;br /&gt;      return 1;&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;(если не менять название этого файла, то в вызове Ditto теперь достаточно прописать &amp;extenders=`example`)&lt;br /&gt;&lt;br /&gt;Напомню, этот фильтр проверяет &lt;span style="font-style:italic;"&gt;отсутствие&lt;/span&gt; упоминания id категории в дополнительном параметре artist_category и &lt;span style="font-style:italic;"&gt;неравенство&lt;/span&gt; родителя этому же id категории, если оба условия верны - документ отфильтровывается. В противном случае документ выводится на страницу. Таким образом, расставив галочки в нашем TV artist_category, мы можем "подцепить" документы из других папок к выводу документов заданной папки :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-3243817474533111806?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/3243817474533111806/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=3243817474533111806' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/3243817474533111806'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/3243817474533111806'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2008/03/blog-post_18.html' title='&quot;Гибридный&quot; вывод новостей (дочерние документы+категории)'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-2965891991320342499</id><published>2008-03-13T14:54:00.000+03:00</published><updated>2008-03-13T15:37:00.650+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='join'/><title type='text'>проверка на наличие привязаных документов</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Дано:&lt;/span&gt; архив артистов, архив новостей и фоторепортажей, привязанных к артистам по идентификатору. Идентификатор артиста записан в соответствующем TV новостной статьи&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Задача:&lt;/span&gt; выполнить проверку, существуют ли по данному артисту новости (хотябы одна) и вывести соответствующую кнопку на странице артиста и в каталоге артистов (шаблон Ditto)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Решение:&lt;/span&gt; нам всего-то нужно - проверить, есть ли в таблице modx_site_tmplvar_contentvalues запись со значением поля value равным идентификатору артиста и принадлежит ли соответствующий документ к категории новостей. Как известно, значения TV хранятся в БД MODx в одной таблице (modx_site_tmplvar_contentvalues), содержимое документов в другой (modx_site_content), а получить значение parent (для проверки принадлежности документа к новостям) мы можем только из таблицы содержимого. Поэтому здесь, для получения и проверки результата мы должны получить "объединенную" выдачу двух таблиц из базы. Для этого запросе к БД используем JOIN:&lt;br /&gt; &lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;SELECT contentid, parent FROM modx_site_tmplvar_contentvalues JOIN modx_site_content ON modx_site_tmplvar_contentvalues.contentid = modx_site_content.id WHERE value = &amp;quot;.$output.&amp;quot; AND tmplvarid = 5 AND parent IN ('4789','4794','4792')  LIMIT 1&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Замечу, что IN проверяет на равенство одному из перечисленных в скобках значений (в моем проекте имеется три категории новостей) а  tmplvarid = 5 гарантирует, что проверка производится только в нужном нам TV (привязка к артисту).&lt;br /&gt;&lt;br /&gt;Привожу пример работающего phx-сниппета:&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;$query = &amp;quot;SELECT contentid, parent, pagetitle FROM modx_site_tmplvar_contentvalues JOIN modx_site_content ON modx_site_tmplvar_contentvalues.contentid = modx_site_content.id WHERE value = &amp;quot;.$output.&amp;quot; AND tmplvarid = 5 AND parent IN ('4789','4794','4792')  LIMIT 1&amp;quot;;&lt;br /&gt;$result = $modx-&amp;gt;db-&amp;gt;query($query);&lt;br /&gt;$row = mysql_fetch_array($result);&lt;br /&gt;$id = $row['contentid'];&lt;br /&gt;return $id ? '&amp;lt;a class=&amp;quot;news&amp;quot; title=&amp;quot;&amp;#1053;&amp;#1086;&amp;#1074;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1080;&amp;quot; href=&amp;quot;[~4817~]?tags=[+pagetitle:name:common_name:url+]&amp;quot;&amp;gt;&amp;#1053;&amp;#1086;&amp;#1074;&amp;#1086;&amp;#1089;&amp;#1090;&amp;#1080;&amp;lt;/a&amp;gt;' : '';&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;я назвал сниппет 'news'. Теперь при вызове [+id:news+] (для шаблона Ditto) и при наличии привязанных новостей к артисту я получаю кнопку/ссылку на новости о нем. Примечание: в моем случае ссылка ведет на выдачу новостей по тегам а не по привязанным статьям - это специфика текущей ситуации и в дальнейшем будет исправлена :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-2965891991320342499?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/2965891991320342499/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=2965891991320342499' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/2965891991320342499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/2965891991320342499'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2008/03/blog-post.html' title='проверка на наличие привязаных документов'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-2127696628892449320</id><published>2008-02-05T12:42:00.000+03:00</published><updated>2008-02-05T13:30:46.603+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='счетчик посещений'/><category scheme='http://www.blogger.com/atom/ns#' term='Ditto'/><category scheme='http://www.blogger.com/atom/ns#' term='Page Hit Counter'/><category scheme='http://www.blogger.com/atom/ns#' term='setTemplateVar'/><title type='text'>счетчик посещений страницы и настройка рейтинга страниц по нему</title><content type='html'>&lt;span style="font-weight:bold;"&gt;Задача:&lt;/span&gt; Необходимо считать количество посещений страниц (пока без учета "уникальности" просмотра, то есть грубо говоря посетитель может "накручивать" просмотры, просто перезагружая страницу) и выстроить рейтинг страниц с учетом их посещений.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Решение: &lt;/span&gt; Начнем с того, что нам известно - вывод какого либо рейтинга страниц в MODx в штатном порядке осуществляется с помошью Ditto. Ditto, как нам известно, может сортировать вывод по любому полю документа а также по доп. параметру (TV). Единственный выход - получать количество просмотров в TV и потом сортировать по нему.&lt;br /&gt;&lt;br /&gt;В репозитарии modxcms.com лежит плагин &lt;a href="http://modxcms.com/Page-Hit-Counter-878.html"&gt;Page Hit Counter&lt;/a&gt; от sottwell, который проверяет просматривает ли страницу менеджер, и не снята ли галочка "Регистрировать посещения" и записывает посещение в свою таблицу БД MODx. Также я вспомнил что в сниппете &lt;a href="http://modxcms.com/CSS-Star-Rating-547.html"&gt;CSS Star Rating&lt;/a&gt; есть замечательная функция setTemplateVar, которая, как вы наверное догадались, записывает значение в TV. &lt;br /&gt;&lt;br /&gt;Создаем TV типа "текст" (у меня он называется "count") и делаем гибрид плагина, который вместо записи количества посещений в БД, записывает его в наш TV (не забудьте поставить проверку на системное событие OnWebPagePrerender):&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;if (!function_exists('setTemplateVar')) {&lt;br /&gt;  function setTemplateVar($value, $docID, $tplVarName) {&lt;br /&gt;    global $modx;&lt;br /&gt;&lt;br /&gt;    //-- get tmplvar id&lt;br /&gt;    $tplName = $modx-&amp;gt;getFullTableName('site_tmplvars');&lt;br /&gt;    $tplRS = $modx-&amp;gt;db-&amp;gt;select('id', $tplName, 'name=&amp;quot;' . $tplVarName . '&amp;quot;');&lt;br /&gt;    $tplRow = $modx-&amp;gt;db-&amp;gt;getRow($tplRS);&lt;br /&gt;&lt;br /&gt;    $tblName = $modx-&amp;gt;getFullTableName('site_tmplvar_contentvalues');&lt;br /&gt;&lt;br /&gt;    $selectQuery = $modx-&amp;gt;db-&amp;gt;select('*', $tblName, 'contentid=' . $docID . ' AND tmplvarid=' . $tplRow['id']);&lt;br /&gt;&lt;br /&gt;    $updFields = array (&lt;br /&gt;      'value' =&amp;gt; $value&lt;br /&gt;    );&lt;br /&gt;    $insFields = array (&lt;br /&gt;      'tmplvarid' =&amp;gt; $tplRow['id'],&lt;br /&gt;      'contentid' =&amp;gt; $docID,&lt;br /&gt;      'value' =&amp;gt; $value&lt;br /&gt;    );&lt;br /&gt;&lt;br /&gt;    if ($modx-&amp;gt;db-&amp;gt;getRecordCount($selectQuery) &amp;lt; 1) {&lt;br /&gt;      $modx-&amp;gt;db-&amp;gt;insert($insFields, $tblName);&lt;br /&gt;    } else {&lt;br /&gt;      $modx-&amp;gt;db-&amp;gt;update($updFields, $tblName, 'contentid=' . $docID . ' AND tmplvarid=' . $tplRow['id']);&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if(!isset($_SESSION['usertype'])) { $_SESSION['usertype'] = ''; }&lt;br /&gt;&lt;br /&gt;if($modx-&amp;gt;documentObject['donthit'] != 1 &amp;amp;&amp;amp; $_SESSION['usertype'] != 'manager') {&lt;br /&gt;  $current = $modx-&amp;gt;getTemplateVarOutput('count',$modx-&amp;gt;documentIdentifier);&lt;br /&gt;  $current = $current['count']+1;&lt;br /&gt;  @ setTemplateVar(&amp;quot;$current&amp;quot;, $modx-&amp;gt;documentIdentifier, 'count');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;return;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Теперь у нас есть TV с посещениями. Как настроить вывод Ditto по нему - выходит за рамки этой статьи :) Также, если вам нужно выводить количество посещений на самой странице, которая кэшируется, придется написать небольшой сниппет и вызывать его некешируемым.&lt;br /&gt;&lt;br /&gt;PS. Был бы признателен за дополнение этого плагина, которое бы исключало "накрутку" посещений. Возможно с применением cookie или с сессиями :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-2127696628892449320?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/2127696628892449320/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=2127696628892449320' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/2127696628892449320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/2127696628892449320'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2008/02/blog-post.html' title='счетчик посещений страницы и настройка рейтинга страниц по нему'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-6346087520026972986</id><published>2008-02-01T14:01:00.000+03:00</published><updated>2008-02-01T14:37:22.029+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='теги'/><title type='text'>теговое облако для 4000 документов</title><content type='html'>Попробовав применить сниппет &lt;a href="http://modxcms.com/TvTagCloud-734.html"&gt;TvTagCloud&lt;/a&gt; к своей огромной базе документов, получил превышение ожидания запроса (или что то в этом духе). Мне необходимо было выводить определенное количество тегов из недавно созданных документов плюс минимизировать использование ресурсов базы/процессора. Пришлось погуглить и дописать свой код. &lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;// connect to database&lt;br /&gt;&lt;br /&gt;    $tb1 = $modx-&amp;gt;getFullTableName(&amp;quot;site_tmplvar_contentvalues&amp;quot;);&lt;br /&gt;    $query = &amp;quot;SELECT value&amp;quot;;&lt;br /&gt;    $query .= &amp;quot; FROM &amp;quot;.$tb1;&lt;br /&gt;    $query .= &amp;quot; WHERE tmplvarid=6&amp;quot;;&lt;br /&gt;    $query .= &amp;quot; GROUP BY value&amp;quot;;&lt;br /&gt;    $query .= &amp;quot; ORDER BY id DESC&amp;quot;;&lt;br /&gt;    $query .= &amp;quot; LIMIT 100;&amp;quot;;&lt;br /&gt;    $result = $modx-&amp;gt;db-&amp;gt;query($query);&lt;br /&gt;&lt;br /&gt;// here we loop through the results and put them into a simple array:&lt;br /&gt;&lt;br /&gt;while ($row = mysql_fetch_array($result)) {&lt;br /&gt;    $tags = explode(', ',$row['value']);&lt;br /&gt;  $tag_mess = array_merge($tag_mess, $tags);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// determine the font-size increment&lt;br /&gt;// this is the increase per tag quantity (times used)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$tags = array_count_values($tag_mess);&lt;br /&gt;arsort($tags);&lt;br /&gt;$tags = array_slice($tags, 0, 30);&lt;br /&gt;ksort($tags);&lt;br /&gt;&lt;br /&gt;$max_qty = max(array_values($tags));&lt;br /&gt;$min_qty = min(array_values($tags));&lt;br /&gt;&lt;br /&gt;// change these font sizes if you will&lt;br /&gt;$max_size = 200; // max font size in %&lt;br /&gt;$min_size = 100; // min font size in %&lt;br /&gt;&lt;br /&gt;// get the largest and smallest array values&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;// find the range of values&lt;br /&gt;$spread = $max_qty - $min_qty;&lt;br /&gt;if (0 == $spread) { // we don't want to divide by zero&lt;br /&gt;    $spread = 1;&lt;br /&gt;}&lt;br /&gt;$step = ($max_size - $min_size)/($spread);&lt;br /&gt;&lt;br /&gt;// loop through our tag array&lt;br /&gt;foreach ($tags as $key =&amp;gt; $value) {&lt;br /&gt;  $size = $min_size + (($value - $min_qty) * $step);&lt;br /&gt;  $output .= '&amp;lt;a href=&amp;quot;/[~4817~]?tags='.urlencode($key).'&amp;quot; style=&amp;quot;font-size: '.$size.'%&amp;quot; title=&amp;quot;&amp;quot;&amp;gt;'.$key.'&amp;lt;/a&amp;gt; ';&lt;br /&gt;}&lt;br /&gt;return $output;&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;К сожалению делалось все в спешке и не хватило времени добавить в код комментарии и вообще привести все в божеский вид. Буду очень благодарен тому, у кого найдется минутка оформить сие в нормальный сниппет для общего пользования (можно даже мое авторство не ставить:)).&lt;br /&gt;&lt;br /&gt;Сниппет в действии: &lt;a href="http://s31183.gridserver.com/"&gt;http://s31183.gridserver.com&lt;/a&gt; (не морщитесь - сайт в разработке)&lt;br /&gt;&lt;br /&gt;PS. Только сейчас обнаружил еще один сниппет для тегового облака в репозитарии modxcms.com: &lt;a href="http://modxcms.com/TagCloud-749.html"&gt;http://modxcms.com/TagCloud-749.html&lt;/a&gt;. Может с моей задачей справился бы и он.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-6346087520026972986?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/6346087520026972986/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=6346087520026972986' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/6346087520026972986'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/6346087520026972986'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2008/02/4000.html' title='теговое облако для 4000 документов'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-3716949284849137401</id><published>2008-01-16T19:12:00.000+03:00</published><updated>2008-01-16T19:19:58.615+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mcpuck'/><category scheme='http://www.blogger.com/atom/ns#' term='fckeditor'/><category scheme='http://www.blogger.com/atom/ns#' term='resource browser'/><title type='text'>сортировка файлов по алфавиту в FCK-менеджере ресурсов</title><content type='html'>Очень и очень долго рыл по этому вопросу форум и ничего не нашел. Папки и файлы в менеджере ресурсов FCK-Editor (который стоит сейчас по умолчанию как менеджер файлов для TV и прочего) выводятся в соответствии с установками сервера на котором хостится сайт. В большинстве случаев сортировка идет по дате последнего изменения. Когда этих папок становится много, приятней было бы сортировать по алфавиту.&lt;br /&gt;&lt;br /&gt;Повторюсь, что на форуме нашел много постов с этим же вопросом, но ни одного вменяемого ответа. Попробовал сам подредактировать mcpuck-коннектор - не осилил.&lt;br /&gt;&lt;br /&gt;И вот, мои поиски увенчались успехом - &lt;a href="http://www.modxcms.de/forum/comments.php?DiscussionID=581"&gt;отличное изящное решение от немецкого сообщества MODx&lt;/a&gt; (распакуйте архив в корень сайта)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-3716949284849137401?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/3716949284849137401/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=3716949284849137401' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/3716949284849137401'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/3716949284849137401'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2008/01/fck.html' title='сортировка файлов по алфавиту в FCK-менеджере ресурсов'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-1960221627514018984</id><published>2008-01-16T15:12:00.000+03:00</published><updated>2008-01-16T15:38:21.322+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Inherit Parent Template'/><category scheme='http://www.blogger.com/atom/ns#' term='шаблон'/><title type='text'>задание шаблона по умолчанию для дочерних документов определенного родителя</title><content type='html'>Очень давно меня беспокоила необходимость постоянно задавать шаблон для новых документов. Когда речь не идет о периодической информации - шаблон задать нетрудно, однако когда необходимо создавать по нескольку документов в минуту - вопрос стоит достаточно остро. К тому же, ваш заказчик, сам администрируя сайт, может просто забыть выставить нужный шаблон.&lt;br /&gt;&lt;br /&gt;В последних версиях MODx появился плагин &lt;span style="font-weight: bold;"&gt;Inherit Parent Template&lt;/span&gt;, с помощью которого можно было создать неопубликованный контейнер и задать ему нужный шаблон, тогда все дочерние документы наследовали этот шаблон. Однако этот способ вынуждал делать лишние контейнеры для каждой категории и создавать иерархию меню отдельно от документов контента.&lt;br /&gt;&lt;br /&gt;Итак, хочу представить более менее приемлемое решение. Мы немного изменим вышеупомянутый плагин, чтобы задать родительские документы, &lt;span style="font-style:italic;"&gt;новые(!)&lt;/span&gt; дочерние документы которых будут автоматически принимать заданный шаблон. Сразу оговорюсь, в моем случае пришлось задавать суперродителей (родителей родителей), однако закомментировав одну строку плагина вы можете иметь возможность задавать просто родителей.&lt;br /&gt;&lt;br /&gt;Код нового плагина "Inherit Parent Template" (его можно просто заменить поверх старого):&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;/*&lt;br /&gt; * Inherit Template from Parent&lt;br /&gt; * Written By Raymond Irving - 12 Oct 2006&lt;br /&gt; *&lt;br /&gt; * Simply results in new documents inherriting the template &lt;br /&gt; * of their parent folder upon creating a new document&lt;br /&gt; *&lt;br /&gt; * Configuration:&lt;br /&gt; * check the OnDocFormPrerender event&lt;br /&gt; *&lt;br /&gt; * Version 1.0&lt;br /&gt; *&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt; &lt;br /&gt; &lt;br /&gt;global $content;&lt;br /&gt;$e = &amp;amp;$modx-&amp;gt;Event;&lt;br /&gt;&lt;br /&gt;$parents_and_templates = array (&lt;br /&gt;    '4818' =&amp;gt; '5', // id родителя =&gt; id шаблона (можно посмотреть в БД)&lt;br /&gt;    '4817' =&amp;gt; '6'&lt;br /&gt;);&lt;br /&gt;&lt;br /&gt;switch($e-&amp;gt;name) {&lt;br /&gt;  case 'OnDocFormPrerender':&lt;br /&gt;    if(($_REQUEST['pid'] &amp;gt; 0) &amp;amp;&amp;amp; ($id == 0)) {&lt;br /&gt;        $parent = $modx-&amp;gt;getPageInfo($_REQUEST['pid'],0,'id, parent, template');&lt;br /&gt;        $parent = $modx-&amp;gt;getPageInfo($parent['parent'],0,'id, parent, template'); //&amp;#1079;&amp;#1072;&amp;#1082;&amp;#1086;&amp;#1084;&amp;#1084;&amp;#1077;&amp;#1085;&amp;#1090;&amp;#1080;&amp;#1088;&amp;#1091;&amp;#1081;&amp;#1090;&amp;#1077; &amp;#1101;&amp;#1090;&amp;#1091; &amp;#1089;&amp;#1090;&amp;#1088;&amp;#1086;&amp;#1082;&amp;#1091;, &amp;#1077;&amp;#1089;&amp;#1083;&amp;#1080; &amp;#1074;&amp;#1072;&amp;#1084; &amp;#1085;&amp;#1091;&amp;#1078;&amp;#1077;&amp;#1085; &amp;#1088;&amp;#1086;&amp;#1076;&amp;#1080;&amp;#1090;&amp;#1077;&amp;#1083;&amp;#1100; &amp;#1087;&amp;#1077;&amp;#1088;&amp;#1074;&amp;#1086;&amp;#1075;&amp;#1086; &amp;#1091;&amp;#1088;&amp;#1086;&amp;#1074;&amp;#1085;&amp;#1103;&lt;br /&gt;        $pid = $parent['id'];&lt;br /&gt;        if (array_key_exists($pid,$parents_and_templates)) {&lt;br /&gt;            $content['template'] = $parents_and_templates[$pid];&lt;br /&gt;        }&lt;br /&gt;        else {&lt;br /&gt;        $content['template'] = $parent['template'];&lt;br /&gt;      }&lt;br /&gt;    }&lt;br /&gt;    break;&lt;br /&gt;&lt;br /&gt;  default:&lt;br /&gt;    return;&lt;br /&gt;    break;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;задать родительский документ и соответствующий шаблон можно в массиве&lt;br /&gt;&lt;pre style="font-family: Andale Mono, Lucida Console, Monaco, fixed, monospace; color: #000000; background-color: #eee;font-size: 12px;border: 1px dashed #999999;line-height: 14px;padding: 5px; overflow: auto; width: 100%"&gt;&lt;code&gt;$parents_and_templates = array (&lt;br /&gt;    '4818' =&amp;gt; '5',&lt;br /&gt;    '4817' =&amp;gt; '6'&lt;br /&gt;);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-1960221627514018984?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/1960221627514018984/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=1960221627514018984' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/1960221627514018984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/1960221627514018984'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2008/01/blog-post_16.html' title='задание шаблона по умолчанию для дочерних документов определенного родителя'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-7065559329982447992</id><published>2008-01-14T15:07:00.000+03:00</published><updated>2009-02-07T22:26:47.859+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Ditto'/><category scheme='http://www.blogger.com/atom/ns#' term='createdon'/><category scheme='http://www.blogger.com/atom/ns#' term='дата'/><title type='text'>добавление поля редактирования даты создания документа (createdon) в менеджере</title><content type='html'>Одной из проблем, с которыми приходилось сталкиваться не раз - запись даты создания документа задним числом. Можно создавать TV типа date, можно записывать даты в pub_date и тд. Однако, если вы не задаете абсолютно всем документам дату в своем параметре и для каких то документов он остается пустым - возникнут проблемы с сортировкой этих документов с помощью Ditto.&lt;br /&gt;&lt;br /&gt;Вот захотелось набраться наглости и сделать в панели редактирования документа дополнительное поле, позволяющее редактировать дату создания документа (createdon). Создавая документ задним числом, вы просто редактируете дату его создания, а по умолчанию естественно задается текущая дата. Итак нужно выполнить следующие шаги:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;в &lt;span style="font-weight: bold;"&gt;manager/actions/mutate_content.dynamic.php&lt;/span&gt; меняем&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;// retain form values if template was changed&lt;br /&gt;// edited to convert pub_date and unpub_date&lt;br /&gt;// sottwell 02-09-2006&lt;br /&gt;if ($formRestored == true || isset ($_REQUEST['newtemplate'])) {&lt;br /&gt;$content = array_merge($content, $_POST);&lt;br /&gt;$content["content"] = $_POST["ta"];&lt;br /&gt;if (empty ($content["pub_date"])) {&lt;br /&gt;unset ($content["pub_date"]);&lt;br /&gt;} else {&lt;br /&gt;$pub_date = $content['pub_date'];&lt;br /&gt;list ($d, $m, $Y, $H, $M, $S) = sscanf($pub_date, "%2d-%2d-%4d %2d:%2d:%2d");&lt;br /&gt;$pub_date = strtotime("$m/$d/$Y $H:$M:$S");&lt;br /&gt;$content['pub_date'] = $pub_date;&lt;br /&gt;}&lt;br /&gt;if (empty ($content["unpub_date"])) {&lt;br /&gt;unset ($content["unpub_date"]);&lt;br /&gt;} else {&lt;br /&gt;$unpub_date = $content['unpub_date'];&lt;br /&gt;list ($d, $m, $Y, $H, $M, $S) = sscanf($unpub_date, "%2d-%2d-%4d %2d:%2d:%2d");&lt;br /&gt;$unpub_date = strtotime("$m/$d/$Y $H:$M:$S");&lt;br /&gt;$content['unpub_date'] = $unpub_date;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; на &lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;// retain form values if template was changed&lt;br /&gt;// edited to convert pub_date and unpub_date&lt;br /&gt;// sottwell 02-09-2006&lt;br /&gt;if ($formRestored == true || isset ($_REQUEST['newtemplate'])) {&lt;br /&gt;$content = array_merge($content, $_POST);&lt;br /&gt;$content["content"] = $_POST["ta"];&lt;br /&gt;if (empty ($content["pub_date"])) {&lt;br /&gt;unset ($content["pub_date"]);&lt;br /&gt;} else {&lt;br /&gt;$pub_date = $content['pub_date'];&lt;br /&gt;list ($d, $m, $Y, $H, $M, $S) = sscanf($pub_date, "%2d-%2d-%4d %2d:%2d:%2d");&lt;br /&gt;$pub_date = strtotime("$m/$d/$Y $H:$M:$S");&lt;br /&gt;$content['pub_date'] = $pub_date;&lt;br /&gt;}&lt;br /&gt;if (empty ($content["unpub_date"])) {&lt;br /&gt;unset ($content["unpub_date"]);&lt;br /&gt;} else {&lt;br /&gt;$unpub_date = $content['unpub_date'];&lt;br /&gt;list ($d, $m, $Y, $H, $M, $S) = sscanf($unpub_date, "%2d-%2d-%4d %2d:%2d:%2d");&lt;br /&gt;$unpub_date = strtotime("$m/$d/$Y $H:$M:$S");&lt;br /&gt;$content['unpub_date'] = $unpub_date;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;if (empty ($content["createdon"])) {&lt;br /&gt;unset ($content["createdon"]);&lt;br /&gt;} else {&lt;br /&gt;$createdon = $content['createdon'];&lt;br /&gt;list ($d, $m, $Y, $H, $M, $S) = sscanf($createdon, "%2d-%2d-%4d %2d:%2d:%2d");&lt;br /&gt;$createdon = strtotime("$m/$d/$Y $H:$M:$S");&lt;br /&gt;$content['createdon'] = $createdon;&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;добавляем в &lt;span style="font-weight: bold;"&gt;manager/actions/mutate_content.dynamic.php&lt;/span&gt; до строки &lt;span style="font-weight: bold;"&gt;700(приблизительно, строка содержит &amp;lt;input name="pub_date"&amp;gt;&lt;br /&gt;&lt;pre face="Andale Mono,Lucida Console,Monaco,fixed,monospace" size="12px" style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;tr&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&amp;lt;span class="warning"&amp;gt;Дата создания&amp;lt;/span&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;td&amp;gt;&lt;br /&gt;&amp;lt;?php&lt;br /&gt;$timestamp = time();&lt;br /&gt;?&amp;gt;&lt;br /&gt;&amp;lt;input name="createdon" value="&amp;lt;?php echo $content['createdon']=="0" || !isset($content['createdon']) ? strftime("%d-%m-%Y %H:%M:%S", $timestamp) : strftime("%d-%m-%Y %H:%M:%S", $content['createdon']); ?&amp;gt;" onblur="documentDirty=true;" /&amp;gt;&lt;br /&gt;&amp;lt;a onclick="documentDirty=false; cal0.popup();" onmouseover="window.status='&amp;lt;?php echo $_lang['select_date']; ?&amp;gt;'; return true;" onmouseout="window.status=''; return true;" style="cursor:pointer; cursor:hand"&amp;gt;&amp;lt;img src="media/style/&amp;lt;?php echo $manager_theme ? "$manager_theme/":""; ?&amp;gt;images/icons/cal.gif" width="16" height="16" border="0" alt="&amp;lt;?php echo $_lang['select_date']; ?&amp;gt;" /&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&amp;lt;/td&amp;gt;&lt;br /&gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;добавляем в &lt;span style="font-weight: bold;"&gt;manager/actions/mutate_content.dynamic.php&lt;/span&gt; в самый конец файла,  в после строки&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;script type="text/javascript"&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;... следующий код:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;  var cal0 = new calendar1(document.forms['mutate'].elements['createdon'], document.getElementById("pub_date_show"));&lt;br /&gt;cal0.path="&amp;lt;?php echo str_replace("index.php", "media/", $_SERVER["PHP_SELF"]); ?&amp;gt;";&lt;br /&gt;cal0.year_scroll = true;&lt;br /&gt;cal0.time_comp = true;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;добавляем в &lt;span style="font-weight: bold;"&gt;manager/processors/save_content.processor.php&lt;/span&gt; после строки &lt;span style="font-weight: bold;"&gt;"$hidemenu = intval($_POST['hidemenu']);"&lt;/span&gt;:&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;$createdon = $_POST['createdon'];&lt;br /&gt;list ($d, $m, $Y, $H, $M, $S) = sscanf($createdon, "%2d-%2d-%4d %2d:%2d:%2d"); //added by yentsun&lt;br /&gt;$createdon = mktime($H, $M, $S, $m, $d, $Y);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;в &lt;span style="font-weight: bold;"&gt;manager/processors/save_content.processor.php&lt;/span&gt; меняем sql-запрос, начинающийся с INSERT на&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;$sql = "INSERT INTO $tblsc (introtext,content, pagetitle, longtitle, type, description, alias, link_attributes, isfolder, richtext, published, parent, template, menuindex, searchable, cacheable, createdby, createdon, editedby, editedon, publishedby, publishedon, pub_date, unpub_date, contentType, content_dispo, donthit, menutitle, hidemenu)&lt;br /&gt;       VALUES('" . $introtext . "','" . $content . "', '" . $pagetitle . "', '" . $longtitle . "', '" . $type . "', '" . $description . "', '" . $alias . "', '" . $link_attributes . "', '" . $isfolder . "', '" . $richtext . "', '" . $published . "', '" . $parent . "', '" . $template . "', '" . $menuindex . "', '" . $searchable . "', '" . $cacheable . "', '" . $modx-&amp;gt;getLoginUserID() . "', " . $createdon . ", '" . $modx-&amp;gt;getLoginUserID() . "', " . time() . ", " . $publishedby . ", " . $publishedon . ", '$pub_date', '$unpub_date', '$contentType', '$contentdispo', '$donthit', '$menutitle', '$hidemenu')";&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;, блок &lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;$sql = "UPDATE $tblsc SET introtext='$introtext', content='$content', pagetitle='$pagetitle', longtitle='$longtitle', type='$type', description='$description', alias='$alias', link_attributes='$link_attributes',&lt;br /&gt;isfolder=$isfolder, richtext=$richtext, published=$published, pub_date=$pub_date, unpub_date=$unpub_date, parent=$parent, template=$template, menuindex='$menuindex',&lt;br /&gt;searchable=$searchable, cacheable=$cacheable, editedby=" . $modx-&amp;gt;getLoginUserID() . ", editedon=" . time() . ", publishedon=$publishedon, publishedby=$publishedby, contentType='$contentType', content_dispo='$contentdispo', donthit='$donthit', menutitle='$menutitle', hidemenu='$hidemenu' WHERE id=$id;";&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt; на &lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;$sql = "UPDATE $tblsc SET introtext='$introtext', content='$content', pagetitle='$pagetitle', longtitle='$longtitle', type='$type', description='$description', alias='$alias', link_attributes='$link_attributes',&lt;br /&gt;isfolder=$isfolder, richtext=$richtext, published=$published, pub_date=$pub_date, unpub_date=$unpub_date, parent=$parent, template=$template, menuindex='$menuindex',&lt;br /&gt;searchable=$searchable, cacheable=$cacheable, editedby=" . $modx-&amp;gt;getLoginUserID() . ", editedon=" . time() . ", publishedon=$publishedon, publishedby=$publishedby, contentType='$contentType', content_dispo='$contentdispo', donthit='$donthit', menutitle='$menutitle', hidemenu='$hidemenu', createdon='$createdon' WHERE id=$id;";&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;(добавляем в хвост запроса строку createdon='$createdon')&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;-----------------&lt;br /&gt;&lt;br /&gt;Хотите запечатлеть важнейшие моменты в жизни? Воспользуйтесь &lt;a href="http://marilena.ru/"&gt;свадебной фотографией&lt;/a&gt; Марины Салмановой.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-7065559329982447992?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/7065559329982447992/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=7065559329982447992' title='Комментарии: 12'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/7065559329982447992'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/7065559329982447992'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2008/01/createdon.html' title='добавление поля редактирования даты создания документа (createdon) в менеджере'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-7226196726117603038</id><published>2008-01-10T18:35:00.000+03:00</published><updated>2008-01-14T19:43:02.693+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='phx'/><category scheme='http://www.blogger.com/atom/ns#' term='теги'/><category scheme='http://www.blogger.com/atom/ns#' term='Ditto'/><title type='text'>выод  лимитированного количества теговых ссылок</title><content type='html'>Задача: есть некое количество документов, в которых слишком много тегов. Это конечно не нормальная ситуация, однако предположим что такие документы есть и нам нужно выводить тегов не более заданного числа&lt;br /&gt;&lt;br /&gt;Решение: плейсхолдер Ditto [+tagLinks+], отвечающий за вывод теговых ссылок, параметра&lt;span style="font-style: italic;"&gt; лимитирования&lt;/span&gt; не имеет, поэтому нам придется написать свой phx-фильтр:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&lt;br /&gt;$options = explode('|', $options);&lt;br /&gt;&lt;br /&gt;$delimiter = (!empty($options[0])) ? $options[0] : ', ';&lt;br /&gt;$links_limit = (!empty($options[1])) ? $options[1] : 3;&lt;br /&gt;$url = $options[2];&lt;br /&gt;$links_class = (!empty($options[3])) ? $options[3] : 'tag_link';&lt;br /&gt;&lt;br /&gt;$array = explode($delimiter, $output);&lt;br /&gt;$tail = (count($array)&amp;gt;$links_limit) ? '...' : '';&lt;br /&gt;for ($i=0; $i&amp;lt;=$links_limit-1; $i++) {&lt;br /&gt; $retval .= '&amp;lt;a class="'.$links_class.'" href="[(base_url)]'.$url.'?tags='.urlencode($array[$i]).'"&amp;gt;'.$array[$i].'&amp;lt;/a&amp;gt;';&lt;br /&gt;}&lt;br /&gt;return $retval.$tail;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;назовем его например phx:taglinks_limited и вызовем следующим образом (в шаблоне Ditto):&lt;br /&gt;[+tags:taglinks_limited=`, |2|[~[*id*]~]|ditto_tag`+]&lt;br /&gt;&lt;br /&gt;параметры нашего фильтра разделяются символом "|" и расшифровываются как &lt;span style="font-style: italic;"&gt;разделитель тегов|количество выводимых ссылок|url страницы с выводом документов по тегу|CSS-класс теговых ссылок&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-7226196726117603038?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/7226196726117603038/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=7226196726117603038' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/7226196726117603038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/7226196726117603038'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2008/01/blog-post.html' title='выод  лимитированного количества теговых ссылок'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-3185686111237631384</id><published>2008-01-10T12:03:00.000+03:00</published><updated>2008-01-10T13:05:13.561+03:00</updated><title type='text'>нюансы перехода от windows-1251 к utf-8</title><content type='html'>Проблема: после перехода сайта на utf-8 все работает нормально за исключением следующих моментов&lt;br /&gt;&lt;ul&gt;&lt;li&gt;фраза "без категории" в управлении ресурсами отображается как "&lt;strong style="font-weight: normal;"&gt;??? ?????????&lt;/strong&gt;"&lt;/li&gt;&lt;li&gt;после сохранения кода сниппетов, чанков и тд, все кириллические символы внутри превращаются в вопросы&lt;/li&gt;&lt;/ul&gt;Причина: не настроена кодировка соединения самого менеджера с базой (или какого то его блока)&lt;br /&gt;&lt;br /&gt;Решение: взято &lt;a href="http://modxcms.com/forums/index.php/topic,4422.5/"&gt;из форума&lt;/a&gt;. В файле &lt;span style="font-weight: bold;"&gt;manager/index.php&lt;/span&gt; около строки &lt;span style="font-weight: bold;"&gt;133&lt;/span&gt;...&lt;br /&gt;&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;    mysql_select_db($dbase);&lt;br /&gt; mysql_query("SET NAMES 'utf8';",$modxDBConn);&lt;br /&gt; mysql_query("SET CHARACTER SET 'utf8';",$modxDBConn);&lt;br /&gt; mysql_query("SET SESSION collation_connection = 'utf8_general_ci';",$modxDBConn);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;В некоторых случаях придется сделать похожие изменения и в файле &lt;span style="font-weight: bold;"&gt;manager/includes/extenders/dbapi.mysql.class.inc.php&lt;/span&gt; около &lt;span style="font-weight: bold;"&gt;90&lt;/span&gt; строки (см. сообщение в форуме)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-3185686111237631384?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/3185686111237631384/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=3185686111237631384' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/3185686111237631384'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/3185686111237631384'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2008/01/windows-1251-utf-8.html' title='нюансы перехода от windows-1251 к utf-8'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-7369703151225731246</id><published>2008-01-10T11:00:00.000+03:00</published><updated>2008-01-10T11:22:44.307+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xls'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP-ExcelReader'/><title type='text'>считывание файла xls с помощью php</title><content type='html'>Задача: считать информацию из файла Excel в массивы php для последующего вывода в динамический файл javascript.&lt;br /&gt;&lt;br /&gt;Решение: отлично справляется бесплатный скрипт &lt;a href="http://sourceforge.net/projects/phpexcelreader/"&gt;PHP-ExcelReader&lt;/a&gt;, созданный нашим соотечественником, Вадимом Ткаченко.&lt;br /&gt;&lt;br /&gt;Пример калькулятора, работающего от подгружаемого xls-файла можно найти на сайте &lt;a href="http://tclogic.ru/"&gt;tclogic.ru&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-7369703151225731246?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/7369703151225731246/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=7369703151225731246' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/7369703151225731246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/7369703151225731246'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2008/01/xls-php.html' title='считывание файла xls с помощью php'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-6176250500567685734</id><published>2007-12-28T14:08:00.000+03:00</published><updated>2007-12-28T15:12:14.173+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DittoCal'/><category scheme='http://www.blogger.com/atom/ns#' term='strtotime'/><category scheme='http://www.blogger.com/atom/ns#' term='GET'/><title type='text'>вывод даты в заголовок из параметров GET DittoCal</title><content type='html'>Задача: сделать вывод даты из параметров GET DottoCal в заголовок, например "Новости за 15 января 2007 года".&lt;br /&gt;&lt;br /&gt;Решение: пришло на ум два варианта - преобразовывать номера месяцев из параметров в названия из массива... и более универсальный, преобразовывать дату из параметров в timestamp и потом выводить в нужном формате через &lt;a href="http://ru2.php.net/strftime"&gt;strftime&lt;/a&gt;. Приведу скрипт сниппета для последнего решения:&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;code&gt;&amp;lt;?php&lt;br /&gt;if (isset($_GET[cal_month])) {&lt;br /&gt;if (isset($_GET[cal_day])) {&lt;br /&gt; $date_string = $_GET[cal_year]."-".$_GET[cal_month]."-".$_GET[cal_day]." 00:00:00"; //задана  дата полностью&lt;br /&gt; $nix_date =  strtotime($date_string);&lt;br /&gt; return "за ".strftime("%d %B, %Y",$nix_date);&lt;br /&gt;} else {&lt;br /&gt; $date_string = $_GET[cal_year]."-".$_GET[cal_month]."-1 00:00:00"; //заданы месяц и год&lt;br /&gt; $nix_date =  strtotime($date_string);&lt;br /&gt; return "за ".strftime("%B, %Y",$nix_date);&lt;br /&gt;}&lt;br /&gt;} else {&lt;br /&gt;return "";&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;здесь нам помогает функция &lt;a href="http://ru2.php.net/strtotime"&gt;strtotime&lt;/a&gt;, которая переводит дату из строки в timestamp. Примечание: сниппет следует вызывать некешированным.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-6176250500567685734?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/6176250500567685734/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=6176250500567685734' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/6176250500567685734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/6176250500567685734'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2007/12/get-dittocal.html' title='вывод даты в заголовок из параметров GET DittoCal'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-5817851334894451794</id><published>2007-12-27T15:17:00.000+03:00</published><updated>2007-12-27T15:28:28.054+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DittoCal'/><category scheme='http://www.blogger.com/atom/ns#' term='htmlentities'/><category scheme='http://www.blogger.com/atom/ns#' term='cp1251'/><title type='text'>устранение проблем с кириллицей в DittoCal</title><content type='html'>После успешного применения русской локали, единственным неправильно выводившим кириллицу сниппетом остался DittoCal. Все по одной простой причине - названия месяцев и дней недели в нем пропускаются через &lt;strong&gt;htmlentities. &lt;/strong&gt;Мне лично это слегка непонятно - откуда могут возникнуть проблемные символы в названиях месяцев и дней недели?&lt;br /&gt;&lt;br /&gt;Вобщем, для нормального вывода последних, нужно просто убрать в соответсвующих местах (ниже строки "#if the day names should be shown") функцию &lt;strong&gt;htmlentities. &lt;/strong&gt;Как оказалось, она убивает кодировку cp1251.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-5817851334894451794?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/5817851334894451794/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=5817851334894451794' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/5817851334894451794'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/5817851334894451794'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2007/12/dittocal_27.html' title='устранение проблем с кириллицей в DittoCal'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-678917746396943039</id><published>2007-12-27T15:09:00.000+03:00</published><updated>2007-12-27T15:14:05.263+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='setlocale'/><category scheme='http://www.blogger.com/atom/ns#' term='mediatemple'/><title type='text'>Настройка русской локали на хостинге mediatemple (gs)</title><content type='html'>Есть небольшой нюанс в переключении на русскую локаль на хостинге mediatemple: &lt;pre&gt;&lt;code&gt;setlocale(LC_TIME, "ru_RU.CP1251");&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;Мне пришлось попотеть, так как я не знал о существовании способов задания локали кроме как "ru_RU" :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-678917746396943039?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/678917746396943039/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=678917746396943039' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/678917746396943039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/678917746396943039'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2007/12/mediatemple-gs.html' title='Настройка русской локали на хостинге mediatemple (gs)'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-3792399894471003002</id><published>2007-12-26T15:06:00.000+03:00</published><updated>2007-12-26T15:54:11.659+03:00</updated><title type='text'>Вывод новостей за указанную дату (Ditto+DittoCal)</title><content type='html'>По умолчанию, DittoCal при нажатии на ссылку даты выводит один (не известно по каким критериям отобранный) пост. DittoCal не учитывает то, что за один день может быть написано несколько постов. Модифицируем DittoCal так, чтобы Ditto, при нажатии на дату календаря, выводил новости просто по фильтрам cal_dateFilter (см. предыдущий пост блога) с учетом парметра &amp;amp;cal_day.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;За формирование ссылки на дату в DittoCal отвечает блок &lt;br /&gt;&lt;pre&gt;&lt;code&gt;$calendar .= '&amp;lt;td'.($classes ? ' class="'.$add_class.' '.htmlspecialchars($classes).'"&amp;gt;' : '&amp;gt;').&lt;br /&gt;     ($link ? '&amp;lt;a href="'.htmlspecialchars($link).'" title="'.htmlspecialchars($title).'"&amp;gt;'.$content.'&amp;lt;/a&amp;gt;' : $content).'&amp;lt;/td&amp;gt;';&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Заменим последнюю строку на &lt;pre&gt;&lt;code&gt;&amp;lt;a href="[(base_url)][~[*id*]~]?cal_year='.$year.'&amp;amp;amp;cal_month='.$month.'&amp;amp;amp;cal_day='.$day.'"&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-3792399894471003002?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/3792399894471003002/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=3792399894471003002' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/3792399894471003002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/3792399894471003002'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2007/12/dittodittocal.html' title='Вывод новостей за указанную дату (Ditto+DittoCal)'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-24732753522340294.post-8839544135078473930</id><published>2007-12-26T14:20:00.000+03:00</published><updated>2007-12-27T11:46:40.943+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dateFilter'/><category scheme='http://www.blogger.com/atom/ns#' term='DittoCal'/><category scheme='http://www.blogger.com/atom/ns#' term='Ditto'/><category scheme='http://www.blogger.com/atom/ns#' term='GET'/><category scheme='http://www.blogger.com/atom/ns#' term='extender'/><title type='text'>вывод новостей в соответствии с парметрами DittoCal</title><content type='html'>Для того чтобы Ditto видел параметры DittoCal (которые отличаются приставкой "cal_"), возможно нужно изменить фильтр/экстендер &lt;span&gt;&lt;i&gt;dateFilter&lt;/i&gt;...&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Запись о параметрах GET экстендера &lt;i&gt;dateFilter&lt;/i&gt; находится в файле &lt;strong&gt;assets/snippets/ditto/extenders/dateFilter.extender.inc.php &lt;/strong&gt;около строки 100.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Создаем новый экстендер "cal_dateFilter" путем копирования файла &lt;strong&gt;dateFilter.extender.inc.php&lt;/strong&gt; и переименования его в &lt;strong&gt;cal_dateFilter.extender.inc.php.&lt;br /&gt;&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;Меняем все упоминания параметров "year", "month" и "day" на "cal_year", "cal_month" и "cal_day" в строках с &lt;strong&gt;101&lt;/strong&gt; по &lt;strong&gt;103&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;В вызове Ditto, который будет выводить новости учитывая параметры DittoCal добавляем параметры &lt;i&gt;&amp;amp;extenders=`cal_dateFilter` &amp;amp;dateSource=`createdon`&lt;/i&gt;&lt;/li&gt;&lt;/ol&gt;&lt;strong&gt;&lt;/strong&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/24732753522340294-8839544135078473930?l=modxnotes.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://modxnotes.blogspot.com/feeds/8839544135078473930/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=24732753522340294&amp;postID=8839544135078473930' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/8839544135078473930'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/24732753522340294/posts/default/8839544135078473930'/><link rel='alternate' type='text/html' href='http://modxnotes.blogspot.com/2007/12/dittocal.html' title='вывод новостей в соответствии с парметрами DittoCal'/><author><name>yentsun</name><uri>http://www.blogger.com/profile/17711320692557704122</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
