Обнаружил глюк с SSL (https), в версии 1.2.1-d9.1.0
Параметр шаблона [(site_url)] всегда выдаёт ссылку с http ане https, в настройках включил что сайт с https.
Остальные настройки на хостинге уже настроены так, что сайт по умолчанию всегда открывается с https.
.htaccess тоже настроен, не помогло.
Много глюков и неработающих плагинов (ManagerManager, CodeMirror), дерево рессурсов пустое.
Помогло жесткое прописывание в config.inc.php строк:
Было:
Добавил в комплект плагин и сниппет для работы с превьюшками. Оба называются sgThumb. В плагине нужно вручную установить события OnFileBrowserUpload, OnSimpleGalleryDelete и OnSimpleGallerySave и вписать конфигурацию в json — пример конфигурации в коде плагина.
Например, конфигурация:
Будет создавать при загрузке превьюшки размером 1140х400 и складывать их в папку slider. Jpg будет дополнительно обрабатываться с помощью jpegtran.
Можно указать несколько конфигураций:
Вместо template можно писать rid и указывать id документа — но не рекомендую, потому что обновление превьюшек не доделано для таких случаев.
Вывод будет такой:
При удалении картинок будут удаляться и превьюшки. Можно менять конфигурацию в плагине и пересоздавать их. В общем phpthumb для галерей больше не нужен.
Проблемы, как выяснилось, сразу две:
1. Сниппет star_rating любой ajax-запрос обрабатывает как запрос на голосование без всякого различия — ему это был запрос или это пришел ajax -запрос от фильтров.
2. После перегрузки куска страницы с помощью ajax не происходит переинициализации фильтра (ну и как следствие он не появляется).
Решение, соответственно, тоже состоит из двух этапов. Для решения пункта 1 необходимо определиться идет запрос ajax к фильтру или к рейтингу. Для этого:
1.1. Немного модифицируем метод ajax() класса StarRating () файл assets/snippets/star_rating/starrating.class.php — т.е. добавляем проверку доп.параметра $_REQUEST['no_ajax_for_star_rating'] — он и будет нам говорить о том, что это хоть и запрос ajax, но он не касается фильтра.
Было
public function ajax() {
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' ? true : false;
}
Стало
public function ajax() {
return isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest' && !isset($_REQUEST['no_ajax_for_star_rating']) ? true : false;
}
1.2. вносим небольшие правки в наш файл js от eFilter, чтобы он отправлял нужную переменную и таким образом предупреждал star-rating, что это запрос не ему.
Для решения второго вопроса (переинициализации рейтинга) нам нужно
2.1. Еще немного правок в js нашего фильтра (в том числе добавляем файлик js, который и будет осуществлять переинициализацию нашего рейтинга ratyupdate.js
2.2. завершающий этап. Поскольку рейтинг добавляет свои скрипты в самый конец файла, то и мы добавим свои скрипты по его переинициализации в еще более поздний конец. Для этого создаем сниппет, который будет грузить наш файл ratyupdate.js. Назовем его ratyupdate с кодом
Теперь рейтинги работают. Поскольку все необходимые «правки» со стороны eFilter я добавил, то помимо загрузки актуальной версии остается реализовать только пункт 1.1 и 2.2 :)
Редактирование профиля делается аналогично редактированию документов. У меня в блоге на эту тему по тегу MODxAPI хватает информации, чтобы разобраться тем, кто знаком с php.
$USER = new modUsers($modx);
$USER->edit(1)->set('fullname', $_POST['username'])->save();
Т.е. по сути все сводится только к формированию формы с нужными полями и написанию небольшого сниппета которые раскидает $_POST данные по нужным полям пользователя. Лично для меня это не составляет большого труда. Тем более, что программировать тегами MODX уже давно осточертело.
по сути значение в сессии должно меняться, но что то там не так.
Теперь для каждого документа отдельно создаётся папка с его ID ($content['id'])
в папке создаются папки — images для картинок и files для файлов.
Если плагин выше оставите без изменений, то не забудьте создать в папке assets, папку uploads.
Далее вручную переносите файлы, либо пишите скрипт, чтобы раскидал по папкам все картинки
в смысл на отдельных страницах, лучше вообще на всех — исключая дубли на всем сайте.
сниппет
<?php
/* Canonical snippet */
/* Author Bob Ray */
/* produces an appropriate canonical tag for home and other pages */
/* put the snippet tag [[canonical]] in the <head> section of your template(s) */
return $modx->documentIdentifier == $modx->config['site_start'] ? '<link rel="canonical" href="[(site_url)]" />' : '<link rel="canonical" href="[(site_url)][~[*id*]~]" />';
?>
Модуль заработал когда поменял значение $idPriceTV = 4, ошибок больше не выдает, но визуально выводит две цены сразу, старую и новую, что не есть хорошо! Подскажите, плиз, где подправить код? (код и скрин с ошибкой прилагается)
$idPriceTV = 4; //ID TV-параметра, который указывает цену (поле tmplvarid в таблице modx_site_tmplvar_contentvalues)
$ceil = 10; //Округляем до 100 рублей. Если поставить 10 - округлим до 10 рублей.
$arrFolders = $modx->runSnippet ('Ditto', array ('startID'=>0, 'depth'=>3, 'where'=>'isfolder=1', 'sortBy'=>'{"id":"ASC"}', 'tpl'=>'tplCatList')); //Категории для выбора (чекбоксы)
echo $modx->getChunk('catListScriptCheckbox');
echo '<h1>Автоменятор цен</h1>';
echo '<form action="" method="post">';
echo ' <label for="percent">На сколько процентов изменить цены: </label><input type="text" id="percent" name="percent" value="10"> <b>КНОПКА ВНИЗУ</b>
<p>Количество процентов, на которые меняем цену. Если указать <em><b>ПОЛОЖИТЕЛЬНОЕ</b> число - <b>увеличит</b></em>. Если <em><b>ОТРИЦАТЕЛЬНОЕ</b> - <b>уменьшит</b></em>.</p>
<p>Число становится ЦЕЛЫМ. Если введена абракадабра - берется ближайшее целое, иначе НОЛЬ.</p>';
echo ' <hr />';
echo '<p><input id="one" type="checkbox" name="one" value="all" onclick="checkAll(this)" /><label for="one">Отметить все / Снять отметку со всех</label></p>';
echo $arrFolders;
echo ' <input type="submit">';
echo '</form>';
$percent = empty($_POST['percent']) ? $percent=0 : $percent=(int)$_POST['percent']; //Количество процентов, на которые меняем цену. Если указать ПОЛОЖИТЕЛЬНОЕ число - увеличит. Если ОТРИЦАТЕЛЬНОЕ - уменьшит.
unset($_POST['percent']);
$arrCatId = $_POST; //категории с товарами, которые надо менять
if (!empty($arrCatId)) {
// Собираем цену и ID из указанных категорий
foreach ($arrCatId as $catId) {
$result = $modx->db->query('
SELECT t1.id, t2.value FROM '.$modx->db->config['table_prefix'].'site_content AS t1, '.$modx->db->config['table_prefix'].'site_tmplvar_contentvalues AS t2
WHERE t1.id = t2.contentid
AND
tmplvarid='.$idPriceTV.'
AND
parent='.$catId.';');
while( $row = $modx->db->getRow( $result ) ) {
$arrProductIds[] = $row;//['id'];
}
}
//print_r($arrProductIds);
ksort($arrProductIds);
// Изменяем цены
foreach ($arrProductIds as $arrPrice) {
$productId = $arrPrice['id'];
$strTv = $arrPrice['value'];
//Разбиваем TV в массив
$arrTvOne = explode('||', $strTv);
foreach ($arrTvOne as $arrTvSub) {
$arrTv = explode('==', $arrTvSub);
foreach ($arrTv as $tvValue) {
//И сразу меняем цену на $percent
if ( preg_match('/\d/', $tvValue) && ($tvValue != '0' || $tvValue != '00' )) {
$arrTv[1] = $tvValue + $tvValue/100 * $percent;
$arrTv[1] = ceil($arrTv[1]/$ceil) * $ceil;
}
}
//Собираем обратно строку со значением TV
$strTv = implode("==", $arrTv);
$arrIdTvs[$productId][] = $arrTv;
$arrTvSTR[] .= $strTv;
}
$strIdTv = implode("||", $arrTvSTR);
unset($arrTvSTR);
$arrNewPrice[$productId] = $strIdTv;
}
//print_r($arrNewPrice);
// Записываем новые цены в базу
foreach ($arrNewPrice as $id => $tv) {
$result = $modx->db->query("UPDATE ".$modx->db->config['table_prefix']."site_tmplvar_contentvalues SET value = '".$tv."' WHERE contentid = '".$id."' AND tmplvarid = '".$idPriceTV."';");
//echo $result."\n";
}
}
define('MODX_API_MODE', true);
include_once(dirname(__FILE__)."/index.php");
$modx->db->connect();
if (empty($modx->config)) {
$modx->getSettings();
}
echo $modx->RunSnippet('Ditto',array('parent'=>$modx->db->escape($_POST['parent'])));
// вот тут мы выполняем сниппет по нашим данным
А то все эти файлики с повторными инициализациями DocumentParser только усложняют подмену класса. Возможно кто-то назовет мой способ костылем, но в таком случае встречный вопрос — нахрена в MODX константа MODX_API_MODE?
Кстати, удобно делать таким же образом смену шаблона для AJAX-запросов.
/**
* @events OnWebPageInit
*/
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
// Получаем ресурс
if (!is_object($modx->resource)) {
$modx->resource = $modx->request->getResource($modx->resourceMethod, $modx->resourceIdentifier);
}
// Меняем шаблон у ресурса
$modx->resource->template = 0;
// Делаем ресурс не кэшируемым
$modx->resource->cacheable = false;
}
Таким образом, если URL открыт напрямую во вкладке, то отобразится полная страница, а если будет запрошен через XHR, например для отображения в модальном окне — будет пустой шаблон.
Очень удобно для NoScript пользователей.
Почему одни люди должны за проверку своих сайтов платить деньги, а другие должны качать уже какие-то сборки без дырок которые мне известны? Хотите обезопасить свои сайты — велком в скайп. Расценки тут.
Вероятно, вы кому-то поможете своими доработками этого модуля. Люди периодически ищут.
Но я, вроде с каким-то опытом, когда взглянул на этот модуль в админке, понял что это совсем не Easy. Куча какой-то лишней информации и настроек. Разбираться замучаешься. Уж не знаю как с этим справляются менеджеры сайтов.
Выкинул его поставил другой модуль со сниппетом. Polls Module
Он, конечно, не идеален, но он проще и понятнее. После доработки вполне можно использовать.
Параметр шаблона [(site_url)] всегда выдаёт ссылку с http ане https, в настройках включил что сайт с https.
Остальные настройки на хостинге уже настроены так, что сайт по умолчанию всегда открывается с https.
.htaccess тоже настроен, не помогло.
Много глюков и неработающих плагинов (ManagerManager, CodeMirror), дерево рессурсов пустое.
Помогло жесткое прописывание в config.inc.php строк:
Было:
Заменил на:
Может кому тоже пригодится :)
Вызывать FormLister, как и в случае с eForm, нужно после вызова Shopkeeper'а.
Немного обвеса на сервере:
И на фронте:
Вот и вся корзина (:
github.com/dmi3yy/modx.evo.custom/blob/master/assets/plugins/tinymce4/plugin.class.inc.php#L83
не хватает $cfg['language'] = $lang_code;
Например, конфигурация:
Будет создавать при загрузке превьюшки размером 1140х400 и складывать их в папку slider. Jpg будет дополнительно обрабатываться с помощью jpegtran.
Можно указать несколько конфигураций:
Вместо template можно писать rid и указывать id документа — но не рекомендую, потому что обновление превьюшек не доделано для таких случаев.
Вывод будет такой:
При удалении картинок будут удаляться и превьюшки. Можно менять конфигурацию в плагине и пересоздавать их. В общем phpthumb для галерей больше не нужен.
Если сработает, обновлю топик.
1. Сниппет star_rating любой ajax-запрос обрабатывает как запрос на голосование без всякого различия — ему это был запрос или это пришел ajax -запрос от фильтров.
2. После перегрузки куска страницы с помощью ajax не происходит переинициализации фильтра (ну и как следствие он не появляется).
Решение, соответственно, тоже состоит из двух этапов. Для решения пункта 1 необходимо определиться идет запрос ajax к фильтру или к рейтингу. Для этого:
1.1. Немного модифицируем метод ajax() класса StarRating () файл assets/snippets/star_rating/starrating.class.php — т.е. добавляем проверку доп.параметра $_REQUEST['no_ajax_for_star_rating'] — он и будет нам говорить о том, что это хоть и запрос ajax, но он не касается фильтра.
Было
Стало
1.2. вносим небольшие правки в наш файл js от eFilter, чтобы он отправлял нужную переменную и таким образом предупреждал star-rating, что это запрос не ему.
Для решения второго вопроса (переинициализации рейтинга) нам нужно
2.1. Еще немного правок в js нашего фильтра (в том числе добавляем файлик js, который и будет осуществлять переинициализацию нашего рейтинга ratyupdate.js
2.2. завершающий этап. Поскольку рейтинг добавляет свои скрипты в самый конец файла, то и мы добавим свои скрипты по его переинициализации в еще более поздний конец. Для этого создаем сниппет, который будет грузить наш файл ratyupdate.js. Назовем его ratyupdate с кодом
и вызовем перед самым закрывающим тегом
Теперь рейтинги работают. Поскольку все необходимые «правки» со стороны eFilter я добавил, то помимо загрузки актуальной версии остается реализовать только пункт 1.1 и 2.2 :)
Вот небольшой сниппет для авторизации. Код предельно понятен и прост.
и шаблон
Редактирование профиля делается аналогично редактированию документов. У меня в блоге на эту тему по тегу MODxAPI хватает информации, чтобы разобраться тем, кто знаком с php.
Т.е. по сути все сводится только к формированию формы с нужными полями и написанию небольшого сниппета которые раскидает $_POST данные по нужным полям пользователя. Лично для меня это не составляет большого труда. Тем более, что программировать тегами MODX уже давно осточертело.
и в файле manager/media/browser/mcpuk/tpl/tpl_javascript.php
находите строчку
и меняете на
по сути значение в сессии должно меняться, но что то там не так.
Теперь для каждого документа отдельно создаётся папка с его ID ($content['id'])
в папке создаются папки — images для картинок и files для файлов.
Если плагин выше оставите без изменений, то не забудьте создать в папке assets, папку uploads.
Далее вручную переносите файлы, либо пишите скрипт, чтобы раскидал по папкам все картинки
сниппет
на событии OnWebPageInit и посмотрите на нужной странице сайта (предварительно авторизовавшись в админке) статистику по запросам — время
Также напишите куда-нибудь в подвал строчку
увидите общее время исполнения php и mysql.
Тогда и можно что-то анализировать. Может быть для вашего сайта с учетом его размера и вполне приемлемая статистика будет, просто хостер чудит )
А вообще проще дитто на доклистер заменить :)
А то все эти файлики с повторными инициализациями DocumentParser только усложняют подмену класса. Возможно кто-то назовет мой способ костылем, но в таком случае встречный вопрос — нахрена в MODX константа MODX_API_MODE?
Таким образом, если URL открыт напрямую во вкладке, то отобразится полная страница, а если будет запрошен через XHR, например для отображения в модальном окне — будет пустой шаблон.
Очень удобно для NoScript пользователей.
Но я, вроде с каким-то опытом, когда взглянул на этот модуль в админке, понял что это совсем не Easy. Куча какой-то лишней информации и настроек. Разбираться замучаешься. Уж не знаю как с этим справляются менеджеры сайтов.
Выкинул его поставил другой модуль со сниппетом. Polls Module
Он, конечно, не идеален, но он проще и понятнее. После доработки вполне можно использовать.