Всего 125 683 комментария

Павел Бигель
17 мая 2021, 14:04
+1
1. Ну так назови цикл статьей «Скопируй сам». Почему «Сделай»?
2. Это не лучший, а прям наихудший способ. Кстати если так хотелось прикрутить авторизацию, то можно было доработать Login.
Scorp Satex
17 мая 2021, 14:01
0
Права и группы прописали? docs.modx.pro/komponentyi/office/byistryij-start
Тестируете в режиме инкогнито, чтобы авторизация под админом не ломала логику работу снипета?
Артур Шевченко
17 мая 2021, 13:12
0
Согласен. Надо добавить к коду isNumber.
Павел Бигель
17 мая 2021, 13:09
+1
Без проблем!
100$ и я готов написать решение многократно элегантнее этого с пояснением каждого шага для новичков. Готовы проспонсировать статью?
Дорого?
Можете использовать компонент Office который стоит половину стоимости и реализует задачу гораздо лучше
modstore.pro/packages/users/office
Артур Шевченко
17 мая 2021, 13:08
0
Итого ты не учишь, а даешь людям копировать плохие практики.
1. Не тот у меня уровень, чтобы кого-то учить.
2. Я во вступлении написал, что это не лучший из возможных вариантов.
3. Есть ты и твои комментарии, кто-то проникнется и не станет это копировать, кто-то допилит, а кому-то и так сойдет.
Денис Мижеревич
17 мая 2021, 13:05
+1
Раскритиковали…
Напишите и выложите свой подобный кейс, а то желающих поделиться разработкой не много
Павел Бигель
17 мая 2021, 13:04
0
Валидирует.
У тебя валидация уровня required, я туда могу тебе прислать все что угодно.
Артур Шевченко
17 мая 2021, 13:02
0
Из поста данные не валидируются.
Хочешь сказать FormIt их не проверяет?
Артур Шевченко
17 мая 2021, 13:00
0
Люди предупреждены. А за ревью спасибо.
Павел Бигель
17 мая 2021, 12:29
+6
Мне как раз все понятно.
{if $_modx->user.id > 0}           
    <a href="[[~13]]">  <!-- 13 это id ресурса с формой оформления заказа -->
         <button type="submit" class="knopka2">
             Оформить заказ
       </button>
    </a>          
{else}
    <button type="button" data-toggle="modal" data-target="#modalSMSAuth" class="knopka2">
        Оформить заказ
    </button>
{/if}
Помесь стандартного и fenom синтаксиса это дурной тон.

{'!AjaxForm' | snippet:[
                'snippet' =>'custConfirm',
                'form' =>'@FILE chunks/forms/confirmForm.html',
                'validate'=>'phone:required'
            ]} 
            {'!AjaxForm' | snippet:[
                'snippet' =>'custCheckCode',
                'customValidators' => 'validateCode'
                'form' =>'@FILE chunks/forms/checkcodeForm.html',
                'validate'=>'phone:required,code:validateCode',
                'redirectTo' => 13 
            ]}
Два некешированных вызова AjaxForm. А че ж не 5? Эту задачу можно решить одним вызовом сниппета.

<?php
$file = MODX_CORE_PATH . 'components/codesender/smsc_api.php';
if(!file_exists($file)){
    $modx->log(1, 'FILE NOT FOUND');
}
include_once $file;

if(!isset($translit)){
    $translit = 1; // по умолчанию отправляем транслит, там можно впихнуть больше текста
}
$send = send_sms($number, $message, $translit);

return $send;
Такого рода задачи решаются не сниппетами. Сниппеты это вообще про другое.
Более того, ты же ниже создаешь пакет, какая проблема примутить к нему класс-контроллер?

Тут вы вероятно заметили, что есть сниппет genPassword, изнутри он выглядит так
Опять же а) Не решаются такие задачи сниппетами б) mt_rand не является безопасным для задач уровня генерации паролей. Ты бы это знал, если бы писал это сам.

Итак, выходим на финишную прямую. Сниппет custCheckCode отвечает за проверку кода, авторизацию и регистрацию пользователей
Снова, такие задачи не решаются сниппетами.

// если ошибок нет
    if($_POST['phone']){
        $username = preg_replace('/[^0-9]/', '', trim($_POST['phone']));
        $params = array('username' => $username, 'password' => $_POST['code'], 'group' => 2, 'active' => true, 'blocked' => false);
        $params = array_merge($_POST, $params);
        $user = $modx->getObject('modUser', array('username' => $username));
        if(!$user){
            $modx->log(1, 'Регистрация');
            $user = $modx->runSnippet('Registration', array('params' => $params));
        }
        $user->set('password', $_POST['code']);
        $user->save();
        $response = $modx->runSnippet('Authorization', array('params' => $params));
        if(!$response['success']){
            return  $AjaxForm->error($response['message'],  array());
        }
        $redirectId= $scriptProperties['redirectTo'] ?: 1; // при вызове сниппета мы передаём id ресурса, на который нужно сделать редирект, если не передаем, то редирект будет на главную.
        $redirectUrl = $modx->makeUrl($redirectId , 'web', '', 'full'); 
        return $AjaxForm->success($response['message'], array('redirectTo' => $redirectUrl)); 
    }
}
Из поста данные не валидируются. Пахнет безопасностью! Либо впадлу, либо не знаешь что это такое.
Тут кстати гораздо логичнее была бы проверка на false.

Кастомный валидатор validateCode содержит такой код:
Опять никакой валидации. Еще и сырой запрос (вызов которого не оправдан ничем)

Регистрацию я сделал так (Registration)
Ни единой проверки на то что модель не сохранилась. Неверное сохранение аггеративных моделей.

Итого: куски сомнительного кода не несущие абсолютно никакой ценности.
Я бы ни слова ни сказал, даже плюсик бы залепил если бы тут было хоть какое-то объяснение происходящего.
Почему так, а не иначе, почему это лучше, а это хуже.

Итого ты не учишь, а даешь людям копировать плохие практики.
Абсолютно заслуженный минус
Павел Бигель
17 мая 2021, 10:48
+1
Простыня кода, три строчки текста, никаких объяснений, нулевая информативность.
Alexey
17 мая 2021, 09:25
0
В плагине после строки

case 'OnWebPagePrerender':
добавить строку

if($modx->resource->id == 8) return;

где 8 — id нужного ресурса, меняем на нужный.
Georg
17 мая 2021, 09:09
0
Я так понимаю можно и на ID ресурса проверку сделать? AMP без шаблона делаю. Может есть где-то образец как реализовать? Порылся в интернете не нашел, а плагины и сниппеты, это прям не про меня если честно.
Наумов Алексей
17 мая 2021, 08:33
0
Один из простых вариантов — это создать пользователя Гость (Покупатель) и заказы плагином вешать на него. Но у данного лица есть поле email, а у заказа нет такого поля) вот тут будут проблемы, если вам при оформлении заказа нужна почта.
Артур Шевченко
17 мая 2021, 07:53
0
Спасибо за комментарий, но причина появления сниппета genPassword не в длине пароля, а в его составе, в своём сниппите я могу генерировать числовой код, а если использовать стандартный механизм там будут разные символы, а не только числа. Людям удобнее вводить числа, как показала практика и надёжность пароля им не важна. Ещё я думаю, что наверное после авторизации надо менять пароль ещё раз на более сложный, чтоб никто другой войти не смог. Хотя возможно это излишняя предосторожность.