Создать раздел с паролем на сайте MODX

Задача, которая решалась нижеследующим способом заключалась в следющем:

  • Есть около 50 юзеров, каждому из которых нужно открыть доступ к их папке на Google Disc
  • После ввода пароля человека перекидывает на соответствующую ссылку
  • Пользователей регистрирует администратор сайта, он же внутри админки добавляет новые сочетания логин-пароль-ссылка

Что интерестного тут есть:

  • MIGX
  • Сниппеты, вызов чанка из сниппета
  • JS таймер
  • Сессии

План работ:

  • Создать TV MIGX
  • Создать сниппет
  • Создать чанки
  • Прописать CSS

MIGX TV migx_drivers

Тип ввода: migx

Вкладки формы:

[
  {
    "caption": "Ссылки для водителей",
    "fields": [
      {
        "field": "userid",
        "caption": "Логин (ID)"
      },
      {
        "field": "userpass",
        "caption": "Пароль"
      },
      {
        "field": "userlink",
        "caption": "Ссылка",
        "inputTVtype": "textarea"
      }
    ]
  }
]

Разметка колонок:

[
  {
    "header": "Логин",
    "dataIndex": "userid"
  },
  {
    "header": "Пароль",
    "dataIndex": "userpass"
  },
  {
    "header": "Ссылка",
    "dataIndex": "userlink"
  }
]

Сниппет [[!USgetDriverLink]]

// SESSION EXIT
if(!empty($_GET['us_session_exit'])){
    unset($_SESSION['us_userid'],$_SESSION['us_userpass']);
    $url = $modx->makeUrl($modx->resource->get('id'));
    $modx->sendRedirect($url);
}
$form = $modx->getChunk('USgetDriverLink_form');
// Session auth
if(!empty($_SESSION['us_userid']) && !empty($_SESSION['us_userpass'])){
    $input_userid = $_SESSION['us_userid'];
    $input_userpass = $_SESSION['us_userpass'];
}else{
    // Form auth
    if(empty($_POST['userid']) || empty($_POST['userpass'])){
        return $form;
    }else{
        $input_userid = strtolower(strip_tags(trim($_POST['userid'])));
        $input_userpass = strtolower(strip_tags(trim($_POST['userpass'])));
    }
}
// GET DATA FROM MIGX TV
$driver_data = json_decode($modx->resource->getTVValue('migx_drivers'), true);
$oa = array(
    "userid_true" => 0
    ,"userpass_true" => 0
    ,"userlink" => 0
    );
$return_data = false;

foreach($driver_data as $v){
    if($v['userid'] == $input_userid AND $v['userpass'] == $input_userpass){
        $oa['userlink'] = $v['userlink'];
        $return_data = $modx->getChunk('USgetDriverLink_tpl', $oa);
        if(!empty($_POST['userremember'])){
            $_SESSION['us_userid'] = $input_userid;
            $_SESSION['us_userpass'] = $input_userpass;
        }
    }else{
        if($v['userid'] == $input_userid){$oa["userid_true"] = 1;}
        if($v['userpass'] == $input_userpass){$oa["userpass_true"] = 1;}
    }
    if($return_data){
        break;
    }
}
if(!$return_data){
    unset($_SESSION['us_userid'],$_SESSION['us_userpass']);
    $return_data = $form;
    $return_data .= $modx->getChunk('USgetDriverLink_empty', $oa);
}
return $return_data;

Чанк [[$USgetDriverLink_form]]

<form action="[[~[[*id]]]]" method="POST">
    <input type="text" name="userid" placeholder="Логин (id)" class="fbw-text">
    <input type="text" name="userpass" placeholder="Пароль" class="fbw-text"><br>
    <label><input type="checkbox" name="userremember"> Запомнить меня</label><br><br>
    <input type="submit" value="Вход" class="gd_submitBtn">
</form>

Чанк [[$USgetDriverLink_empty]]

<div class="USgetDriverLink_empty">
    Ошибка доступа.
    [[+userid_true:is=`0`:then=`<strong>Не верно указан <span>логин</span>!</strong>`]]
    [[+userpass_true:is=`0`:then=`<strong>Не верно указан <span>пароль</span>!</strong>`]]
</div>

Чанк [[$USgetDriverLink_tpl]]

<div class="USgetDriverLink">
    Переход должен быть автоматически. 
    Вы успешно авторизаровались. Через <span id="DriverLink_timer">4</span> сек. Произойдет переход в Google Disc. Если этого не произошло — <a href="[[+userlink]]">перейдите по ссылке вручную</a>.<br><br>
    <a href="[[~[[*id]]]]?us_session_exit=1" style="font-weight:bold;">Сменить пользователя (Выйти)</a>
</div>
<script>
    setInterval(function(){
        $("#DriverLink_timer").html(function(){
            var timeLeft = parseInt($("#DriverLink_timer").text()) - 1;
            if(timeLeft >= 0){
                return timeLeft;
            }else{
                window.location = "[[+userlink]]";
                return 0;
            }
        });
    }
    , 1000);
</script>

CSS

.fbw-text{
    margin: 6px 0;
    box-sizing: border-box;
    padding: 6px;
    border: 1px solid #ccc;
    outline: none;
    -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);
    box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);
    width:100%;
    font-family:inherit;
}
.fbw-text:focus {
    border-color: #66afe9 !important;
    outline: 0;
    -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,1);
    box-shadow: inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,1);
}
.gd_content_wr{
    text-align: center;
}
.gd_content_wr .fbw-text{
    width: 200px;
    display: inline-block;
}
.gd_content_wr form {
    width: 520px;
    margin: 0 auto;
    padding: 23px 30px;
    border: 8px solid #8dbd7e;
}
.gd_title{
    font-size:24px;
    font-weight: 600;
    margin-bottom: 15px;
}
.gd_submitBtn {
    padding: 6px 20px;
}
.USgetDriverLink_empty {
    margin-top: 10px;
    width: 520px;
    margin: 10px auto;
    background: #ef8080;
    color: #fff;
    padding: 10px 0;
}

В итоге на нужной странице размещаем сниппет [[!USgetDriverLink]] и все должно работать:)

Комментарии (0)

  1. Напишите первый комментарий
*Комментарий будет опубликован после проверки модератором

[MODx] Генератор настроек MIGX

[MODx, MIGx] Документация на русском по MIGX

[MODX] Импорт и экспорт в MiniShop2. Реализация 1

[JS] Маска для ввода телефона +7(___)___-__-__

[MODx] minishop2 tips

Как включить HTTPS (SSL) в MODX - Подробная инструкция

[MODx, miniShop2] Генерация YML для выгрузки в маркет

[MODx] Подсказки по API

[OpenCart] Вывести на главную все категории с картинками

[MODx] Сайт на обслуживании (выключить сайт)

[MODx, MIGX] Примеры использования

[PHP, JSON] Пример перевода с помощью Yandex Translate API

Универсальная форма обратной связи — feedBackForm

Расширение свойств товаров minishop2

[MODx, Gallery] Галерея. Вывести обложки альбомов и фотографии

[Opencart] Вернуть английский язык, если вы его удалили

[OpenCart] Вывести модуль напрямую через контроллер

[MODX, MIGX] Вывести getImageList только если он не пустой

[MODx, Quip] Более рабочий вариант.

[MODX, MIGX] Тип поля "Список ресурсов" (resourcelist) с ограничением по родителю (parents)

[MODX] pThumb - ресайз изображений. Примеры использования.

Красивое адаптивное меню под pdoMenu

[MODX, MiniShop2] Примеры выборки where, optionFilters, innerJoin

[MODx] Вывод tv-параметров в формате [название TV] - [значение TV]

[MODX] Вывести список всех опций MiniShop2

Все записи

Добавьте такую строчку на свой сайт за 2 минуты по инструкции
Наш сайт использует куки, нажмите «ОК» если вы не против
OK