Проблема с двумя формами авторизации
Здравствуйте. У меня появилась одна проблема. На сайте две формы авторизации: одна в шапке сайта во всплывающем окне (соответственно она отображается на каждой странице) и другая на конкретной странице. Проблема в том, что если авторизоваться с той конкретной страницы, то после авторизации вместо отображения приветственного сообщения, происходит редирект на главную. Если авторизоваться через форму в шапке, то все нормально работает. Путем нескольких экспериментов я пришла к выводу, что происходит какой-то конфликт между этими двумя формами авторизации. Подскажите пожалуйста, в чем может быть дело и каким образом можно решить эту проблему?
Код чанка с авторизацией в шапке:
Код чанка с авторизацией в шапке:
[[!Login? &loginTpl=`lgnLoginTpl` &logoutTpl=`lgnLogoutTpl` &errTpl=`lgnErrTpl`]]Чанк с авторизацией на странице: [[!+modx.user.id:isloggedin:is=`1`:then=`<p>[[!+modx.user.id:userinfo=`username`]], вы уже авторизованы на сайте <strong>[[++site_name]]</strong>.</p>
<p><a class="account" href="[[~72~]]">ПРОДОЛЖИТЬ ОФОРМЛЕНИЕ ЗАКАЗА</a> <a href="[[~78~]]">ПЕРЕЙТИ В СВОЙ ПРОФИЛЬ</a></p>`:else=`
[[!Login? &loginTpl=`embedded` &errTpl=`lgnErrTpl`]]
<div class="loginForm">
<div class="loginLogin">
<div class="loginMessage">[[+errors]]</div>
<form class="loginLoginForm" action="[[~[[*id]]]]" method="post">
<fieldset class="loginLoginFieldset">
<input class="returnUrl" type="hidden" name="returnUrl" value="[[+request_uri]]" />
<input class="loginLoginValue" type="hidden" name="service" value="login"/>
<table class="order">
<tr>
<td>[[%login.username]]</td>
<td><input id="loginUsername" type="text" name="username" /></td>
</tr>
<tr>
<td>[[%login.password]]</td>
<td><input id="loginPassword" type="password" name="password" /></td>
</tr>
<tr>
<td>[[+login.recaptcha_html]]</td>
<td><input type="submit" name="Login" value="[[+actionMsg]]" /></td>
</tr>
</table>
</fieldset>
</form>
</div>
</div>`]] Комментарии: 16
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
2. В вызове Login на отдельной странице укажите параметр &actionKey, задайте ему значение скрытого поля в форме. Значение должно быть отличным от 'service'. После этого 2 вызова Login перестанут перехватывать формы авторизации друг друга, и у Вас появится понимание, как дальше все настроить.
3. Укажите категорию этого тикета «Вопросы».
Да, &actionKey должно быть достаточно, если еще и в форме на отдельной странице «service» заменить на значение параметра.
Я не говорил, что именно тот вызов сильно замедляет. Но это пример, как делать не стоит, ибо злоупотребление может замедлить.
В приведенном шаблоне можно оптимизировать использование фильтров ввода-вывода, чтобы не выполнялись лишние сниппеты. С другой стороны, если Вас скорость работы сайта полностью устраивает, то эта оптимизация может быть не слишком оправданной.
Насчет того, что делать не стоит, я подсмотрела это решение у одного программиста и пришла к выводу, что так, наверное, лучше. Действительно, зачем плодить кучу шаблонов. А вставлять на страницу вызов того или иного сниппета или чанка, учитывая, что его администрировать может человек, далекий от всего этого, тоже не есть хорошо. Поэтому лучше зашить в шаблон. Но не знала, что так «делать не стоит» и что это тормозит работу.
Понимаете, какая штука. Сайт при относительной несложности функционала жутко нагружает ресурсы сервера. Бывают моменты, когда админка постоянно не прогружается корректно. И я все не могу понять, в чем причина. Поэтому теперь я задаюсь вопросом, а может причина как раз в этом.
В таком виде адрес написан, чтобы роботам хотя бы немного сложнее было его занести в спам-базы.
Для отключения переадресации необходимо было добавить &loginResourceId=`[[*id]]`.
Что касается чрезмерного количества условий в шаблоне — парсер MODX сначала обрабатывает самые внутренние вложенные конструкции, и только потом внешние.
Пример:
Сначала будет запущен в работу сниппет Shopkeeper со всеми параметрами и обработан чанк orderTpl, и только потом запустится проверка условия по ID. Но если ID не совпадет, то результат работы первого шага выводить не нужно. Он и не выведется. А время на обработку уже затрачено.
Поскольку большинство страниц, к которым применен шаблон, служебные, вызовы необходимых сниппетов правильнее писать непосредственно в их поле content, а в шаблоне вместо кучи строк с проверкой ID сделать простой вызов [[*content]].
Но если уж хочется сделать все в одном шаблоне с проверкой ID, используйте такие конструкции:
Разница по сравнению с первым вариантом в том, сначала выполнится внутреннее условие проверки по ID и, если произойдет совпадение, после подстановки значения образуется новый для выполнения тег.
Таким образом, сниппет запустится только на одной единственной странице, а не на всех сразу.
Если так изменить все остальные условия, Вы сразу же заметите разницу в скорости загрузки страниц с этим шаблоном.
Спасибо вам огромное за подробное объяснение по поводу фильтров. Теперь не буду так делать. ) Еще на почту вы мне написали, что советуете «собрать сайт заново». Надеюсь речь идет об этой правке конструкций в шаблоне? А то словосочетание «собрать заново» меня немного пугает.
Нескольких шаблонов не нужно бояться. Лучше 2-3 простых шаблона, чем один перегруженный фильтрами.
?
Просто если так должно быть, то у меня данный сниппет перестал работать.