+1.17
Рейтинг
2.00
Сила

Николай

у вас там даже валидация по почте не работает.
Да, с валидацией действительно баг был. В синхронном режиме все ОК было, а тут пока в обычном работает, и не углядел.
Спасибо за подсказку!
Она очень нужна в каталоге в виде модуля, а не в комментариях/топиках/холиварах с поучительным тоном.
Добавил еще 4-го числа, но до сих пор на премодерации.
В общем, на все комменты, что прозвучали здесь в мой адрес (вопросы, сомнения, обвинения и т.п.), вот мой ответ: community.modx-cms.ru/
Сообщество MODX теперь официально перешло на MODX Revolution + Livestreet. Связка выполнена мной с использованием модуля modLivestreet.
Для те кто поспокойней: данное решение очень заинтересовало одного из разработчиков MODX — Райана Треша. Так что кто бы тут что ни говорил, решение интересное и развитие у него будет. И я искренне надеюсь, что это решение добавит популярности и Livstreet-у, так как это бы дало толчок для его развития. А значит и modLivestreet будет становиться интересней.
А для ярых защитников Livestreet и противников всего остального: считайте это вызовом. Очень скоро вы заметите, насколько сайт сообщества MODX будет более продвинутый, чем ваш. Вы пока даже не представляете какие возможности дает MODX, но скоро вы будете с завистью смотреть и только негодовать «А почему у нас тут даже групп пользователей нету...»
Нет, просто вероятней всего я достаточно хорошо уже разобрался и в LS, и в MODX. И могу аргументированно много в чем поспорить на счет LS. А ты сможешь со мной поспорить на счет MODX? Скорее всего нет, потому что не знаешь этого движка.
Просто попробуйте поставить MODX и попробовать что-нибудь на нем напрограммировать. Вам так многое будет не понятно, так как парадигмы разработки вообще разные. Те, кто программирует и на Livestreet, и на MODX, понимают меня.
Эх, давно не холиварили! :) ну, поехали!
Не вопрос.
Сниппет — это PHP-код. А что такое PHP-код в шаблоне, если не логика?
Зайдите сюда: livestreet.ru/blog/
Там есть маленькое меню
Интересные
Новые +5
Обсуждаемые
TOP
Вот в шаблоне на это маленькое меню есть небольшой код в шаблоне:
{if $sMenuItemSelect=='index'}
	<ul class="nav nav-pills mb-30">
		<li {if $sMenuSubItemSelect=='good'}class="active"{/if}><a href="{cfg name='path.root.web'}/">{$aLang.blog_menu_all_good}</a></li>
		<li {if $sMenuSubItemSelect=='new'}class="active"{/if}>
			<a href="{router page='index'}newall/" title="{$aLang.blog_menu_top_period_all}">{$aLang.blog_menu_all_new}</a>
			{if $iCountTopicsNew>0}<a href="{router page='index'}new/" class="new" title="{$aLang.blog_menu_top_period_24h}">+{$iCountTopicsNew}</a>{/if}
		</li>
		<li {if $sMenuSubItemSelect=='discussed'}class="active"{/if}><a href="{router page='index'}discussed/">{$aLang.blog_menu_all_discussed}</a></li>
		<li {if $sMenuSubItemSelect=='top'}class="active"{/if}><a href="{router page='index'}top/">{$aLang.blog_menu_all_top}</a></li>
		{hook run='menu_blog_index_item'}
	</ul>
{/if}

{if $sMenuItemSelect=='blog'}
	<ul class="nav nav-pills mb-30">
		<li {if $sMenuSubItemSelect=='good'}class="active"{/if}><a href="{$sMenuSubBlogUrl}">{$aLang.blog_menu_collective_good}</a></li>
		<li {if $sMenuSubItemSelect=='new'}class="active"{/if}>
			<a href="{$sMenuSubBlogUrl}newall/" title="{$aLang.blog_menu_top_period_all}">{$aLang.blog_menu_collective_new}</a>
			{if $iCountTopicsBlogNew>0} <a href="{$sMenuSubBlogUrl}new/" class="new" title="{$aLang.blog_menu_top_period_24h}">+{$iCountTopicsBlogNew}</a>{/if}
		</li>
		<li {if $sMenuSubItemSelect=='discussed'}class="active"{/if}><a href="{$sMenuSubBlogUrl}discussed/">{$aLang.blog_menu_collective_discussed}</a></li>
		<li {if $sMenuSubItemSelect=='top'}class="active"{/if}><a href="{$sMenuSubBlogUrl}top/">{$aLang.blog_menu_collective_top}</a></li>
		{hook run='menu_blog_blog_item'}
	</ul>
{/if}

{if $sMenuItemSelect=='log'}
	<ul class="nav nav-pills mb-30">
		<li {if $sMenuSubItemSelect=='good'}class="active"{/if}><a href="{router page='personal_blog'}">{$aLang.blog_menu_personal_good}</a></li>
		<li {if $sMenuSubItemSelect=='new'}class="active"{/if}>
			<a href="{router page='personal_blog'}newall/" title="{$aLang.blog_menu_top_period_all}">{$aLang.blog_menu_personal_new}</a>
			{if $iCountTopicsPersonalNew>0}<a href="{router page='personal_blog'}new/" class="new" title="{$aLang.blog_menu_top_period_24h}">+{$iCountTopicsPersonalNew}</a>{/if}
		</li>
		<li {if $sMenuSubItemSelect=='discussed'}class="active"{/if}><a href="{router page='personal_blog'}discussed/">{$aLang.blog_menu_personal_discussed}</a></li>
		<li {if $sMenuSubItemSelect=='top'}class="active"{/if}><a href="{router page='personal_blog'}top/">{$aLang.blog_menu_personal_top}</a></li>
		{hook run='menu_blog_log_item'}
	</ul>
{/if}

{if $sPeriodSelectCurrent}
	<ul class="nav nav-pills nav-pills-dropdown mb-30">
		<li {if $sPeriodSelectCurrent=='1'}class="active"{/if}><a href="{$sPeriodSelectRoot}?period=1">{$aLang.blog_menu_top_period_24h}</a></li>
		<li {if $sPeriodSelectCurrent=='7'}class="active"{/if}><a href="{$sPeriodSelectRoot}?period=7">{$aLang.blog_menu_top_period_7d}</a></li>
		<li {if $sPeriodSelectCurrent=='30'}class="active"{/if}><a href="{$sPeriodSelectRoot}?period=30">{$aLang.blog_menu_top_period_30d}</a></li>
		<li {if $sPeriodSelectCurrent=='all'}class="active"{/if}><a href="{$sPeriodSelectRoot}?period=all">{$aLang.blog_menu_top_period_all}</a></li>
	</ul>
{/if}


Попробуйте дернуть этот шаблончик-меню себе в на другую страничку и немного подправить лигику.

В MODX там, где мне надо свое меню, я вставляю [[Wayfinder]]. Это все. Но это огорменный объект, который позволяет сделать какие угодно меню. Зайдите на http://modx.com/, вот какие менюшки найдете, в том числе и большое главное, все сделано на Wayfinder, и я вам гарантирую, что ни единая частица этого сниппета не была изменена, а все переоформляется через параметры.
Нет, это, скорее, типа директивы {include}, которая включает код из другого шаблона, который может включать в себя коды из других шаблонов и т.д.
Нет, это не одно и тоже. 1. Когда вы подгружаете include, вы подгружаете именно файл-шаблон, в котором будет HTML, и если вы захотите реализовать какую-то логику, то надо будет использовать API Smarty, и если надо выполнить хоть какие-то мелкие функции, их надо будет резервировать для Смарти. В MODX же вызывая сниппет, я вызываю чистый PHP.
2. Не все работаю со Смарти, им API Смарти может вообще не надо. В MODX можно вести разработку как со Смарти, так и без него.
Ну я же говорил, что Вы еще не достаточно хорошо знаете ЛС. При регистрации хука можно задавать приоритет для него и таким образом управлять очередностью. А админка, кстати, еще и приоритеты самих плагинов поддерживает.
Это глобально, а локально? Где мне в одном месте посмотреть какие хуки и в какой очередности будут вызваны именно в этом месте?
Сколько из в ЛС, я точно не знаю, но явно дофига — инициализация каждого экшена, начало и завершение вызова любого метода любого модуля и т.д., и т.п. — это все хуки, на которые можно цеплять методы своих плагинов, задавая приоритет вызова хуков. И, кстати, точно так же подгрузка классов плагина происходит по мере необходимости — грузятся только те, которые нужны.
Сколько из в ЛС, я точно не знаю, но явно дофига — инициализация каждого экшена, начало и завершение вызова любого метода любого модуля и т.д., и т.п. — это все хуки, на которые можно цеплять методы своих плагинов, задавая приоритет вызова хуков.
В классе ActionSettings 9 хуков. При этом взять даже этот кусочек
$this->Hook_Run('settings_tuning_save_before', array('oUser'=>$this->oUserCurrent));
if ($this->User_Update($this->oUserCurrent)) {
    $this->Message_AddNoticeSingle($this->Lang_Get('settings_tuning_submit_ok'));
    $this->Hook_Run('settings_tuning_save_after', array('oUser'=>$this->oUserCurrent));
} else {
    $this->Message_AddErrorSingle($this->Lang_Get('system_error'));
}
Да, хук выполняется. Ну а толку? Тут даже нет проверки каков результат выполнения хука. А стоит ли вообще дальше продолжать выполнение кода?
Единственный обработчик ошибок (пример), это
$this->Message_AddError($this->Lang_Get('settings_invite_available_no'),$this->Lang_Get('error'));
$bError=true;
Что он нам дает? Локальный флаг $bError = true, что ошибка в принципе есть, и сохранение ошибки $this->Message_AddError.
Это даже не $this->bError. А знаете почему $this->bError бессмысленно? Потому что в Livestreet все — $this.
Вот как выполняется логика в MODX:
$response = $modx->runProcessor($processorPath, $params);
if($response->isError()){
	return $response->getMessage();
}
$object = $response->getObject();
$message = $response->getMessage();
При этом процессор может вызывать другой процессор, а тот другой и так далее, но на выходе я все равно получу результат ->isError() и ошибку ->getMessage() независимо от того, в каком процессоре произошла ошибка.
В общем, я повторюсь, что в плане блого-движка со своей законченной логикой Livestreet — вполне достойный. Но в плане функциональных возможностей у него много ограничений, и хотя многое на нем можно сделать, это делается с лишними неоправданными сложностями. Это мы еще не коснулись политик доступов и т.п. Чтобы понять, что я имею ввиду, почитайте здесь: community.modx-cms.ru/blog/documentation/8918.html

Пока я так этого и не увидел. Много слов, зачем Модексу нужен ЛС, но зачем проекту на ЛС нужен Модекс — не вижу.
Результат вы очень скоро увидите. Маякну.

Кроме всего прочего — любой запрос страницы будет обрабатываться аж двумя движками. Вряд ли веб-серверу это будет полезно.
Рост нагрузки не очень большой. К тому же планируется более тесная интеграция (хочу выдернуть только самое важное из Livestreet и оформить конечную сборку MODX+Livestreet, и там нагрузка будет значительно меньше).

На сегодня холивары закончу, так как очень занят сейчас, но если надо будет, продолжу завтра.
Как минимум тем, что это нативно работает, а не
Одназначно за то что бы было нативно в livestreet'е, т.к админка будет не у всех, а делать проверки на наличие админки от костыльности не избавляет.
.
Плюс к этому, в плагин передается не только контент (как в данном решении), но и другие важные данные, которые могут понадобиться плагину.
Есть еще куча плюсов, которые сейчас мне бессмысленно объяснять, так как у вас сейчас позиция, которая мешает вашему восприятию полезной информации.
beauty_free все правильно заметил насчет ручной настройки.
Читайте коммент выше. пункт 2. Там написано, что можно не только руками делать.

Лайвстрит же идет в сторону более законченного коробочного продукта. Я не представляю как можно, например, покупателей плагинов просить «а вот тут вот в шаблончике вставьте сниппет/чанк новый инклуд/хук».
Если вам лень читать надоевшие топики и вникать, вы хоть видео посмотрите здесь: livestreet.ru/blog/13035.html
Там весь Livestreet со всеми плюшками, в том числе и для MODX ставится в пару кликов, и не требует вообще ни одной настройки от пользователя, разве что для главной страницы MODX указать из списка другой шаблон. Это я вам скажу, куда более гораздо ближе к коробочности, чем что-либо, так как при установке в пакете можно обратиться к API MODX и проверить наличие всего, что только можно, и изменить/создать/удалить/настроить все что хочешь. Так что те, кто ставят мой модуль, вообще ничего лишнего не делают, но получают сразу полностью интегрированный продукт.

Она очень нужна в каталоге в виде модуля, а не в комментариях/топиках/холиварах с поучительным тоном.
Я уже модуль залил на livestreetcms.com, просто еще проходит модерацию, хотя очень сомневаюсь, что пройдет.
А на счет холиваров и надоевших топиков: много делается, потому и много пишется. И мне нужен фидбек, и я его получаю. А холивары — извините. Вы предпочли бы, чтобы все восхваляли «О какой Livestreet классный и законченный! Его не надо больше развивать, не вздумайте! Он уже просто суперсовершенный и все остальное — от лукавого!»? А как же развитие? Я не думаю, что я предлагаю что-то не конструктивное. А извините, развиваться Livestreet-у еще есть куда. Обратите внимание на разницу жалоб тех, кто только жалуется, и тех, кто решает возникающие сложности и говорит, как надо, чтобы было лучше. Я не новичок, который для себя вчера открыл тайны HTML, и знаю что говорю. Это еще не холивары. Холивары начались бы тогда, когда я стал бы выражать все свое мнение по поводу того, что livestreet.ru и livestreetcms.com — это два разных движка и две разные базы данных, что мне пришлось там сегодня повторно регистрироваться, и что там нет ни моего имени, ни моей фотографии, ни моей кармы, ничего вообще! Вот это повод для холиваров, вот это эмоции и мое личное отношение.
А то что я пишу — это сухое программирование.
Уточняю. Есть разные вариант:
1. Это вставить свой чанк, сниппет или другой MODX-объект в шаблон, и он будет выполнен MODX-парсером конкретно в этом месте. Это локальный метод, и если это действие выполняется на стороннем шаблоне, то да, с ками согласен — не кашерно это.
2. Но есть более глобальный способ — то есть выполнение своего плагина по системному событию. То есть даже если взять пример из сабжа, то в MODX мне со своим плагином не пришлось бы ждать вызова хука из шаблона (тем более что шаблон мог бы быть замененным или измененным, и этого хука там вообще могло уже не быть прописано, а значит и хук не будет вызван). Я бы создал свой сторонний плагин, и навесил бы его на событие OnWebPagePrerender.
В момент парсинга страницы MODX-парсером, он вызвал бы по этому событию мой плагин, а я бы в плагине смог бы получить весь скомпелированный контент страницы $modx->resource->_output, и выполнить с ним все нужные мне манипуляции, в том числе обработку отдельных HTML-элементов.
Там же я мог бы прописать кеширование через $modx->cacheManager->set()/get(), и снизить нагрузку, если надо. То есть я бы выполнил все нужные мне манипуляции со всем контентом текущей страницы, и не вклинивался бы в логику конкретно индивидуального сайта. При этом гарантированно работало бы независимо от того, если какой-то нужный плагин, или нет, так как это все нативный функционал.
Автору респект за реализацию. С точки зрения реализации — качественный продукт.
Но за весь дальнейший свой текст извиняюсь сразу, так как возможно для кого-то он покажется оскорбительным, ибо буду критиковать Livestreet…
Почему вообще требуются подобные хаки, чтобы хоть как-то вклиниться в логику? Зачем вообще было так сильно логику вшивать в шаблоны со всеми его IF-ами, ELSE-ми, include-ами и т.п. Это просто ппц.
Мне вот в MODX никогда в голову не приходило, что могут понадобиться такие хаки.
В MODX есть сущности:
— Сниппет — Блок PHP-кода
— Чанк — Блок HTML-кода
Если мне в шаблоне где-то надо вставить просто сторонний HTML-блок, я в шаблоне воткну [[$chunk]]. Если мне надо вставить логику, то я вставлю сниппет [[Snippet]], и отделю логику от шаблонизации, так как в сниппете будет чистый PHP, но если мне понадобится вывод оформить в HTML-шаблон, я внутри сниппета получу чанк и наполню его данными.
При этом сниппеты можно вкладывать в чанки и другие сниппеты, а чанки в другие чанки и сниппеты. Это как раз типа ваших хуков, но не надо и прописывать в нескольких местах. А то у вас потом получается, что за каждой строчкой в шаблоне приходится думать «а не вставить ли тут на всякий случай еще один хук, а то вдруг какому-нибудь разработчику здесь надо будет выполнить свой хук?».
Да и где управление очередностью вызовов хуков? Какой плагин вперед инициализировался, того и тапки? А что, если в одном шаблоне надо, чтобы сначала вызвался хук первого плагина, а потом второго, а в другом случае наоборот?
Это первый момент, локальный.
Второй момент, глобальный: кеширование. Вот у вас все выполняется в момент компиляции шаблона, то есть тупо шаблон конечный набивает (данный вопрос конкретно к автору, но коммент не персональный, а общественный, так как конкретно к автору никаких претензий). А если надо управлять кешированием? В MODX я просто ставлю восклицательный знак, что говорит о том, что элемент не кешируется, и каждый раз по новой выполняется, даже если весь документ закеширован. То есть ставлю [[!snippet]] и все.
Третий момент. Эти оба примера — локальные действия внутри конкретной точки шаблона. А если нужно выполнить какое-то действие глобально над всем документом, или до определения документа (чтобы можно было осуществить подмену, или в момент генерации документа, или после его генерации и т.д.)?
В MODX нативно зарезервировано 168 системных событий (плюс сколько угодно можно своих зарезервировать), на каждое из которых можно навесить свой плагин и определить последовательность вывода наряду с другими плагинами. При этом не надо на все случаи жизни инициализировать весь плагин со всеми его конфигами, классами и т.п. В нужный момент инициализируется и выполнится только та часть плагина, которая нужна.
В итоге получается полная управляемость всем проектом.
В общем, чем больше я узнаю Livestreet, тем больше убеждаюсь, что интеграция с MODX — ему очень даже нужна, так как он получает много того, чего там скорее всего вообще никогда не появится в силу особенностей движка.
И поверьте мне, что я знаю о чем говорю, так как знаю Livestreet уже очень неплохо, но все равно большинство проблем, с которыми сталкиваюсь, с легкостью решаю именно с помощью MODX-а.
Ну а логику добавить, это же не проблема.
Вот тут как раз и вопрос. Как быстро вы добавите логику Livestreet-а? :-)
Нет, он не натянет (в плане логики), но он превратит его в базовый шаблон, который можно будет использовать для оформления своего сайта.
Так нет, я лично совсем не против, чтобы эта замечательная фича была в MODX, но ведь одно другому не мешает. Пусть будут стандарты для каких-то узкопрофильных вещей, и пусть будет возможность вставлять любые шаблоны для своих индивидуальных сайтов.
С Друпал не работал, но слышал, что там нет такой системы пакетов, какв MODX, которая довольно хорошо развита.
А с Джумлой пару раз сталкивался, и мне там все не нравится. Особенно на нее жалуются, что стоит обновить версию, и с большой долей вероятности сайт разваливается.
Но в любом случае, ИМХО — каждый выбирает для себя то, что ему нравится, и многое зависит от того, как он использует свой инструментарий. Тот, кто работает с Джумлой, если он ее очень хорошо знает, легко может напрограммировать более качественный сайт, чем средненький программист на MODX.
Но я могу сказать, что MODX выставляет очень серьезные требования к разработчикам, потому если программист слабоват, и плохо разбирается в MODX Revolution, то скорее всего можно будет долго плеваться от того, что он натворит с ним.
Я вот Bitrix в принципе неплохо знаю, и в нем единтсвенное что мне нравится — это как реализовано управление модулями через frontEnd, но все остальное в нем — просто жесть. Принципиально не принимаю заказов по Bitrix, так как считаю, что он держится только за счет отличных маркетологов 1С и популярности самой компании.
И именно поэтому я и прикрутил к нему Livestreet, так как считаю это минусом MODX-а. Простой сайт не развернешь за 5 минут.
Я считаю, что плюс к его мощному API все-таки должны быть готовые решения.
Livestreet для меня в связке с MODX — не только готовое решение, но и стандарт в своем узком профиле. MODX позволит сделать все тоже самое, но тебе придется полностью продумывать все сущности и продумывать связь между ними, в том числе и стандарты оформления, чтобы легко было использовать на разных страницах.
А стандарты — залог того, что верстальщик сверстает тебе такой шаблон, который гладко ляжет на уже имеющийся сайт. При этом разработчик новый компонент напишет так, чтобы он не конфликтовал с имеющейся системой.
И спорить не буду. Но над шаблонизацией поработать надо, так как это усложняет кастомизацию нативных шаблонов.
Многие поспорят, что это шаблоны по умолчанию, что мол свой шаблон лепи и будет тебе счастье.
На WordPress в день появляется 100 000 новых сайтов, и 99,9% из них, наверняка с нативными шаблонами. Потому считаю, что нативными шаблонами пренебрегать не стоит.
ага, некоторые даже как CMF его позиционируют…
Вот я об этом и говорю. И наверняка это приходится часто делать для каждого отдельного «одного проекта».
Но ведь лучше бы было, если бы это было уже нативно. Ведь тут даже ничего почти не поменяется, как подгружали все header.tpl, так и будут, то есть даже при смене шаблона на старых проектах ничего не поломается.
В этом плане ничего не поменялось, и все работает так, как и работало в Livestreet. Нет, после того, как вы подправили какой-то CSS-файл, который собирается Livestreet-ом в единый файл-кеш, то конечно же этот кеш надо очищать. Но я добавлю функцию очистки кеша Livestreet-шаблона прямо в админку MODX, на подобии того, как сейчас реализована очистка кеша самого MODX-а.
Как раз выложил новую сборку 0.5.2, которая внесет в себе пользовательский шаблон с демонстрацией как и что можно делать.
Более чем уверен, что сейчас можно сделать очень много чего.