Anton

Anton

С нами с 26 мая 2013; Место в рейтинге пользователей: #221
Anton
26 мая 2022, 00:03
1
+2
Привет.
Вот решение:
github.com/modx-pro/pdoTools/issues/329#issuecomment-1126893229

/core/src/Revolution/Sources/modMediaSource.php ~1400
<?php 
/**
    * Parse any tags in the properties
    *
    * @param array $properties
    *
    * @return array
*/
public function parseProperties(array $properties)
{
    if (empty($properties)) {
        $properties = $this->getProperties();
    }       
    // $this->xpdo->getParser();
    // if ($this->xpdo->parser) {
    //     foreach ($properties as &$property) {
    //         $this->xpdo->parser->processElementTags('', $property['value'], true, true);
    //     }
    // }

    return $properties;
}```
Anton
02 мая 2022, 19:06
0
Такая же проблема. Сделал тестовый пустой TV, прицепил к шаблону — перестает работать, ошибка 503. Отключаю ТВ — работает.

Есть идеи?
Anton
21 апреля 2022, 11:35
0
Привет.
Как я понял, ты вызываешь сниппет внутри pdoTools (из-за знака +), верно?
  1. Точно не путаешь [[* вместо [[+ ?
  2. Формат файла должен быть таким f=webP (латинская буква P должна быть большая)
И еще. В сниппете phpThumbOff или phpThumbOn какая-то бага при генерации webP. Если картинка имеет прозрачный фон, то он заменяет ее на белый фон.

Лично я использую pThumb

Получилось?
Anton
09 февраля 2022, 17:41
0
Привет.
Хорошая идея. Возможно в этом платном компоненте ты сможешь почерпнуть для себя идеи modmore.com/contentblocks/
Anton
13 января 2022, 20:48
1
+6
Всем привет!

Я борюсь таким образом:
1. Проверяю в сниппете для FormIt с помощи регулярки на наличие ссылки типа site.com И email типа name@mail.com в поле текстового сообщения + в каждом поле такую проверку делаю (Имя, Телефон, Название фирмы, все поля чекаю). Если обнаружена ссылка, то возвращаю false и сообщение, что «Ссылки или электронные адреса в данном поле не разрешены. Вы можете приложить Word, Excel, PDF или текстовый файл с подробным описанием, ссылками и email.».
2. Использую сниппет csrfhelper:
<input type="hidden" name="csrf_token" value="[[!csrfhelper? &key=`contact-us`]]">
А в вызов FormIt добавляю хук csrfhelper_formit.
3. Разумеется, добавляю простейшую проверку на пустоту скрытое поле URL (можно назвать поле любым человекоподобным словом)
<input class="form-control visually-hidden" type="text" name="url" value="">
4. Добавляю таймер на страницу, который не разрешает отправлять форму, если ты менее 15 секунд на странице (обычно спам-боты отправляют спам моментально после загрузки страницы, менее чем за 1-5 секунд) и показываю пользователю сообщение об ошибке «Слишком быстро нажата кнопка Отправить. Подождите, пожалуйста, 15 секунд и отправьте еще раз.»
В форме Fenom-тэг с текущим временем в формате UNIX. Сравниваем его в антиспам-сниппете.
<input class="form-control visually-hidden" type="text" name="formtime" value="{time()}">
5. На всякий случай вырезаю все html-тэги из всех полей :stripTags
6. В доработке хук, который чекает прилагаемый файл через форму: только pdf, word, excel, txt, zip, png, jpg; не больше 25 мегабайт (вроде как стандартное ограничение всеми почтовиками). Если проверка не пройдена, то показываем вежливое сообщение, что мы принимаем только такие файлы и не больше 25 мб.
7. Не забываем про проверку на обязательность заполнения полей со стороны клиента с помощью тэга required. А также проставляем все необходимы типы данных в инпутах: type=«email», type=«number» или же type=«text» во всех полях!

Мое мнение — самое главное вернуть очень понятный человеку и вежливый ответ, что здесь ссылки не разрешены в целях борьбы со спамом, Вы можете приложить файл со всеми ссылками и адресами.

{$_modx->runSnippet('!FormIt', [

	'hooks' => 'antiSpam,spam,csrfhelper_formit,email',

	'spamCheckIp' => '1',
	'csrfKey' => 'contact-us',

	'validate' => 'name:stripTags:required,email:stripTags:required,message:stripTags:required,url:blank',

	'successMessage' => '<div class="alert alert-success mt-3" role="alert"><b>Спасибо!</b> Ваше сообщение было отправлено.</div>'

])}
Сам сниппет antiSpam:
<?php
$name = $hook->getValue('name');
$phone = $hook->getValue('phone');
$email = $hook->getValue('email');
$message = $hook->getValue('message');
$contact_attachment = $hook->getValue('contact_attachment');

$regExpGSM = '/(\d{3})(?:(?:-*|\s*|\.*|\)*|\)\s*))(\d{3})(?:(?:-*|\s*|\.*|\)*))(\d{3})/';
$regExpURL = '/[-a-zA-Z0-9@:%._\+~#=]{2,256}\.[a-z]{2,6}\b[-a-zA-Z0-9@:%_\+.~#?&=]*/i';
$regExpEmail = '/(?<=\b)\w([\w\.\-_0-9])*(@| at )[\w0-9][\w\-_0-9]*((\.| DOT )[\w\-_0-9]+)+(?=\b)/';
$regExpExt = '/^([A-Za-z0-9-_.])+\.(png|jpe?g|gif|bmp)$/';

/*Check regExp email*/
if (preg_match($regExpEmail, $name)) {
    $hook->addError('emailInName', 'Email-адреса не разрешены в поле Имя. Вы можете приложить Word, Excel, PDF или текстовый файл с подробным описанием, ссылками и электронной почтой.');
    return false;
} elseif (preg_match($regExpEmail, $message)) {
    $hook->addError('emailInMessage', 'Email-адреса не разрешены в поле Сообщения. Вы можете приложить Word, Excel, PDF или текстовый файл с подробным описанием, ссылками и электронной почтой.');
    return false;

    /*Check regExp URL's*/
} elseif (preg_match($regExpURL, $name)) {
    $hook->addError('linkInName', 'Ссылки на сайты не разрешены в поле Имя. Вы можете приложить Word, Excel, PDF или текстовый файл с подробным описанием, ссылками и электронной почтой.');
    return false;
} elseif (preg_match($regExpURL, $message)) {
    $hook->addError('linkInMessage', 'Ссылки на сайты не разрешены в поле Сообщения. Вы можете приложить Word, Excel, PDF или текстовый файл с подробным описанием, ссылками и электронной почтой.');
    return false;
	
/*И так далее по всем полям чекаю регулярками выше*/

/*Проверяем, что не слишком быстро нажимается кнопка "Отправить"*/
} elseif ($_POST['formtime'] > time() - 15) {
    $hook->addError('fastSending', 'Слишком быстро нажата кнопка Отправить. Подождите, пожалуйста, 15 секунд и отправьте еще раз.');
    return false;

} else {
    return true;
}
В самой форме плейсхолдеры для вывода человекопонятных ошибок:
[[!+fi.error.csrf_token:notempty=`
<div class="alert alert-warning mt-3 mb-2">[[!+fi.error.csrf_token]]</div>
`]]
[[!+fi.error.fastSending:notempty=`
<div class="alert alert-warning mt-3 mb-2">[[!+fi.error.fastSending]]</div>
`]]

[[+fi.statusMessage]]
[[+fi.successMessage]]

<input type="text" class="form-control"
       placeholder="Ваше имя *"
       name="name"
       value="[[!+fi.name]]"
       required>
<span class="error_name">[[+fi.error.name]]</span>
До этого у меня была всего-лишь одна проверка regExp на наличие ссылки и email в поле Сообщения (message). Спама почти не было, но стал приходить спам типа Buy our viagra on usa-pharma.shop, пропускались такие ссылки. Более длинная регулярка уже иногда блочила любой текст, если юзер пишет сообщение и после точки сразу пишет слово нового предложения.

Добавил проверку на 15 секундное ожидание (человеку просто не реально раньше 15й секунды заполнить все поля и отправить форму). Можно поставить 5 секунд.

После этого стали приходить сообщение только от человеков, никакого спама.

Не отловленные ошибки надо бы логгировать (у меня был этот кусок кода для логгирования не отправленных форм через FormIt, но не могу найти, он в старых хуках был).

Ну и можно по IP блочить вдобавок, как выше уже предложено.

Я не очень силен в PHP, как смог так и написал, поэтому большая просьба помочь хорошо доработать данный сниппет/хук и поделиться им здесь.
Anton
13 декабря 2021, 15:05
+1
Спасибо.
Отправил.
Anton
07 декабря 2021, 21:06
0
Привет.
Нет, не совсем так.
3 страницы с 3мя разными формами.
Заполнить в течение года все 3 формы — это обязанность пользователя.
Если он уже заполнял форму (например, форму номер 1) то, вместо формы (чанк с формой будет скрыт) он увидит «Спасибо, Вы уже заполняли эту форму».

Не очень сумбурно объяснил? :))
Anton
07 декабря 2021, 21:02
0
Привет, спасибо за ответ.
Можг бы кусочек кода-примера с curl привести?
Знаком с curl, но только для скачивания файлов.
Как передать 2 формы curl даже не представляю.

Или как искать в Гугле?
Anton
07 декабря 2021, 13:10
0
Привет.
Спасибо за ответ.

FormIt2db, оказывается, создает автоматически, если его еще нет, xPDO объект, папку со схемами, моделью.
В базе делаешь кастомную табличку с этими тремя полями и теперь всё сохраняется туда.

Сделал прекхук, который сам подставляет нужные данные для запоминания пользователя.

Но у меня теперь другая проблема.

Сама форма — это форма с другого сайта, в action стоит:
<form name="Webform 1"  action="https://***/modules/Webforms/capture.php" method="post">
Вторая форма
<form action="[[~[[*id]]]]">
Как сделать так, чтобы при нажатии на отправить в первой форме (или второй) — данные отправляются и на внешнюю форму, и в базу (вторая форма)?

Пока уходят данные только той формы, чью кнопку Отправить я нажал.

Есть идеи?
Anton
03 декабря 2021, 00:17
0
Спасибо, но modx.com/extras/package/pthumb
webP + phpThumbOff, все работает как швейцарский нож уже 10 лет.
Anton
30 августа 2021, 12:05
0
Есть желание поддержать именно проект :) Давай email или ссылку на оплату для PP. Куда слать?
Anton
27 августа 2021, 13:44
0
Тоже буду очень рад такому функционалу!
@Сергей Шлоков, у меня нет возможности отправить на поддержку через кнопку выше. Я могу отправить тебе на PayPal?
Anton
04 августа 2021, 13:17
0
Василий, рад видеть!

Вопрос по AjaxForm. В описании сказано, используются jQuery.Form и jQuery.jGrowl.
То есть, ему нужен jQuery. Можно ли обойтись без него?
Anton
23 июня 2021, 17:52
0
Вот и спрашиваю где бы подсмотреть уже реализованный пример или опыт.
Велосипедить новый велик хорошо, но я сторонник, чтобы улучшить уже имеющуюся реализацию.
Anton
23 июня 2021, 17:50
0
Удивительно, но нет — это не ресурсы. Там не нужно каждому блюду фото, описание.
Просто 1 страничка со всем списком по дням. Как будто распечатанное меню в ресторане.

Меню планируется сразу на всю неделю. Каждый день предлагается по 2 разных блюда. На следующий день уже будут другие 2 разных блюда. И так всю неделю.

Несколько раз в месяц некоторые блюда повторяются. Цена единственная на все блюда.

Вот и думаю что будет удобнее редактору сайта: список, который пополняется или текстовое поле. Или еще как-то? Чтобы минимизировать количество писанины с его стороны.
Anton
23 июня 2021, 17:27
0
Насколько я понял, то вы подумали про мой вопрос «какие технологии использовать в админке». Типа Vue.js, React.

Нет. Я имею в виду: что должно в админке сайта для ресторана? Есть ли пример, где можно посмотреть как (не «на чем», а «как») реализована админка такого сайта? Какие ТВ-поля используются? Сделать ли блюда списком или простое текстовое поле?

Админку MODX считают абсолютно понятной и логичной. Очень будут рады в ней работать.

Стандартных компонентов для Наименования, Цена, День недели — весьма хватает.

Мне бы пример увидеть. Есть примеры?
Anton
23 июня 2021, 14:17
0
Александр, очень неожиданный совет. Но я даже не представляю, что должно в админке для ресторана, что меня пугают extJS.
Можете подсказать, какие такие страшные компоненты должны быть в админке?
Anton
10 июня 2021, 17:39
0
В общем, реализовал так:
1. Создал группы ресурсов и пользователей.
2. Создал ресурсы, к которым открыл доступы нужным группам (ведь 1 пользователь может состоять в нескольких группах).
3. С помощью сниппета «FileDownload R» сделал вывод нужной директории с ftp.
4. С помощью .htaccess закрыл листинг этой директории.
5. Ну и стандартная логин-форма из сниппета «Login».

Теперь вопрос. Это безопасно?