Станислав

Станислав

С нами с 11 января 2013; Место в рейтинге пользователей: #1221
vectorserver
14 апреля 2020, 19:23
6
+11
Так проще и быстрее, без обид друг)
Код сниппета ParseInsta:
<?php
//ParseInsta
$cacheKey = "insta_".md5($url);

$returnCache = $modx->cacheManager->get("$cacheKey");

if(!$returnCache){
    $doc = new DOMDocument();
    $doc->loadHTMLFile($url);
    $xpath = new DOMXpath($doc);
    $sharedData = $xpath->query("//html/body/script[1]")->item(0)->textContent;
    $str = $sharedData;
    $modx->cacheManager->set($cacheKey, $str, 7200*60);
    return $str;
}

return $returnCache;
И далее JSON обрабатываем через JS или конвертуть в массив и использовать в чанках
<script>
var instaphotos = [[ParseInsta? $url=`https://www.instagram.com/explore/tags/кофесос`]];
//bla bla bla
</script>
Евгений
20 декабря 2019, 16:11
1
0
решилось настройкой конфига:

new CleanWebpackPlugin({
    verbose: false,
    cleanStaleWebpackAssets: true,
    cleanAfterEveryBuildPatterns: [base + '../../../core/cache/*'],
    dangerouslyAllowCleanPatternsOutsideProject: true,
    dry: false,
}),
Alexey T
18 апреля 2019, 14:22
3
+2
Или так:
'friendly_alias_restrict_chars' => 'pattern',
'friendly_alias_restrict_chars_pattern' => '/[\0\x0B\t\n\r\f\a&=+°%#«»…<>—№!",.()\/\~:`@\?\[\]\{\}\|\^\'\\\\]/',
Василий Столейков
08 декабря 2017, 11:36
5
+4
Забыл отписаться для истории что решение было найдено!

Нужно добавить в нужный источник файлов булеву настройку hideSource:


и создать плагин на OnMediaSourceGetProperties:
<?php
$properties = json_decode($properties, true);
if (!empty($properties['hideSource']) AND !empty($properties['hideSource']['value']) AND $_REQUEST['node'] == '/') {
    die('{}');
}

Это очистит источники в дереве.
Андрей
04 декабря 2017, 12:04
1
0
Пример рабочей формы с лендинга. Так же иногда требуется указать emailFrom почтой совпадающей с доменом.

{'!AjaxForm' | snippet : [
  'form' => '@INLINE
    <form class="form" method="post" action="">
      <input type="hidden" name="nospam">

      <div class="form-group">
        <div class="form-item">
          <label class="form-label" for="">Имя</label>
          <input class="form-field" type="text" name="name" value="{$_pls["fi.name"]}">
          <div class="error_name">{$_pls["fi.error.name"]}</div>
        </div>
      </div>
      <div class="form-group">
        <div class="form-item">
          <label class="form-label" for="">Компания</label>
          <input class="form-field" type="text" name="company" value="{$_pls["fi.company"]}">
          <div class="error_company">{$_pls["fi.error.company"]}</div>
        </div>
      </div>
      <div class="form-group">
        <div class="form-item">
          <label class="form-label" for="">E-mail</label>
          <input class="form-field" type="email" name="email" value="{$_pls["fi.email"]}">
          <div class="error_email">{$_pls["fi.error.email"]}</div>
        </div>
      </div>
      <div class="form-group">
        <div class="form-item">
          <label class="form-label" for="">Телефон</label>
          <input class="form-field" type="tel" name="phone" value="{$_pls["fi.phone"]}">
          <div class="error_phone">{$_pls["fi.error.phone"]}</div>
        </div>
      </div>
      <div class="form-group">
        <div class="form-item">
          <label class="form-label" for="">Сообщение</label>
          <textarea class="form-field" name="message" rows="5">{$_pls["fi.message"]}</textarea>
          <div class="error_message">{$_pls["fi.error.message"]}</div>
        </div>
      </div>
      <div class="form-group">
        <div class="form-item">
          <input type="hidden" name="privacy[]" value="">
          <div class="checkbox">
            <input type="checkbox" name="privacy[]" id="privacy" value="agree">
            <label for="privacy">Отправляя заявку, я соглашаюсь на обработку персональных данных.</label>
          </div>
          <div class="error_privacy">{$_pls["fi.error.privacy"]}</div>
        </div>
      </div>
      <div class="form-group">
        <div class="form-item">
          <button class="button" type="submit">Отправить</button>
        </div>
      </div>
    </form>
  ',
  'emailTpl' => '@INLINE
    <h2>Сообщение с сайта {$_modx->config.site_name}</h2>
    <p><b>Имя:</b> {$name}</p>
    <p><b>Компания:</b> {$company}</p>
    <p><b>E-mail:</b> {$email}</p>
    <p><b>Телефон:</b> {$phone}</p>
    <p><b>Сообщение:</b> {$message}</p>
  ',

  'hooks' => 'email, FormItSaveForm',

  'emailSubject' => 'Сообщение с сайта '~$_modx->config.site_name,
  'emailTo' => $_modx->config.emailsender,
  'emailFrom' => $_modx->config.emailsender,
  'emailFromName' => $_modx->config.site_name,

  'formName' => 'Узнать подробнее',
  'formFields' => 'name,company,email,phone,message',
  'fieldNames' => 'name==Имя,company==Компания,email==E-mail,phone==Телефон,message==Сообщение',

  'validate' => 'nospam:blank, name:minLength=^3^:required, company:required, email:email:required, phone:required, message:minLength=^20^:required, privacy:required'
]}
Prihod
13 января 2017, 13:59
2
+1
1) т/к нужно для всех товаров не попавших в обновление поменять значение availability то возможно целесообразней использовать в качестве условия для получения всех товаров class_key == msProduct
2) т/к availability (из инфы от автора вопроса) для товара добавлено через систему плагинов minishop2 которую также в удобной форме реализует дополнение msFieldsManager то код примет следующий вид
<?php
/** @var modX $modx */
switch ($modx->event->name) {
    case 'msieOnCompleteImportProduct':

        // Получаем id всех импортированных товаров
        $currentIDs = explode(",", $modx->event->params['data']);

        // Получаем id ВСЕХ товаров в магазине
        $q = $modx->newQuery('msProduct', array('class_key' => 'msProduct'));
        $q->prepare();
        $q->stmt->execute();
        $oldIDs = $q->stmt->fetchAll(PDO::FETCH_COLUMN, 0);

        // Вычисляем id товаров которые есть на сайте, но нет в файле импорта
        $oldIDs = array_diff($oldIDs, $currentIDs);

        if (!empty($oldIDs)) {
            $oldIDs = implode(',', $oldIDs);
            $sql = "UPDATE {$modx->getTableName('msProductData')} SET availability = 0 WHERE id IN  ({$oldIDs});";
            $modx->exec($sql);
        }
        break;
}
Cyrax_02
24 октября 2016, 01:40
1
0
Да, при [merge_slashes = on] nginx удаляет слеши из uri, но только на внутреннем уровне — без внешних (301) редиректов.

Вариант, работающий только при [merge_slashes = off]
Конструкция, которую вы привели, имеет логическую ошибку, из-за чего удалять она будет только по одному слешу (если подряд идущих слешей — несколько, будет несколько последовательных 301 редиректов), что не есть хорошо. В rewrite первая звёздочка захватит часть слешей, оставив конструкции //+ только 2 слеша.

Что нужно сделать, чтобы довести конструкцию до ума:
1. «Умерить» жадность этой звёздочки
2. Добавить символы начала и конца строки (не обязательно, но желательно)
3. Максимально упростить регулярное выражение в location (т.к. оно используется только для обнаружения факта присутствия в uri лишних слешей)
location ~ // {
    rewrite ^(.*?)//+(.*)$ $1/$2 permanent;
}

Вариант, работающий только при [merge_slashes = on]
А ещё лучше использовать конструкцию, которая не требует отключения merge_slashes (работает только при включенном merge_slashes):
if ($request_uri ~ ^[^?]*//) {
    rewrite ^ $uri permanent;
}
Здесь переменная $request_uri содержит исходный uri с исходными аргументами запроса (до корректировки веб-сервером и до всяких внутренних редиректов). Конструкция ^[^?]* слева от слешей нужна, чтобы убедиться, что лишние слеши обнаружены именно в uri, а не в составе аргументов (слэши в составе аргументов не трогаем). И в самую последнюю очередь делаем 301 редирект на uri, который nginx уже самостоятельно очистил от лишних слешей (это значение содержится в переменной $uri).

Универсальный вариант, не зависящий от состояния [merge_slashes]
Если же нужен универсальный вариант, который не зависит от состояния директивы merge_slashes, то делаем так (слэши в составе аргументов не трогаем):
if ($request_uri ~ ^(?P<left>[^?]*?)//+(?P<right>[^?]*)) {
    rewrite ^ $left/$right permanent;
}
Володя
05 августа 2016, 22:35
21
+5
можно добавить так
создать плагин на pdoToolsOnFenomInit, в нем добавить модификатор detector
<?php
switch ($modx->event->name) {
    case 'pdoToolsOnFenomInit':
    if (!$fenom = $modx->getOption('fenom', $scriptProperties)) {
        return;
    }
    if (!$MobileDetect = $modx->getService('mobiledetect', 'MobileDetect', MODX_CORE_PATH . 'components/mobiledetect/')) {
	    return;
    }
    
    $key = $MobileDetect->config['force_browser_variable'];
    $device = !empty($_GET) && array_key_exists($key, $_GET)
		? $modx->stripTags($_GET[$key])
		: '';
	if (empty($device)) {
	    $device = $MobileDetect->getSettings();
    }
    if (empty($device)) {
        $detector = $MobileDetect->getDetector();
        $device = ($detector->isMobile() ? ($detector->isTablet() ? 'tablet' : 'mobile') : 'standard');
        $MobileDetect->saveSettings($device);
    }

    $fenom->addModifier("detector", function ($value) use ($device) {
        return $value == $device;
    });

    break;
}

и теперь в любом месте можно делать так
{if 'mobile'|detector}
mobile
{/if}

{if 'tablet'|detector}
tablet
{/if}

{if 'standard'|detector}
standard
{/if}
Алексей
08 февраля 2016, 16:37
3
+2
у меня никаких особых защит не стоит — ни капчи, ни текстовых вопросов.
защита серверная.
Все дело в спам-программах — они сначало пытаются понять, с каким движком имеют дело, а только потом уже заспамиться\зарегистрировать пользователя\оставить ссылку, делают они это по следующим признакам:
1. наличие footprint'а в файле html
Powered by wordpress
Powered by joomla
Этот пункт не относится к MODX — пропускаем
2. ломятся по известным адресам (папкам)
/bitrix/
/user/
/users/
/registrate/
/login/
И так далее — тут они понимают, битрикс ли это или форум phpbb, или что там еще.
Вот этот пункт интересен.
В nginx вешаем правило
location ~* ^/(blocks|bitrix|user|users|registrate|login|node|netcat|wp-admin|wp-content|wordpress|engine|blocks|administrator|PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|phpmyadmin2)(|/) {
	try_files $uri =404;
}
— исключительно чтобы не нагружать php5-fpm\hhvm демон спамными запросами, динамический бэкэнд и там отдаст 404 ошибку т.к. этих папок нет.
Потом ставим fail2ban, и организуем следующий jail:
/etc/fail2ban/filter.d/nginx-noscript.conf
[INCLUDES]
before = common.conf

[Definition]
failregex = 	
		^[^ ]* <HOST> -.*"GET.*(\.php|\.asp|\.exe|\.pl|\.cgi|\.scgi).*" 404
		^[^ ]* <HOST> -.*"GET.*/(blocks|bitrix|user|users|registrate|login|node|netcat|wp-admin|wp-content|wordpress|engine|blocks|administrator|PMA|phpmyadmin|myadmin|mysql|mysqladmin|sqladmin|mypma|admin|xampp|mysqldb|mydb|db|pmadb|phpmyadmin1|phpmyadmin2).*" 404
		^[^ ]* <HOST> -.*"GET.*" 403
		^[^ ]* <HOST> -.*"GET.*" 401
		^[^ ]* <HOST> -.*"GET.*" 444
ignoreregex =
и в файле:
/etc/fail2ban/filter.d/jail.conf
[nginx-noscript]
enabled = true
port = http,https
#action = iptables-multiport[name=NoScript, port="http,https"]
filter = nginx-noscript 
logpath = /var/log/nginx*/*access*.log
maxretry = 3
bantime = 600
Таким образом, любой, кто запросит подобные расположения папок: example.com/bitrix более 3 раз (maxretry = 3), попадет в бан по IP адресу на 10 минут (bantime = 600)
При такой защите не только у спам-программ отпадает охота сканить ваш сайт, но и у тех, кто делает это вручную.
+Абсолютная неуязвимость к программам определяющих на какой CMS ваш сайт
+Практически никакого спама (только если форма отправки сообщений висиь на главной страничке)
+Разгрузка динамического бэкэнда php5-fpm\hhvm от ненужных запросов

Все эти интересные пути запрашиваются тысячами, обнаружить их можно анализируя логи через удобный интерфейс piwik, который называется log analizator, серверный скрипт, написанный на питоне. Смотрит все логи nginx и строит по ним всякие графики, пободно yandex.metrika, только по логам а не через прикрепляемый javascript (хотя такая возможность тоже есть). Тут же можно следить, как часто робот яндекса\гугла посещает ваш сайт.
Василий Наумкин
12 августа 2015, 09:22
4
0
Вот 2 правила для Nginx: первое пропускает превьюшки, а второе запрещает открывать в галерее всё кроме них
location ~* ^/assets/images/products/\d+/\d+x\d+/ {
	access_log		off;
	expires			10d;
	break;
}

location ~* ^/assets/images/products/\d+/ {
	deny			all;
}
Наверное, можно и как-то красивее написать, но я не придумал.

Теперь никто не откроет полноразмерные картинки, и ты можешь отдавать их через PHP покупателям.