18июля,
2010
В общем, терпение, конечно, у меня объёмистое очень, до последнего, а потом прорывает.
За сим, наконец-то решился отказаться от поддержки IE6. Я там уже просто наизусть знаю тонну багов и всегда стараюсь верстать, чтоб они не вылезли при тестировании макетов, но всякие разные интересные штуки, которые спокойно делаются в ие7-8 итд итп, а в ие6 не работают — да и хуй с ним, с этим IE6. Достал.
Буду требовать денег за поддержку динозавра позапрошлой эпохи интернета.
Заноза в заднице, больной зуб разработчика. Ещё надо какое-нибудь всплывающее окошко вешать на сайты с издевательскими текстами.
17июня,
2010

Сходил в понедельник, 14 июня на концерт Soulfly в клубе Fontaine.
До последнего момента не верилось, что приедут, уж слишком известная команда для такого маленького клуба. Но, ничего, появились, отыграли на ура, публика их очень хорошо встретила, играли свои песни и старые песни Sepultur-ы тоже.
В целом, прошло всё очень здорово, народу, правда, набилось много, но ни драк, ни каких либо нездоровых эксцессов не было. Жаль только, что после концерта пришлось просыпаться во вторник, а не в субботу. Не самый удачный день для такого мероприятия, но в рамках тура особо не выбирают. Во вторник они уже радовали эстонскую публику, так что там в среду проснулись, наверное, с похожими мыслями.
Всякие майки, диски и прочее, конечно, стоило очень прилично. Ну, как обычно на концертах.
На разогреве играла цесиская metalcore/hardcore-группа Enhet. Никогда их раньше не слышал, а играют хорошо. Слаженно и звучно.
Побольше бы таких концертов, правда, окупаемость их под большим сомнением.
31мая,
2010
Когда делается сайт, всегда есть какие-то мелкие вещи, которые одинаковые на всех страницах, например, небольшой блок контактной информации внизу сайта, фразы и названия кнопок, текст кнопки выхода из системы, сменный фон на страницах, единый для всего сайта.
Самый простой вариант: Забить их жёстко и не давать менеджеру сайта возможность их редактировать.
И другой вариант: Все необходимое собрать в одном документе, вписать в TV-параметры и вызывать в нужным местах.
Выглядит это примерно так:
Делается шаблон Settings (можно его оставить пустым), cоздаётся документ в дереве сайта, тоже Settings (Я так его называю, чтобы сразу было понятно, что и для чего он), отключается отображение в меню, тогда не вылезет нигде в меню, присваивается шаблон, описанный выше, этому шаблону назначаются все необходимые TV-параметры. Их можно заполнить заранее или потом.
А в шаблоне любой страницы сайта пишется вызов Ditto, где будет, например, блок контактной информации:
[[Ditto? &documents=`20` &tpl=`settings`]]
Кэшируемый вызов Ditto, из документа Settings, у которого, ID-номер, например, 20, вызывается всё необходимое, tpl — шаблон для вывода на страницах сайта.
Шаблон вывода может выглядеть так:
<div>
<h3>[+longtitle+]</h3>
<p>[+introtext+]</p>
</div>
Заголовок для блока берётся из поля Longtitle, а сама контактная информация из Introtext-а. Достаточно заполнить их только в документе Settings, и они будут везде отображаться одинаково. И у клиента будет возможность самостоятельно их поменять, не придётся копаться, ни в чанках, ни в TV-параметрах или просить разработчика это сделать.
Это увеличивает немного нагрузку на базу и на систему в целом, но не критично, зато сильно облегчает жизнь менеджерам сайта и разработчикам и очень просто делается.
26мая,
2010
«Затерянные» он, наверное, называется, потому что сценаристы мудрили, мудрили, да затерялись в том, что напридумывали.
Кучу всего оставили необъяснённым, свели всё к сопливой прощальной сцене, скользко так уйдя от многих корневых тем сериала.
И этим пудрили мозги 6 лет. Обидно.
4 8 15 16 23 42
23мая,
2010
Начиная читать этот роман, я был настроен довольно скептически — всё-таки фэнтези совсем не то, что я люблю и могу читать взахлёб. Но, слыша положительные отзывы, нельзя совсем ставить крест на книге.
Постепенно вникая в жизнь персонажей, вчитываясь в детали описания мира, становится понятно, что нельзя бросать не дочитав.
Собственно, сама книга повествует о молодом парне, живущем в странном государстве, где очень высокий уровень рождаемости, а зрелость наступает к семнадцати годам, учитывая, что рожать женщины начинают уже в четырнадцать лет. Тридцать лет — почти недостижимая планка, возраст, когда уже считаются дряхлыми стариками.
Жизнь и уклад примитивны, технологии на низком уровне, многие (для нас сейчас) вещи для них даже не очевидны.
Казалось бы, это фентези, взять любой мир, абстрагироваться от того, что это уже всё изобретено, да написать новую реальность, в которой это ещё не случилось, но автор, доведя повествование до конца, приятно удивил, оправдал этот мир и его «тёмных» обитателей. Рассказал много о технических сторонах (достаточно, чтобы не превратить книгу в технический справочник по дирижаблю или ледоколу), хорошо раскрыл характеры персонажей, не избегая обычной истории взрослеющего парня, проходящего привычные, почти для каждого, этапы жизни.
Не побоялся и чернухи, ведь в мире, где культ смерти является основной религией, без этого просто невозможно. Иногда даже жутко читать, что творится на улицах при большом скоплении людей.
Отдельно хочу отметить описание политических строев. Автор пошёл по проторенной дорожке, описывая развитие государства на живых в нашем мире примерах. На мой взгляд — это очень правильно. История циклична, любое государство, с чего бы оно ни начинало, всё равно будет переживать спады и взлёты. Сравнивая развитие разных стран, находится очень много общего. Не выдумывая утопических моделей, моделей, которые могли бы быть (как правило, «могли бы» означает, что никогда не будут), автор сложил чёткую картину на предыдущем опыте.
В целом, могу сказать, что Олег Никитин аккуратно создал мрачный и достаточно детально описанный мир, в который органично вписал персонажей. Уклад жизни и желание понять «Зачем это всё» привело роман к логическому концу, не обрывая его на полуслове.
Написано для сайта «Снежный Ком»
15мая,
2010
В последней версии ManagerManager, которая идёт с дистрибутивом Modx-а 1.0.3, обнаружилась ошибка:
mm_hideTemplates работает корректно только в Firefox-е. В остальных браузерах список шаблонов остаётся прежним и ничего не скрывается.
На официальном форуме предложили решение:
В файле /managermanager/functions/templates.inc.php заменить:
foreach ($tplIds as $tpl) {
$output .= 'if ($j("select#template").val() != '.$tpl. ') { '. "\n";
$output .= '$j("select#template option[value='.$tpl.']").hide();' . "\n";
$output .= '}' . "\n";
}
на:
foreach ($tplIds as $tpl) {
$output .= 'if ($j("select#template").val() != '.$tpl. ') { '. "\n";
$output .= '$j("select#template option[value='.$tpl.']").remove();' . "\n";
$output .= '$j("select#template optgroup:not(:has(*))").remove();' . "\n";
$output .= '}' . "\n";
}
Также в файле /manager/actions/mutate_content.dynamic.php на строке 585 исправить на:
<optgroup label="blank">
<option value="0">(blank)</option>
Что поможет избежать других проблем, потому как тег <optgroup> не указан.
Проверил, работает в Chrome, Opera и IE. Более того, Opera вылетала постоянно при попытке редактировать документ, после внесения исправления стала работать корректно.
1мая,
2010
Как оказалось, AjaxSearch нигде и ничего не ищет, когда системные поля Modx-а YAMS заменяет на TV-параметры.
На официальном форуме предлагается решение в подробностях, которое у меня так и не заработало. Всё это делалось на версии Modx Evolution 1.0.3.
А нашлось оно совершенно случайно (как обычно, впрочем). Надо было поставить чуть постарше версию AjaxSearch-a.
А именно версию 1.8.4. Она лежит в Previous Releases AjaxSearch-a.
Либо вот прямая ссылка на неё.
Как выглядит сам вызов:
На всех страницах сайта (ну, или на тех, где поле для поиска нужно) разместить вызов сниппета:
[!AjaxSearch? &parents=`0` &mbstring=`0` &AS_landing=`25` &addJscript=`0` &extract=`0` &AS_showResults=`0` &ajaxSearch=`0` &language=`(yams_mname)` &withTvs=`+:pagetitle_en,longtitle_en,introtext_en,description_en,content_en,pagetitle_ru,longtitle_ru,introtext_ru,description_ru,content_ru` &tplLayout=`search_tpl`!]
mbstring я отключаю сразу, оно у меня не работает. Поиск без перезагрузки я не проверял, он не нужен мне в 99%, а то и во всех 100% случаев, вроде как он всё равно корректно не работает. Ну, а дальше, собственно, куда будет выводиться результат поиска, на каком языке будет всё описание и, то, по каким полям AjaxSearch будет искать. Ну и сами TV-параметры, которые создаёт YAMS и не находит AJAxSearch.
Шаблон формы поиска стандартный:
[+as.showForm:is=`1`:then=`
<form [+as.formId+] action=[+as.formAction+]«„ method=“post»>
<fieldset>
<input type="hidden" name="advSearch" value=[+as.advSearch+]«„ />
<label for=“ajaxSearch_input»>
<input id="ajaxSearch_input" type="text" name="search" value=[+as.inputValue+]«[+as.inputOptions+]„ />
</label>
<label for=“ajaxSearch_submit»>
<input id="ajaxSearch_submit" type="image" src=[(site_url)]«images/search.gif» name="sub" value=[+as.submitText+]«« />
</label>
</fieldset>
</form>
`+]
[+as.showIntro:is=`1`:then=`
<p id="ajaxSearch_intro">[+as.introMessage+]</p>
`+]
[+as.showResults:is=`1`:then=`
[+as.results+]
`+]
Страница вывода результатов:
[!AjaxSearch? &mbstring=`0` &AS_showResults=`1` &ajaxSearch=`0`, &AS_landing=`25`, &AS_showForm=`0` &language=`(yams_mname)` &withTvs=`+:pagetitle_en,longtitle_en,introtext_en,description_en,content_en,pagetitle_ru,longtitle_ru,introtext_ru,description_ru,content_ru` &tplResult=`searchresult_`!]
Шаблон вывода результатов:
<a href=»(yams_doc:[+as.id+])» title=[[YAMS? &get=`content` &from=`pagetitle` &docid=`[+as.id+]«`]]»>[[YAMS? &get=`content` &from=`pagetitle` &docid=`[+as.id+]`]]</a>
[+as.descriptionShow:is=`1`:then=`
<span>[+as.description+]</span>
`+]
[+as.extractShow:is=`1`:then=`
<div><p>[+as.extract+]</p></div>
`+]
[+as.breadcrumbsShow:is=`1`:then=`
<span>[+as.breadcrumbs+]</span>
`+]
Тут стоит обратить внимание, что вызовы плейсхолдеров AjaxSearch-а заменяются на вызовы сниппета YAMS.
Чтобы ссылка работала верно, она обязательно должна быть заменена на (yams_doc:[+as.id+])
Ну, а показать title или заголовок, то надо вызывать сниппет YAMS:
[[YAMS? &get=`content` &from=`pagetitle` &docid=`[+as.id+]`]]
Такой поиск работает корректно, ищет и находит и правильно ссылается на страницы из результатов поиска.
30апреля,
2010
В этом году как-то очень бардачно проходит организация, куча каких-то проблем, задержек.
Смотришь со стороны и даже странно.
Хотя понятно, что организация подобных мероприятий — дело сложное и требует много времени и сил.
Я свою лепту внёс (впервые) — нарисовал сайт. Не знаю, кто и что там думает. Но самому работа нравится. Что-то, правда, в процессе остальной работы, он слегка видоизменился, ну, да ладно, не смертельно.
Программа постепенно пополняется презентациями, вроде бы даже не самыми плохими, посмотрим.
28апреля,
2010
YAMS — Yet Another Multilingual Solution — служит для создания многоязычных сайтов на базе Modx CMS.
Поиск по сайтам связанным с настройкой и работой с Modx уcпехом не увенчался. Вообще, никакой поиск успехом не увенчался, когда потребовалась информация на русском языке.
Пришлось разбираться с английской документацией и методом проб и ошибок делать проект.
Полностью переводить документацию не буду, расскажу в общих чертах, как его запустить и заставить работать.
Устанавливался YAMS на версию Modx Evolution 1.0.3, которая уже в дистрибутиве имеет предустановленный ManagerManager последней версии, без него YAMS просто не получится использовать.
Установка:
Надо скачать архив последней версии. Там что-то непонятное с версиями. Последняя версия почему-то не лежит на странице для скачки, а в списке Previous Releases, потому прямая ссылка на версию 1.1.7-alpha RC7, она пока последняя.
Распаковать архив и залить в папку assets/modules/yams, выставить права на папку yams 775.
Подключение модуля, плагина и сниппета:
Код модуля:
require_once ( $modx->config['base_path'] . 'assets/modules/yams/yams.module.inc.php' );
— Создать в администрационной части в разделе «Модули» новый модуль YAMS.
Описание: Yet Another Multilingual Solution Module
— Создать в администрационной части в разделе «Плагины» новый плагин YAMS.
Описание: Yet Another Multilingual Solution Plugin
Код плагина:
require ( $modx->config['base_path'] . 'assets/modules/yams/yams.plugin.inc.php');
В системных событиях плагина поставить галочки на:
OnLoadWebDocument
OnParseDocument
OnWebPageInit
OnWebPagePrerender
OnLoadWebPageCache
OnPageNotFound
OnBeforeDocFormSave
— Создать в администрационной части в разделе «Сниппеты» новый сниппет YAMS.
Описание: Yet Another Multilingual Solution Snippet
Код сниппета:
<?php
require ( $modx->config['base_path'] . 'assets/modules/yams/yams.snippet.inc.php' );
?>
После перезагрузить страницу, чтобы модуль заработал.
Настройка ManagerManager:
Независимо от того, что используется, в файле с правилами или чанке с правилами в конце надо прописать:
require ( $modx->config['base_path'] . 'assets/modules/yams/yams.mm_rules.inc.php' );
Собственно, YAMS готов к работе.
В «Инструментах» > «Конфигурации» включить Дружественные URL, разрешить вложенные URL, также использовать в связке с предыдущим параметром повторяющиеся псевдонимы, тогда путь до документа в адресной строке будет выглядеть:
site.com/en/catalogue/home-video
site.com/ru/catalogue/home-video
Настройка:
Во вкладке «Модули» > «YAMS» лежат все настройки.
Настройка языков:

Собственно, исчерпывающая страница, на которой показаны языки и как их добавлять. Теги, названия для отображения в самом же языке, в других языка, выбор письма справа налево или наоборот, теги (нужны для вызовов сниппета YAMS, обозначение, группы), системное название языка, имя сервера система подставляет автоматически. Set Default — поставить язык по умолчанию, чтобы с него открывался сайт.
Дальше идёт настройка сервера, после того, как созданы все необходимые языки, YAMS создаёт правила, которые надо вписать в .htaccess, чтобы правильно работали пути и редиректы.
Это находится на следующей вкладке:

Всё содержимое из этой вкладки просто скопировать в .htaccess
Другие настройки:

Эта вкладка содержит множество настроек будущего сайта. Такие, как типы редиректов, находится ли сайт в поддиректории или в корневой папке, разбивать ли языки при редактировании документов на табы, либо пускать списком на одной странице. По умолчанию сейчас стоит разбивка на табы, это и удобней, редиректы выставлены тоже по умолчанию нормально.
Последняя вкладка: Multilingual Templates
Нужна для того, чтобы YAMS перекраивал панель редактирования под многоязычный сайт.
YAMS заменяет стандартные поля Pagetitle, Longtitle, Content итд TV-параметрами с окончанием _ru, _en итд, то бишь, чтобы Pagetitle страницы был привязан именно к языку и полное название TV-параметра тогда выглядит pagetitle_ru.
Как только создаётся новый шаблон, во вкладке Multilingual Templates надо ему присвоить статус многоязычного.
Также можно создавать новые TV-параметры с нужным окончанием, они автоматически будут переноситься в соответствующий таб языков.
Не рекомендуется, даже больше, нельзя убирать поле Internal Name, оно нужно для отображения названия документа в дереве слева.
Создание шаблона:
Стандартный шаблон без дополнительных вызовов других сниппетов. YAMS автоматически определяет такие поля, как [*pagetitle*], [*longtitle*], [*content*]. То есть, достаточно вставить их в шаблон, сделать во вкладке Multilingual Templates шаблон многоязычным и при редактировании документа заполнить эти поля для каждого языка, при переключении языков на сайте, они будут меняться.
Механизм переключения языков:
Создаётся, например, чанк Languages, ставится в нужном месте в шаблоне и в чанк записывается:
[[YAMS? &get=`repeat` &repeattpl=`lang_tpl` ¤ttpl=`current_lang_tpl`]]
&repeattpl=`lang_tpl` — шаблон кнопки языка
¤ttpl=`current_lang_tpl` — шаблон кнопки текущего языка
Шаблон lang_tpl выглядит, например, вот так:
<a href="(yams_docr)">(yams_name)</a>
(yams_docr) — ссылка, сгенерированная до текущей страницы в этом или остальных языках
(yams_name) — имя языка, вписанное в табе Модули > Yams > Language Settings
¤ttpl — шаблон выбранного языка. Тоже самое, только можно добавить class="selected", ну, или что по вкусу, чтобы язык был виден, как текущий.
Точно таким же образом можно подставить и флажки вместо текста.
Wayfinder и YAMS
Вызов Wayfinder— a:
[[Wayfinder? &startId=`0` &useWeblinkUrl=`true` &rowTpl=`menu_tpl`]]
YAMS-у требуется, чтобы параметр &useWeblinkUrl был включён.
Чтобы Wayfinder правильно генерировал ссылки, всё в шаблоне работает через сниппет YAMS.
Шаблон одной кнопки — menu_tpl:
<li[+wf.id+][+wf.classes+]><a href="(yams_doc:[+wf.docid+])" [+wf.attributes+]>[[YAMS? &get=`content` &docid=`[+wf.docid+]` &from=`pagetitle`]]</a>[+wf.wrapper+]</li>
Ditto и YAMS:
С Ditto обстоит намного сложней, но без него никуда.
К вызову Ditto нужно подключать расширение:
&extenders=`@FILE assets/modules/yams/yams.extender.inc.php`
Если вызов некэшируемый [!Ditto!], то в параметрах вызова надо указывать id и язык:
&id=`(yams_id)` &language=`(yams_mname)`
А в шаблоне плейсхолдеры указываются тогда так:
[+(yams_id)_pagetitle+].
Если вызов кэшируемый [[Ditto]], то автор предлагает поместить в каждый язык по вызову Ditto, также в вызове прописать &id=`id` &language=`имя языка`.
И третий способ по пути наименьшего сопротивления, расширение подключать не нужно, в вызове Ditto чанк с шаблоном имеет окончание соответствующее языку:
[[Ditto? &tpl=`news_(yams_id)`]]
Существует два чанка news_ru, news_en. В зависимости от того, какой язык текущий, параметр (yams_id) подменяется обозначением языка.
А в самих чанках:
<h1>[+introtext_ru+]</h1><p>[+content_ru+]</p>
Это прямой вызов TV-параметров, заменивших встроенные поля.
Неудобен этот способ тем, что нужно создавать большое количество чанков, но работает без осечек, с некоторыми сниппетами, например, eForm-ом иначе и не получится.
Это общая информация, не вдаваясь в мелкие детали, чтобы собрать мультиязычный сайт её вполне достаточно.
Сначала пришлось набить шишек и довольно много с ним помучиться, тем более, что версии постарше не работали так, как нужно, но после нескольких осечек, уже проще разобраться, как работает YAMS и использовать его совершенно не проблематично.
26апреля,
2010
Вроде как намечается просвет в этом беспробудном ужасе работы, когда даже и часок не выделить на запись в блог, потому что, как он освободился, я уже сплю мордой в клавиатуру.
Пару полезных вещей я тупо просрал, не успел написать, они уже, если порыться в поисковиках, есть давно.
Но кое-что ещё осталось, напишу пачку полезных вещей по ModX-у, потому что давно собирался.
А так, просто нарезка из последнего:
