TOP комментариев

+8
Я уже говорил, но скажу ещё раз. Делать сайт CMS(F) MODX на CMS LiveStreet это маразм. Одумайтесь :)
avatar

Andchir

  • 22 мая 2012, 23:17
+6
Я ещё понимаю когда Carw был один, но когда набрали команду программистов… И дизайн должен быть в стиле MODX. Это просто пожелания.
avatar

Andchir

  • 22 мая 2012, 23:20
+5
старые проекты делал на evo, теперь все новые начинания только на revo
PS ответил Revo
avatar

botik87

  • 20 мая 2012, 16:19
+5
Жесть, что же за батхерт надо словить, чтобы в теме про шкурку для админки, причем симпатичную шкурку надо обязательно развести тонны холивара на тему REVO/EVO.

Надо уже начать баны на день раздавать за разжигание. А то как на дроме развелось народу который приходил в любую тему и начинает «субару ниедет» и понеслась.
avatar

pitbull

  • 19 мая 2012, 14:05
+4
Andchir, а у кого для поддержки Шопкипера стоит форум? ;-)

На самом деле я вообще только за, но если объективно оценивать силы и задачи, то надо понимать, что это огромные ресурсы, которые еще и не обязательно себя оправдают. В основном когда я с кем-то беседую на эту тему и говорю, что неплохо бы на MODX сделать, например, порт LS или отдельное решение/набор решений, то особо интереса не вижу. А ради чего тогда этим заниматься?

Чаще мне говорят, что инструмент должен быть под задачу. Может со временем созреем? :-)
avatar

Carw

  • 23 мая 2012, 00:19
+4
Прикольно!

У меня народ во дворе на Девятки и Калины тоже лепит значки Mercedes или буковки GT.
avatar

bezumkin

  • 18 мая 2012, 14:04
+3
за старания — плюс; что касается дизайна — вот первые наброски
avatar

ShCoder

  • 24 мая 2012, 15:14
+3
снипет REFERER
if(isset($_SERVER['HTTP_REFERER'])) return $_SERVER['HTTP_REFERER'];
$idurl = !empty(intval($input)) ? $input : $modx->getOption('site_start');
return $modx->makeUrl($idurl);

вызов
[[!REFERER]]
по умолчанию, если юзер зашол на страницу введя урл ресурса, то соответствено реферер не будет, тогда линк кнопки назад будет на стартовую страницу.
Параметры — input
вы можете указать id ресурса куда нужно линковать при отсутствии реферер, к примеру:
Парент ресурс:
[[!REFERER? &input=`[[*parent]]`]]
//альтернатива через фильтр
[[*parent:REFERER]]

и.т.д.
avatar

valikras

  • 23 мая 2012, 02:15
+3
как это кеширует но без файла?
у меня в проекте пользователи торгуют своим товаром и подгружают его фотки многопиксельные, после загрузки я обжимаю их до максимального размера фуллхд монитора 1920 *1080 потому что есть уникумы грузящие 10 мегабайтнай 5 на 3 тыщ пх. из обжатого изображения я сразу создаю миниатюрки для разных целей, на деле кеш спасает от чрезмерной нагрузки на процессор не занимает память, да и оптимизировать его можно

генерировать на лету ой какая плохая идея
avatar

adminko

  • 22 мая 2012, 11:17
+3
Эх, блин, круть-крутецкая…
Я хоть и начинаю потихоньку Рево внедрять, но за Эво всеми руками и ногами… Незаслуженно забытая разрабами система.
Перечисленные здесь «фишки» никоим образом не претендуют на сранение со «старшим братом», но ОЧЕНЬ облегчают разработку… Спасибо за инфу. Буду следить.
avatar

autogen

  • 20 мая 2012, 17:08
+3

// modx_ja
$_lang["day_names"] = 'Вс,Пн,Вт,Ср,Чт,Пт,Сб';
$_lang["month_names"] = 'Янв,Фев,Мар,Апр,Мая,Июн,Июл,Авг,Сен,Окт,Ноя,Дек';
$_lang["tree_page_click_option_auto"] = 'Автоматически';
$_lang["too_many_resources"] = 'Скрыто, тут очень много ресурсов';
$_lang['setting_resource_tree_node_name'] = 'Имя ресурса в дереве документов';
$_lang['setting_resource_tree_node_name_desc'] = 'Укажите поле документа, из которого выводить информацию в дерево ресурсов. По умолчанию pagetilte, можно использовать другое поле к примеру menutitle.';
$_lang['setting_cache_type'] = 'Режим кеширования';
$_lang['setting_cache_type_desc'] = 'Выбор "Без Кеша" отключит все кеширование. Не рекомендуется';
$_lang['duplicate_title_string'] = '[+title+] копия';
$_lang["confirm_delete_category"] = 'Удалить эту категорию?';
$_lang["site_url_title"] = 'URL сайта';
$_lang["site_url_message"] = 'Пример: <b>' . MODX_SITE_URL . '</b><br />Если оставить пустым, заполнится автоматически (динамически дополняется http/https и т.д.)';
$_lang["chunk_opt_published"] = 'Опубликован';
$_lang["delete_category"] = 'Вы уверены, что хотите удалить эту категорию?';

// bkmanager.static.php
$_lang["bkmgr_alert_mkdir"] = 'Фаил не может быть создан.  Праверьте права на папку ' . $modx->config['snapshot_path'];
$_lang["bkmgr_restore_msg"] = '<p>Сайт может быть восстановление с помощью файла SQL. </p>';
$_lang["bkmgr_restore_title"] = 'Восстановить';
$_lang["bkmgr_import_ok"] = 'SQL восстановление было выполнено нормально.';
$_lang["bkmgr_snapshot_ok"] = 'Бекап был сохранен.';
$_lang["bkmgr_run_sql_file_label"] = 'Выполнить SQL файл';
$_lang["bkmgr_run_sql_direct_label"] = 'Выполнить произвольную комманду SQL';
$_lang["bkmgr_run_sql_submit"] = 'Отправить';
$_lang["bkmgr_run_sql_result"] = 'Результат';
$_lang["bkmgr_snapshot_title"] = 'Резервное копирование';
$_lang["bkmgr_snapshot_msg"] = '<p>Содержимое базы данных сохраняются и восстанавливаются на сервер.<br />Путь для бекапов : [+snapshot_path+] ($modx->config[\'snapshot_path\'])</p>';
$_lang["bkmgr_snapshot_submit"] = 'Создать бекап';
$_lang["bkmgr_snapshot_list_title"] = 'Список бекапов';
$_lang["bkmgr_restore_submit"] = 'Восстановить эти данные';
$_lang["bkmgr_snapshot_nothing"] = 'Нет бекапов';
$_lang["settings_friendlyurls_alert"] = 'Необходимо переименовать файл sample.htaccess в каталоге установки MODX на .htaccess для использования дружественных URL.';
$_lang["settings_friendlyurls_alert2"] = 'необходимо обновить файл .htaccess. ';

$_lang["configcheck_rb_base_dir"] = 'Неправильный путь к папке сайта.';
$_lang["configcheck_filemanager_path"] = 'неправильный путь к файлам.';

$_lang["document_data.static.php1"] = 'Переместить отмеченные ресурсы';
$_lang["export_site.static.php1"] = 'Цель';
$_lang["export_site.static.php2"] = 'Только выбранные ресурсы';
$_lang["export_site.static.php3"] = 'Все ресурсы';
$_lang["export_site.static.php4"] = 'Заменить строку (до)';
$_lang["export_site.static.php5"] = 'Заменить строку (после)';
$_lang["export_site.static.php6"] = 'Цель';
$_lang["export_site.static.php7"] = 'Нельзя переместить файлы в ' . $modx->config['base_url'] . $modx->config['rb_base_url'];
$_lang["files.dynamic.php1"] = 'Создать текстовый файл';
$_lang["files.dynamic.php2"] = 'Этот каталог не может быть отображен.';
$_lang["files.dynamic.php3"] = 'Ошибка в имени файла.';
$_lang["files.dynamic.php4"] = 'Текстовый файл был создан.';
$_lang["import_site.static.php1"] = 'Обновить дерево ресурсов';
$_lang["import_site.static.php2"] = 'Обновить дерево ресурсов, IDs are initialized.';
$_lang["import_site.static.php3"] = 'Цель';
$_lang["import_site.static.php4"] = 'только <body></body>';
$_lang["import_site.static.php5"] = 'Файл содержит все';
$_lang["mutate_content.dynamic.php1"] = 'pub_date и unpub_date обнулены.';
$_lang["mutate_htmlsnippet.dynamic.php1"] = 'pub_date и unpub_date обнулены.';
$_lang["mutate_settings.dynamic.php1"] = 'Стандартный';
$_lang["mutate_settings.dynamic.php2"] = 'Продвинутый режим';
$_lang["mutate_settings.dynamic.php3"] = 'Кеш отключен';
$_lang["mutate_settings.dynamic.php4"] = 'Индивидуальные настройки';
$_lang["mutate_settings.dynamic.php5"] = 'Префикс может не добавляться, если в псевдониме будет использована "." (точка).';
$_lang["mutate_settings.dynamic.php6"] = 'email для уведомления про системные ошибки.';
$_lang["mutate_settings.dynamic.php7"] = 'Не уведомлять';
$_lang["mutate_settings.dynamic.php8"] = 'Отправка уведомлений  [(emailsender)](' . $modx->config['emailsender'] . ') во время генерации ошибки. Подробный текст ошибки можно найти в системном логе событий.';
$_lang["save_user.processor.php1"] = 'Пожалуйста, выйдите из системы и войдите снова, чтобы изменения вступили в силу.';

$_lang["disabled"] = 'отключено';

$_lang["limit_by_container"] = 'Лимит для отображения документов в дереве ресурсов.';
$_lang["limit_by_container_message"] = 'Будет контролироваться, не превышает ли количество ресурсов в контейнере указанное число.<br />(пусто) - Не ограничивать<br />0 - Только контейнеры.';
$_lang["allow_mgr2web_title"]   = 'Обновить состояние пользователя';
$_lang["allow_mgr2web_message"] = 'Когда менеджер авторизуется, он будет также авторизован в качестве веб-пользователя.';

$_lang["No errors occured."] = "Ошибок не обнаружено.";
$_lang["An error occured!"] = "Обнаружена ошибка!";
$_lang["Document's ID not passed in request!"] = "ID документа не передан в запросе!";
$_lang["You don't have enough privileges for this action!"] = "У вас нет прав на выполнение этих действий!";
$_lang["ID passed in request is NaN!"] = "Переданный в запросе ID неопределен (NaN)!";
$_lang["The document is locked!"] = "Документ заблокирован!";
$_lang["Too many results returned from database!"] = "Запрос в БД вернул слишком много результатов!";
$_lang["Not enough/ no results returned from database!"] = "Запрос в БД не вернул результатов!";
$_lang["Couldn't find parent document's name!"] = "Невозможно найти имя родительского документа!";
$_lang["Logging error!"] = "Ошибка записи в лог!";
$_lang["Table to optimise not found in request!"] = "В запросе не определена таблица для оптимизации!";
$_lang["No settings found in request!"] = "В запросе не определена настройка!";
$_lang["The document must have a title!"] = "Документ должен иметь название!";
$_lang["No user selected as recipient of this message!"] = "Для этого сообщения не определен пользователь-получатель!";
$_lang["No group selected as recipient of this message!"] = "Для этого сообщения не определена группа-получатель!";
$_lang["The document was not found!"] = "Документ не найден!";
$_lang["Double action (GET & POST) posted!"] = "Двойной запрос (GET и POST)!";
$_lang["Document cannot be it's own parent!"] = "Документ не может быть собственным родителем!";
$_lang["New parent not set in request!"] = "В запросе не передан новый родитель!";
$_lang["don't know the user!" ] = "Введен неверный логин или пароль!";
$_lang["wrong password!"] = "Введен неверный логин или пароль!";
$_lang["Due to too many failed logins, you have been blocked!"] = "Вход заблокирован из-за превышения допустимого количества ошибок авторизации!";
$_lang["You are blocked and cannot log in!"] = "Вы блокированы и не можете быть авторизованы!";
$_lang["You are blocked and cannot log in! Please try again later."] = "Вы блокированы и не можете быть авторизованы! Повторите попытку позже.";
$_lang["The security code you entered didn't validate! Please try to login again!"] = "Введен неверный код подтверждения! Повторите попытку авторизации!";
avatar

alooze

  • 19 мая 2012, 23:42
+3
Тут есть маленькое уточнение: Раздел 1 и раздел 3 — это контейнеры. А раздел 2 — документ. Следовательно нужно проверять свойство — папка ли элемент или нет!

Я не поленился и нашел в уроке 3 по созданию блога Ефимова Виктора рашение этого вопроса. Процитирую оттуда кое-какие выдержи:

<div class="sidemenu">
<h3>Категории</h3>
[!Wayfinder? &startId=`1` &level=`2` &hideSubMenus=`1` &includeDocs=`SELECT id FROM modx_site_content WHERE isfolder<>0 `!] 
</div> 


Где
Переданные параметры сниппету:

&startId=`1` — указываем Id папки, в которой хранятся все категории блога. Если у вас ID этой папки другой, то впишите другое число при вызове сниппета.

&level=`2` — уровень вложенности.

&hideSubMenus=`1` — отображать вложенные документы для активного пункта.

&includeDocs=`SELECT id FROM modx_site_content WHERE isfolder<>0 `— включать в результат только документы, имеющие дочерние элементы, т.е. являющиеся категориями блога. Внимание: т.к. выборка ведется из базы данных, то убедитесь, что у таблиц в вашей базе данных префикс modx_. Если вы при установке изменили стандартный префикс на какой-нибудь другой, то необходимо вместо modx_site_content вписать имя_вашего_префикса_site_content.

При этом вызове сниппета у нас будет выводится меню, удовлетворяющее всем поставленным условиям: вывод категорий блога с уровенем вложенности 2, при этом для активного пункта отображаются его подкатегории (при их наличии).


Так что вот нормальное полное реализация! Правьте под текущую задачу.

Обратите внимание:
Внимание: т.к. выборка ведется из базы данных, то убедитесь, что у таблиц в вашей базе данных префикс modx_
avatar

jean179

  • 19 мая 2012, 20:17
+3
Потому что на данный момент MODx это и REVO и EVO

почему то многие тут решили что только они правы…

Вот не могу понять зачем в магазинах до сих пор молотки продают???
есть же превмо пистолеты которые забивают гвозди в разы быстрее:)

и так далее…

Мне нравиться EVO и я за него двум руками. буду поддерживать пока есть время и возможность…

Да в нем не все есть к примеру мультиязычность там делать очень не удобно для этого хочу использовать REVO…

Да он не настолько крут как тут описывают REVO но для 90% проектов вся эта крутость и не нужна…

Давайте уважать выбор друг друга… Все же мы одно сообщество!!!

вот@stasspb Привел аргументы указал почему выбрал REVO все супер молодец. дал задуматься а может стоит таки на REVO перейти. и что потом? начал всех кто на EVO тыкать носом… за что и схлопотал минусы…

Никого не получиться заставить изменить выбор особенно упрекая его и оскорбляя…

Вот @bezumkin хоть и так же критично высказывается по поводу EVO в чем он не прав… но также он показывает чем REVO лучше, и его статьи и решения дают повод задуматься…

Так что хватит нахваливать свою корову…
avatar

Dmi3y

  • 19 мая 2012, 13:48
+3
Просто опишу здесь свой путь новичка, может что-то полезное, что-то неправильное, извиняйте если что. После знакомства с медиавики, вп и джумлой подкупили в модэксе эта пресловутая гибкость (тм), жажда пощупать php, CMF, удобство работы с дизайном, «имидж» и при этом оказалось легче чем друпал, который оказался имхо монстром по вхождению и вообще.
Кстати если уж делать анализ конкурентов, я бы ориентировался на аудиторию загнивающего друпал. Модэкс умеет почти все при этом несоизмеримо легче и продуманнее, а друпал коммьюнити много профессиональнее джумловодов.
Как выше заметили, вменяемые уроки по Рево на modx.ws, благодарен автору сайта, немного еще разбросано по рунету, ну и англоязычные. По Ево в блоге Ефимова Виктора понравилось.
Modx-cms в этом плане слабоват и как-то все разбросано, здесь очень трудно ориентироваться новичку, хотя может разберусь со временем, главное общество приятное)).
Чтоб два раза не вставать, по статистике wappalyzer – очень интересный плагин для фф модэкс доля постоянно падает, благодаря тому, что модэкс рево не определяется плагином, надо бы добавить туда скрипт определения cms и рево, как раз новый логотипчик пригодится) хотя не знаю насколько там их статистика репрезентативна в общем.
Еще одним имхо перспективным направлением, кстати @bezumkin часто хорошо использует, была бы более тесная интеграция modx с twitter bootstrap, может замутить какой нибудь modx bootstrap. Не знаю, мне очень нравится эта система, надо бы куда-нибудь выложить наработки-чанки по интеграции с модулями типа wayfinder, карусели, календарь аккордеоны и т.п…
Присоединяюсь во всех благородных начинаниях, в общем. Желаю удачи.
avatar

govza

  • 19 мая 2012, 04:21
+3
Вот, что я вам скажу. Мне нравится REVO не меньше, чем EVO. Все нормально. Нет надобности меня в чем-то переубеждать. Холивара не будет и лишь по той причине, что этот софт бесплатный, и я говорю спасибо, всем кто разрабатывает его. Ошибки возможны.

А вот, насчет русских и Петра и бороды – самый большой косяк русских не в том, что они бороды не стрегут, или мало юзают новые технологии, а то, что они напрочь отвергают то, что было вчера, и не просто отвергают, а еще и с пафосом. У нас в Ебурге снесли здание в центре, которое «устарело», чтобы построить на его месте новое дерьмище, вот он! Русский подход. Понимаете о чем я?
avatar

dgbomb

  • 18 мая 2012, 23:46
+3
Верите я для ускорения загрузки на 0,5 секунды специально купил себе VPS так как постоянно собираю сайты и поверьте я не готов ждать 0,5 секунды.

Сейчас вот поставил REVO 2.2.2 админка действительно работает шустрее чем раньше но само собой после EVO все не привычно но к примеру для мультиязычных сайтов теперь только REVO
avatar

Dmi3y

  • 18 мая 2012, 22:14
+2
мне кажется логично было бы сделать 2 раздела — ветки evo/revo на самом верхнем уровне.
в остальном правильно конечно делать редизайн в логотипах modx, чтобы приучать к системе как к бренду.

спасибо.
avatar

manicko

  • 24 мая 2012, 14:11
+2
Спасибо. Могу поковыряться с ней, и предложить уже готовый со всеми возможными вариантами.
avatar

MAK

  • 24 мая 2012, 01:02
+2
Сделал для себя фильтрацию на основе Тэгов miniShop
Есть два вида параметров для фильтрации
1. групповые — А или Б или В (например, производители)
2. не групповые А и Б и В (например, USB порт, WiFi и т.д.)

1. Передаю через $_GET['s']
2. Передаю через $_GET['f']

Строка для запроса должна выглядеть так
http://example.com/?f=wifi,usb&s=lg,bbk,samsung~LCD,LED~32,40,42

Формируется яваскриптом автоматически
Сам код
if($_GET['f'] || $_GET['s']) {
	if (!isset($modx->miniShop) || !is_object($modx->miniShop)) {
  $modx->miniShop = $modx->getService('minishop','miniShop', $modx->getOption('core_path').'components/minishop/model/minishop/', array());
  if (!($modx->miniShop instanceof miniShop)) return '';
}

	if($_GET['f']) {
		$f = $rURI['f'];
		$idsF = $modx->miniShop->getTagged(implode(',',array_unique($f)), 1, 1);
	}

if($_GET['s']) {
	$x = explode('~', $_GET['s']);
	$arrX = array();
	foreach ($x as $v) {
		$arrX[] = $modx->miniShop->getTagged($v, 0, 1);
	}
	for ($i=0; $i < count($arrX); $i++) { 
		$arrX[$i] = count($arrX) > 1 ? array_intersect($arrX[$i], $arrX[$i + (count($arrX) > 1 ? 1 : 0)]) : $arrX[$i];
		if(count($arrX) > 1) unset($arrX[$i + (count($arrX) > 1 ? 1 : 0)]);
	}

	$idsS = $arrX[0];
}

	if(count($idsS) > 0 && count($idsF) > 0) {
		$idsF = array_intersect($idsS,$idsF);
	}
	else if (count($idsF) == 0 && !$_GET['f']) {$idsF = $idsS;}
	else if (count($idsS) == 0 && $_GET['s'] && count($idsF) > 0) {return $filter_str;}

	if (count($idsF) > 0) $f = ',"id:IN":['.implode(',',$idsF).']';
	else { return $filter_str; }
}


Выводится все это через getPage
$output = $modx->runSnippet('getPage',array(
	'elementClass' => 'modSnippet',
	'element' => 'msGetResources',
	'tpl' => tpl,
	'limit' => 10,
	'sortbyMS' => 'price',
	'sortdir' => 'asc',
	'where' => '[{"isfolder:=":0' .$f. '}]',
	'depth' => 1,
	'totalVar' => 'totalGoods',
	'pageVarKey' => 'p',
));

return $output;

Отрабатывает довольно быстро

Вот этот код выполняется за несколько запросов
f=wifi,usb&s=lg,bbk,samsung~LCD,LED~32,40,42

Получается 4 массива со значениями, которые сравниваются между собой нас схождения функцией array_intersect()

Все это один сниппет, разбил на части для наглядности
avatar

crisp

  • 23 мая 2012, 21:27