Проблема с двумя формами авторизации
Здравствуйте. У меня появилась одна проблема. На сайте две формы авторизации: одна в шапке сайта во всплывающем окне (соответственно она отображается на каждой странице) и другая на конкретной странице. Проблема в том, что если авторизоваться с той конкретной страницы, то после авторизации вместо отображения приветственного сообщения, происходит редирект на главную. Если авторизоваться через форму в шапке, то все нормально работает. Путем нескольких экспериментов я пришла к выводу, что происходит какой-то конфликт между этими двумя формами авторизации. Подскажите пожалуйста, в чем может быть дело и каким образом можно решить эту проблему?
Код чанка с авторизацией в шапке:
Код чанка с авторизацией в шапке:
[[!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
1. На отдельной странице вынесите вызов Login за пределы логической конструкции. В текущем виде это характерный пример похода, после которого появляются мнения «MODX всегда дико тормозит».
2. В вызове Login на отдельной странице укажите параметр &actionKey, задайте ему значение скрытого поля в форме. Значение должно быть отличным от 'service'. После этого 2 вызова Login перестанут перехватывать формы авторизации друг друга, и у Вас появится понимание, как дальше все настроить.
3. Укажите категорию этого тикета «Вопросы».
2. В вызове Login на отдельной странице укажите параметр &actionKey, задайте ему значение скрытого поля в форме. Значение должно быть отличным от 'service'. После этого 2 вызова Login перестанут перехватывать формы авторизации друг друга, и у Вас появится понимание, как дальше все настроить.
3. Укажите категорию этого тикета «Вопросы».
Благодарю вас за ответ. Категория «Вопросы» вроде или что-то не так? Извините, я не очень крутой специалист-программист, поэтому кое-что спрошу для уточнения. Указания &actionKey будет достаточно для корректной работы Login на отдельной странице? И еще. Вы говорите, что нужно вынести вызов сниппета за пределы логической конструкции, так как это тормозит работу движка. Скажите, а вот подобные конструкции в шаблоне сайта могут нагружать сильно базу данных:
<!DOCTYPE html>
<html>
[[$head]]
<body>
[[$header]][[$header_mobile]]
<div class="container">
<h1>[[*pagetitle]]</h1>
[[*id:is=`70`:then=`[[!Shopkeeper@cartCatalog?propertySetName=`cartCatalog` &cartType=`full`]]
`]]
[[*id:is=`71`:then=`[[!$LoginRegisterTpl]]`]]
[[*id:is=`72`:then=`[[!Shopkeeper@cartCatalog?propertySetName=`cartCatalog` &cartType=`full`]]
[[!$orderTpl]]`]]
[[*id:is=`74`:then=`[[!Register? &submitVar=`registerbtn` &usergroups=`Покупатели` &activation=`0` &successMsg=`<p class="red">Спасибо за регистрацию! Теперь вы можете авторизоваться с вашим паролем и логином:</p>
<p>Логин: <strong>[[!+reg.username]]</strong><br />Пароль: <strong>[[!+reg.password]]</strong></p>` &validate=`nospam:blank, username:required, password:required, password_confirm:password_confirm=^password^, fullname:required, email:required:email`&placeholderPrefix=`reg.`]]
[[!$registerTpl]]`]]
[[*id:is=`75`:then=`[[!ForgotPassword? &tpl=`lgnForgotPassTpl` &emailTpl=`lgnForgotPassEmail` &emailSubject=`Заказан сброс пароля` &sentTpl=`lgnForgotPassSentTpl` &resetResourceId=`76`]]`]]
[[*id:is=`76`:then=`[[!ResetPassword? &tpl=`lgnResetPassTpl` &loginResourceId=`1`]]`]]
[[*id:is=`77`:then=`[[!ChangePassword? &submitVar=`cpbtn` &placeholderPrefix=`cp.` &validateOldPassword=`1` &validate=`nospam:blank` &successMessage=`Пароль изменен`]]
[[!$changePasswordTpl]]`]]
[[*id:is=`78`:then=`[[!UpdateProfile? &placeholderPrefix=`usr`]]
[[!$accountTpl]]`]]
[[*content]]
</div>
[[$subfooter]]
[[$footer]]
</body>
</html>
Правильно, «Вопросы».
Да, &actionKey должно быть достаточно, если еще и в форме на отдельной странице «service» заменить на значение параметра.
Я не говорил, что именно тот вызов сильно замедляет. Но это пример, как делать не стоит, ибо злоупотребление может замедлить.
В приведенном шаблоне можно оптимизировать использование фильтров ввода-вывода, чтобы не выполнялись лишние сниппеты. С другой стороны, если Вас скорость работы сайта полностью устраивает, то эта оптимизация может быть не слишком оправданной.
Да, &actionKey должно быть достаточно, если еще и в форме на отдельной странице «service» заменить на значение параметра.
Я не говорил, что именно тот вызов сильно замедляет. Но это пример, как делать не стоит, ибо злоупотребление может замедлить.
В приведенном шаблоне можно оптимизировать использование фильтров ввода-вывода, чтобы не выполнялись лишние сниппеты. С другой стороны, если Вас скорость работы сайта полностью устраивает, то эта оптимизация может быть не слишком оправданной.
Кошмар какой-то. Добавила, как вы посоветовали, к вызову второго Loginа &actionKey, его значение присвоила атрибуту name скрытого поля вместо service. И все равно меня кидает на главную после щелка по кнопке Вход. Я прям уже из сил выбилась. Скажите, а для &actionKey обязательно в связке может указать &loginKey? Помогите пожалуйста.
Насчет того, что делать не стоит, я подсмотрела это решение у одного программиста и пришла к выводу, что так, наверное, лучше. Действительно, зачем плодить кучу шаблонов. А вставлять на страницу вызов того или иного сниппета или чанка, учитывая, что его администрировать может человек, далекий от всего этого, тоже не есть хорошо. Поэтому лучше зашить в шаблон. Но не знала, что так «делать не стоит» и что это тормозит работу.
Понимаете, какая штука. Сайт при относительной несложности функционала жутко нагружает ресурсы сервера. Бывают моменты, когда админка постоянно не прогружается корректно. И я все не могу понять, в чем причина. Поэтому теперь я задаюсь вопросом, а может причина как раз в этом.
Насчет того, что делать не стоит, я подсмотрела это решение у одного программиста и пришла к выводу, что так, наверное, лучше. Действительно, зачем плодить кучу шаблонов. А вставлять на страницу вызов того или иного сниппета или чанка, учитывая, что его администрировать может человек, далекий от всего этого, тоже не есть хорошо. Поэтому лучше зашить в шаблон. Но не знала, что так «делать не стоит» и что это тормозит работу.
Понимаете, какая штука. Сайт при относительной несложности функционала жутко нагружает ресурсы сервера. Бывают моменты, когда админка постоянно не прогружается корректно. И я все не могу понять, в чем причина. Поэтому теперь я задаюсь вопросом, а может причина как раз в этом.
Напишите мне на почту доступ к сайту mail # compaero.ru
Извините, я не поняла адреса вашей почты. Напишите поточнее.
Замените решетку на собаку (@) и уберите пробелы между словами.
В таком виде адрес написан, чтобы роботам хотя бы немного сложнее было его занести в спам-базы.
В таком виде адрес написан, чтобы роботам хотя бы немного сложнее было его занести в спам-базы.
:) То есть ваш адрес мэйл собака компаеро?
Еще «точка ру» :)
Ну, это само собой :). Написала вам доступ в админку. Посмотрите, может я что-то не учла?
Хорошо, ближе к вечеру посмотрю.
&actionKey Вы добавили сами, этот параметр работал корректно.
Для отключения переадресации необходимо было добавить &loginResourceId=`[[*id]]`.
Что касается чрезмерного количества условий в шаблоне — парсер MODX сначала обрабатывает самые внутренние вложенные конструкции, и только потом внешние.
Пример:
Поскольку большинство страниц, к которым применен шаблон, служебные, вызовы необходимых сниппетов правильнее писать непосредственно в их поле content, а в шаблоне вместо кучи строк с проверкой ID сделать простой вызов [[*content]].
Но если уж хочется сделать все в одном шаблоне с проверкой ID, используйте такие конструкции:
Таким образом, сниппет запустится только на одной единственной странице, а не на всех сразу.
Если так изменить все остальные условия, Вы сразу же заметите разницу в скорости загрузки страниц с этим шаблоном.
Для отключения переадресации необходимо было добавить &loginResourceId=`[[*id]]`.
Что касается чрезмерного количества условий в шаблоне — парсер MODX сначала обрабатывает самые внутренние вложенные конструкции, и только потом внешние.
Пример:
[[*id:is=`72`:then=`[[!Shopkeeper@cartCatalog?propertySetName=`cartCatalog` &cartType=`full`]]
[[!$orderTpl]]`]]
Сначала будет запущен в работу сниппет Shopkeeper со всеми параметрами и обработан чанк orderTpl, и только потом запустится проверка условия по ID. Но если ID не совпадет, то результат работы первого шага выводить не нужно. Он и не выведется. А время на обработку уже затрачено.Поскольку большинство страниц, к которым применен шаблон, служебные, вызовы необходимых сниппетов правильнее писать непосредственно в их поле content, а в шаблоне вместо кучи строк с проверкой ID сделать простой вызов [[*content]].
Но если уж хочется сделать все в одном шаблоне с проверкой ID, используйте такие конструкции:
[[[[*id:is=`72`:then=`!Shopkeeper`:else=`-`]]@cartCatalog?propertySetName=`cartCatalog` &cartType=`full`]]
[[[[*id:is=`72`:then=`!$orderTpl`:else=`-`]]]]
Разница по сравнению с первым вариантом в том, сначала выполнится внутреннее условие проверки по ID и, если произойдет совпадение, после подстановки значения образуется новый для выполнения тег. Таким образом, сниппет запустится только на одной единственной странице, а не на всех сразу.
Если так изменить все остальные условия, Вы сразу же заметите разницу в скорости загрузки страниц с этим шаблоном.
Не зря говорят, век живи, век учись. :) При вызове первого Login я убрала переадресацию, поэтому не могла подумать, почему она происходит при повторном вызове сниппета.
Спасибо вам огромное за подробное объяснение по поводу фильтров. Теперь не буду так делать. ) Еще на почту вы мне написали, что советуете «собрать сайт заново». Надеюсь речь идет об этой правке конструкций в шаблоне? А то словосочетание «собрать заново» меня немного пугает.
Спасибо вам огромное за подробное объяснение по поводу фильтров. Теперь не буду так делать. ) Еще на почту вы мне написали, что советуете «собрать сайт заново». Надеюсь речь идет об этой правке конструкций в шаблоне? А то словосочетание «собрать заново» меня немного пугает.
Нужно не только с такими вызовами фильтров разобраться, но и заново пересмотреть структуру. Имеющееся обилие фильтров всегда будут потенциальным источником головной боли.
Нескольких шаблонов не нужно бояться. Лучше 2-3 простых шаблона, чем один перегруженный фильтрами.
Нескольких шаблонов не нужно бояться. Лучше 2-3 простых шаблона, чем один перегруженный фильтрами.
И еще, Михаил. По поводу вашего совета. Может я опять что-то не поняла. Если сниппет с параметрами вызывать, то должно быть вот так например:
Просто если так должно быть, то у меня данный сниппет перестал работать.
[[[[*id:is=`75`:then=`!ForgotPassword`:else=`-`]] &tpl=`lgnForgotPassTpl` &emailTpl=`lgnForgotPassEmail` &emailSubject=`Заказан сброс пароля` &sentTpl=`lgnForgotPassSentTpl` &resetResourceId=`76`]]
? Просто если так должно быть, то у меня данный сниппет перестал работать.
Ой, прошу прощения. На последнее сообщение можете не отвечать. Я разобралась, в чем ошибка. :)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.