Проблема с двумя формами авторизации

Здравствуйте. У меня появилась одна проблема. На сайте две формы авторизации: одна в шапке сайта во всплывающем окне (соответственно она отображается на каждой странице) и другая на конкретной странице. Проблема в том, что если авторизоваться с той конкретной страницы, то после авторизации вместо отображения приветственного сообщения, происходит редирект на главную. Если авторизоваться через форму в шапке, то все нормально работает. Путем нескольких экспериментов я пришла к выводу, что происходит какой-то конфликт между этими двумя формами авторизации. Подскажите пожалуйста, в чем может быть дело и каким образом можно решить эту проблему?
Код чанка с авторизацией в шапке:
[[!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>`]]
Елена
27 апреля 2015, 10:56
modx.pro
1
1 388
0

Комментарии: 16

Воеводский Михаил
27 апреля 2015, 15:27
0
1. На отдельной странице вынесите вызов Login за пределы логической конструкции. В текущем виде это характерный пример похода, после которого появляются мнения «MODX всегда дико тормозит».
2. В вызове Login на отдельной странице укажите параметр &actionKey, задайте ему значение скрытого поля в форме. Значение должно быть отличным от 'service'. После этого 2 вызова Login перестанут перехватывать формы авторизации друг друга, и у Вас появится понимание, как дальше все настроить.
3. Укажите категорию этого тикета «Вопросы».
    Елена
    27 апреля 2015, 20:30
    0
    Благодарю вас за ответ. Категория «Вопросы» вроде или что-то не так? Извините, я не очень крутой специалист-программист, поэтому кое-что спрошу для уточнения. Указания &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>
      Воеводский Михаил
      27 апреля 2015, 20:56
      0
      Правильно, «Вопросы».

      Да, &actionKey должно быть достаточно, если еще и в форме на отдельной странице «service» заменить на значение параметра.

      Я не говорил, что именно тот вызов сильно замедляет. Но это пример, как делать не стоит, ибо злоупотребление может замедлить.

      В приведенном шаблоне можно оптимизировать использование фильтров ввода-вывода, чтобы не выполнялись лишние сниппеты. С другой стороны, если Вас скорость работы сайта полностью устраивает, то эта оптимизация может быть не слишком оправданной.
        Елена
        28 апреля 2015, 06:54
        0
        Кошмар какой-то. Добавила, как вы посоветовали, к вызову второго Loginа &actionKey, его значение присвоила атрибуту name скрытого поля вместо service. И все равно меня кидает на главную после щелка по кнопке Вход. Я прям уже из сил выбилась. Скажите, а для &actionKey обязательно в связке может указать &loginKey? Помогите пожалуйста.

        Насчет того, что делать не стоит, я подсмотрела это решение у одного программиста и пришла к выводу, что так, наверное, лучше. Действительно, зачем плодить кучу шаблонов. А вставлять на страницу вызов того или иного сниппета или чанка, учитывая, что его администрировать может человек, далекий от всего этого, тоже не есть хорошо. Поэтому лучше зашить в шаблон. Но не знала, что так «делать не стоит» и что это тормозит работу.

        Понимаете, какая штука. Сайт при относительной несложности функционала жутко нагружает ресурсы сервера. Бывают моменты, когда админка постоянно не прогружается корректно. И я все не могу понять, в чем причина. Поэтому теперь я задаюсь вопросом, а может причина как раз в этом.
          Воеводский Михаил
          28 апреля 2015, 09:38
          0
          Напишите мне на почту доступ к сайту mail # compaero.ru
            Елена
            28 апреля 2015, 14:48
            0
            Извините, я не поняла адреса вашей почты. Напишите поточнее.
              Воеводский Михаил
              28 апреля 2015, 14:52
              0
              Замените решетку на собаку (@) и уберите пробелы между словами.
              В таком виде адрес написан, чтобы роботам хотя бы немного сложнее было его занести в спам-базы.
                Елена
                28 апреля 2015, 14:55
                0
                :) То есть ваш адрес мэйл собака компаеро?
                  Воеводский Михаил
                  28 апреля 2015, 14:57
                  0
                  Еще «точка ру» :)
                    Елена
                    28 апреля 2015, 14:59
                    0
                    Ну, это само собой :). Написала вам доступ в админку. Посмотрите, может я что-то не учла?
          Воеводский Михаил
          29 апреля 2015, 02:09
          0
          &actionKey Вы добавили сами, этот параметр работал корректно.
          Для отключения переадресации необходимо было добавить &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 и, если произойдет совпадение, после подстановки значения образуется новый для выполнения тег.

          Таким образом, сниппет запустится только на одной единственной странице, а не на всех сразу.
          Если так изменить все остальные условия, Вы сразу же заметите разницу в скорости загрузки страниц с этим шаблоном.
            Елена
            29 апреля 2015, 05:14
            0
            Не зря говорят, век живи, век учись. :) При вызове первого Login я убрала переадресацию, поэтому не могла подумать, почему она происходит при повторном вызове сниппета.

            Спасибо вам огромное за подробное объяснение по поводу фильтров. Теперь не буду так делать. ) Еще на почту вы мне написали, что советуете «собрать сайт заново». Надеюсь речь идет об этой правке конструкций в шаблоне? А то словосочетание «собрать заново» меня немного пугает.
              Воеводский Михаил
              29 апреля 2015, 10:25
              0
              Нужно не только с такими вызовами фильтров разобраться, но и заново пересмотреть структуру. Имеющееся обилие фильтров всегда будут потенциальным источником головной боли.

              Нескольких шаблонов не нужно бояться. Лучше 2-3 простых шаблона, чем один перегруженный фильтрами.
              Елена
              29 апреля 2015, 08:51
              0
              И еще, Михаил. По поводу вашего совета. Может я опять что-то не поняла. Если сниппет с параметрами вызывать, то должно быть вот так например:
              [[[[*id:is=`75`:then=`!ForgotPassword`:else=`-`]] &tpl=`lgnForgotPassTpl` &emailTpl=`lgnForgotPassEmail` &emailSubject=`Заказан сброс пароля` &sentTpl=`lgnForgotPassSentTpl` &resetResourceId=`76`]]
              ?
              Просто если так должно быть, то у меня данный сниппет перестал работать.
                Елена
                29 апреля 2015, 08:55
                0
                Ой, прошу прощения. На последнее сообщение можете не отвечать. Я разобралась, в чем ошибка. :)
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        16