WebLogin при авторизации не перенаправляет на нужную страницу

Добрый день.

Обновляю старый сайт v.1.0.15 на 1.4.0.
Сайт полностью рабочий, с SHK и личным кабинетом на shk_userprofile в связке с WebLogin и addWebUserFields для дополнительных полей.

В общем, все перелопатил и обновилось без проблем, но вдруг возник затык с WebLogin (взят из v.1.3.6) — при авторизации пользователь не перенаправляется в личный кабинет, он остается на страницу авторизации. Более того, страница авторизации не отображается, хром пишет
Страница недоступна
Сайт site.ru пока не может обработать этот запрос.
HTTP ERROR 500
После перезагрузки страница авторизации появляется, с кнопкой Выйти.
Сама авторизация происходит и все остальное тоже работает.
Вызов сниппета
[!WebLogin? &loginhomeid=`2450` &logouthomeid=`1` &tpl=`webLogin-tpl`!]

где 2450 — id страницы личного кабинета.
До обновления все работало корректно.

P.S. Про FormLister в курсе, но это не новый проект и все переделывать не хочется, да есть еще и дополнительные поля в отдельной таблице, и куча веб-пользователей.

Подскажите, кто сталкивался, в какую сторону копать.

Спасибо.

35 комментариев

avatar
Этот хороший сниппет в упор не видит id документа для перенаправления при авторизации, вписывал его и в вызов, и конфигурацию, и даже напрямую в сниппеты ((
avatar
Если есть 500я ошибка, то нужно смотреть серверные логи, в большинстве случаев становится понятно где проблема.

Возможно поможет — http://modx.im/blog/news/5720.html#comment50223
avatar
Спасибо, посмотрел на хостинге в серверных логах ошибка такая
POST /profile/login HTTP/1.1" 500 0 «site.ru/profile/login» «Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36
Не знаю, чем это может помочь ((
Ошибка не постоянно, она возникает в момент, когда ввел логин / пароль и нажал кнопку „Войти“. Но вместо перехода на другую страницу — вот такая ошибка, и сайт остается на странице авторизации. После перезагрузке страница отрывается. Авторизация проходит, но переадресации нет

WebLogin версия 1.2
WebSignup и WebChangePwd — 1.1.2
Комментарий отредактирован 2018-07-15 12:04:40 пользователем paic
avatar
Обновился из extras
github.com/extras-evolution/Weblogin
там те же версии и результат такой же
avatar
В общем, ошибку 500 вроде как поборол.

В файле weblogin.processor.inc.php вместо

        // web users are stored with negative id
        $sql = "REPLACE INTO ".$modx->getFullTableName('active_users')." (internalKey, username, lasthit, action, id) values(-{$_SESSION['webInternalKey']}, '{$_SESSION['webShortname']}', '{$lasthittime}', '{$a}', {$itemid})";
        $modx->db->query($sql);

Прописал, как было в старой версии

        // web users are stored with negative id
	$sql = "REPLACE INTO $dbase.`".$table_prefix."active_users` (internalKey, username, lasthit, action, id, ip) values(-".$_SESSION['webInternalKey'].", '".$_SESSION['webShortname']."', '".$lasthittime."', '".$a."', ".$itemid.", '$ip')";
            if(!$ds = $modx->db->query($sql)) {
                $output = "error replacing into active users! SQL: ".$sql;
                return;
            }

Предварительно в начале файла

$dbase = $modx->dbConfig['dbase'];
$table_prefix = $modx->dbConfig['table_prefix'];


Но по-прежнему не работает перенаправление (параметр loginhomeid).
avatar
Что еще заметил.
1. На сайте установлен сниппет Personalize, используется в шапке сайта для смены ссылок Войти/Выйти и Регистрация/Личный кабинет. Так вот сейчас он при авторизации сразу не срабатывает, хотя при авторизации страница перегружается. Надо еще раз перегрузить или перейти куда-то по меню.
2. При обновлении из таблицы modx_active_users исчезла колонка ip, в структуре таблицы она осталась, а из дампа исчезла.
avatar
P.S. Про FormLister в курсе, но это не новый проект и все переделывать не хочется

Явно было бы быстрее переделать форму логина на FormLister, чем два дня заниматься бесполезными изысканиями ((:
avatar
да есть у меня эта форма, лежит в закромах)) Но если по уму, так надо все переделывать — и форму регистрации с дополнительными полями и как-то эти поля состыковать с имеемой таблицей от addWebUserFields, и формы заказа, а их две — для зарегистрированного пользователя (данные подтягиваются из аккаунта) и не зарегистрированного пользователя (обычная). Это навскидку, а там и еще что-то подтянется…
avatar
В общем, послушался умных людей (а куда деваться?) и переписал весь сайт на FormLister. Выкинул eForm, Weblogin и всякие приблуды к ним, в том числе и таблицу с дополнительными полями (из дополнительных полей кое-что оставил — перенес в основную)и плагин addWebUserFields.
Остался только shk_userprofile, и чтобы все осталось в прежнем виде, я ему в чанк profile_tpl засунул FormLister с контроллером Profile вместо все лобуды, что там было от WebSignup.

Остался не решенным один вопрос и прошу подсказать, как сделать удаление профиля веб-пользователя? Здесь как-то все аскетично
docs.evo.im/04_extras/formlister/udalenie_profilya_polzovatelya.html
и примера нигде не нашел.

И есть для Pathologic предложение по усовершенствованию FormLister.

Суть в следующем. На сайте есть две формы заказа товаров — одна для незарегистрированных пользователей, другая — для зарегистрированных. Переключаются эти формы с помощью сниппета personalize, который тоже хотелось бы выбросить. А вызов FormLister сделать один с двумя шаблонами:
tpl — как обычно, будет использоваться для незарегистрированных пользователей,
tpl_login — шаблон для зарегистрированных пользователей. Отличие этого шаблона — он берет все данные в форму заказа из профиля зарегистрированного пользователя. И для этого уже все есть:
&defaultsSources=`user:web`
и в шаблоне 
	<input name="name" value="[+fullname+]">
	<input name="address" value="[+street+]">
	<input name="state" value="[+state+]">
	<input name="email" value="[+email+]">
	<input name="phone" value="[+phone+]">
и т.д.

И чтобы FormLister сам подключал нужный шаблон.

Спасибо.
avatar
Через prepare можно подменять настройки.
avatar
Имеется ввиду defaultsSources? Но сам шаблон тоже может значительно отличаться. Например, у меня инпуты, которые я указал выше, скрыты. Они для формы, а пользователю выводится еще до формы так:

<p>Имя: <strong>[+fullname+] (<a href="[~2447~]">изменить профиль</a>)</strong></p>
<p>Адрес: <strong>[+street+]</strong></p>
<p>Регион (Область): <strong>[+state+]</strong></p>
<p>Телефон: <strong>[+phone+]</strong></p>
<p>E-mail: <strong>[+email+]</strong></p>

Чтобы он сверил свои данные и при необходимости откорректировал свой профиль.

А по удалению профиля не подскажете? Я так понял — там один инпут для пароля и кнопка «Удалить» или еще что-то надо?
avatar
Да, инпут с кнопкой.
avatar
Если уже используется defaultsSource, то зачем эти инпуты скрытые, данные и так попадут в обработку. Параметр keepDefaults как бы есть еще.
avatar
Для красоты и удобства — значительно приятнее зарегистрированному пользователю сайта видеть форму с 1-2 полями для заполнения и одной кнопкой, без капчи и политики конфиденциальности (он уже с ней согласился при регистрации), плюс у зарегистрированного пользователя есть накопительная скидка, которую нужно отразить.

Но в целом, можно и как Вы сказали, отлично все работает, и даже вроде как keepDefaults не нужен, но на всякий случай прописал. Спасибо!

А аннотацию перед формой меняю с помощью Вашего сниппета LoginWidget — вполне себе достойный заменитель Personalize, который теперь тоже можно выкинуть))
Можно было бы и формы менять с помощью LoginWidget внутри tpl, но в этом случае капча в форме для незарегистрированного пользователя почему-то не отображается.
avatar
Еще раз говорю — через prepare можно менять любые параметры как угодно.
avatar
Вот дошел и до prepare, но с ним у меня похуже, как мне представляется, должно быть так
$id = $modx->getLoginUserID('web');
if (!$id) {
    $FormLister->config->setConfig(array(
        'formTpl'=>'formNoRegistered'
        ));
} else {
    $FormLister->config->setConfig(array(
        'formTpl'=>'formYesRegistered'
        ));
}

где formYesRegistered и formNoRegistered — названия чанков с формами для зарегистрированного и не зарегистрированного пользователей. Но он не работает, что-то я упустил ((
avatar
$id = $modx->getLoginUserID('web');
if (!$id) {
$FormLister->renderTpl = 'formNoRegistered';} else {
$FormLister->renderTpl = 'formYesRegistered';
}
avatar
Спасибо огромное!

И если можно, уже другой вопрос.
Если я авторизован в админке сайта и одновременно авторизован в профле зарегистрированного пользователя, то очень часто выбрасывает из админке. Приходится авторизоваться повторно, после чего выбрасывает из профиля веб-пользователя. Как с этим бороться?
avatar
Обновиться до 1.4.5. Я не помню, в какой версии это исправлено.
Комментарий отредактирован 2018-07-18 21:38:07 пользователем Pathologic
avatar
я, наверное, за эти дни что-то упустил, уже есть 1.4.5? А на гите пока нет ((
github.com/modxcms/evolution
avatar
Подскажите, а нужно обязательно обновлять весь движок или можно ограничиться FormLister и какими-то отдельными компонентами?
avatar
Не долго радовался )) Как оказалось, одной подмены шаблона мало.
Нужно менять и параметры, так как хотя в форме для зарегистрированного пользователя и нет agree и modxCaptcha, FormLister их все-равно требует, подменить эти параметров в препаре так же не увенчались успехом, плюс в форме для незарегистрированного пользователя не отображается капча

<?php
$id = $modx->getLoginUserID('web');
if (!$id) {
$FormLister->config->setConfig(array(
        'formControls'=>'payment,agree',
		'captcha'=>'modxCaptcha'
        ));
$FormLister->renderTpl = 'shopOrderForm';
} else {
$FormLister->config->setConfig(array(
        'formControls'=>'payment'
        ));
$FormLister->renderTpl = 'shopOrderFormRegistered';
}

Вот не везет мне в этот раз с setConfig (( Как же их менять? раньше вроде срабатывало

Скорее всего, с набором параметров rules тоже придется что-то делать — он разный.
И шаблон reportTpl тоже желательно подменять.

Побочный эффект, вызван скорее тем, что сайт не вновь создаваемый, а обновляемый — он связан с разным наименованием полей, например, там где для незарегистрированного пользователя name, то у зарегистрированного — fullname, и т.д. Пока решил этот вопрос прописыванием двойного набора плейсхолдеров, начиная с модуля управления заказами SHK, например
[+fullname+] [+name+] и все остальные аналогично

и в других местах, какой-то один из двух сработает. Но это скорее для тех, кто пожелает наступить на мои грабли))
avatar
Ну, предлагаю выкинуть prepare и использовать обертку, которая и разрулит параметры.
avatar
это по схеме

$id = $modx->getLoginUserID('web');
if (!$id){
return $modx->runSnippet("FormLister", array(
        набор параметров 1
));
}
else {
return $modx->runSnippet("FormLister", array(
	набор параметров 2
));
}

ну или runSnippet один, а через if подменять params?
avatar
Работать одинаково будет, но очевидно же, что держать два почти одинаковых набора параметров неудобно.
avatar
Ну да, ничем не лучше того же Personalize.

Или оставлять один вызов с одной формой (самый первый вариант), в которую в случае авторизации пользователя подставляются значения полей.
Зато есть полезное — понял (на основе результатов тестирования) зачем нужен keepDefaults ))

И еще раз спрошу по выбрасыванию из админки — нужно обязательно обновлять весь движок или можно ограничиться FormLister и какими-то отдельными компонентами (DL, может еще что)? И где искать 1.4.5
avatar
При чем тут personalize. Я имел в виду, что можно снчала задать общие параметры в массиве, а потом по условию добавлять еще параметры или удалять.

github.com/evolution-cms/evolution/tree/1.4.x
avatar
Я это тоже имел ввиду, когда писал о варианте с одним runSnippet.
Но это особой роли не играет — что один раз прописать, что два копипастом. Возможно, есть и более оптимальный вариант, я же исхожу из своего скромного опыта, например, приходилось допиливать и перепиливать eFilterResult и он мне как своего рода образец дружелюбной обертки)
avatar
Оно выбрасывает из админки и просто так, без параллельной авторизации в виде веб-пользователя.
avatar
Получается так, пока для теста (не все параметры прописаны)

<?php
// Общие параметры
$params['controller'] = 'Form';
$params['formid'] = 'shopOrderForm';
$params['prepareProcess'] = 'form_order';
// и т.д. общие параметры

//разные параметры
$id = $modx->getLoginUserID('web');
if (!$id) {
$params['rules'] = '{
"name":{
	"required":"Обязательно введите имя"
},
"address":{
	"required":"Обязательно введите адрес доставки"
},
"region":{
	"required":"Обязательно введите регион"
},
"payment":{
	"required":"Обязательно введите способ оплаты"
},
"email":{
	"required":"Обязательно введите email",
	"email":"Введите email правильно"
},
"phone":{
	"required":"Обязательно введите номер телефона",
	"phone":"Введите номер правильно"
},
"agree":{
	"required":"Вы не можете отправить обращение, если не согласны с правилами обработки персональных данных"
},
"message":{
	"required":"Обязательно введите сообщение",
	"minLength":{
		"params":10,
		"message":"Сообщение должно быть не менее 10 символов"
	}
}
}';
$params['formTpl'] = $formTpl;
$params['formControls'] = 'payment,agree';
$params['captcha'] = 'modxCaptcha';	
$params['captchaParams'] = '{
"width":140,
"height":50
}';		
} else {
$params['rules'] = '{
"payment":{
	"required":"Обязательно укажите способ оплаты"
},
"message":{
	"required":"Обязательно введите сообщение",
	"minLength":{
		"params":10,
		"message":"Сообщение должно быть не менее 10 символов"
	}
}
}';
	
$params['formTpl'] = $formTpl2;
$params['formControls'] = 'payment';
$params['defaultsSources'] = 'user:web';
$params['keepDefaults'] = 'username,fullname,street,email,phone,mobilephone,state,fax,zip,discountInfo';
}

return $modx->runSnippet("FormLister", $params);


Почему-то не отображается валидация message, но может где допустил опечатку, все остальное вроде работает (из того что прописано).

Вызывается
[!tplrender? &formTpl=`shopOrderForm` &formTpl2=`shopOrderFormRegistered`!]

В вызове еще будет reportTpl и reportTpl2
avatar
В итоге для двух типов форм заказа (для не зарегистрированного и зарегистрированного пользователя) получился такой сниппет.
Вызывается так (как и рекомендовал Pathologic для общих параметров, наконец-то дошло))):
[!tplrender? 
&controller=`Form`
&formid=`shopOrderForm`
&prepareProcess=`form_order`			
&formTpl=`shopOrderForm` 
&formTpl2=`shopOrderFormRegistered` 
&reportTpl=`shopOrderReport` 
&reportTpl2=`shopOrderReportRegistered` 
&messagesOuterTpl=`@CODE:<div class="success">[+messages+]</div>`
&errorTpl=`@CODE:<span class="required">[+message+]</span>`
&to=`[(emailsender)]`
&subject=`Заказ в интернет-магазине`
&successTpl=`@CODE:<p>Спасибо, что воспользовались формой заказа на нашем сайте. Ваше сообщение будет рассмотрено нашими менеджерами в кратчайшие сроки.</p>`
&ccSender=`1`
&ccSenderTpl=`@CODE:<p>Здравствуйте, [+name.value+]! Ваш заказ получен и будет рассмотрен в кратчайшие сроки.</p>`
&redirectTo=`15`
!]

Здесь successTpl на случай, если не сработает редирект или если редирект удалить.

И сам сниппет

<?php

$id = $modx->getLoginUserID('web');
if (!$id) {
$params['rules'] = '{
"name":{
	"required":"Обязательно введите имя"
},
"address":{
	"required":"Обязательно введите адрес доставки"
},
"region":{
	"required":"Обязательно введите регион"
},
"payment":{
	"required":"Обязательно введите способ оплаты"
},
"email":{
	"required":"Обязательно введите email",
	"email":"Введите email правильно"
},
"phone":{
	"required":"Обязательно введите номер телефона",
	"phone":"Введите номер правильно"
},
"agree":{
	"required":"Вы не можете отправить обращение, если не согласны с правилами обработки персональных данных"
},
"message":{
	"required":"Обязательно введите сообщение",
	"minLength":{
		"params":10,
		"message":"Сообщение должно быть не менее 10 символов"
	}
}
}';
$params['formTpl'] = $formTpl;
$params['reportTpl'] = $reportTpl;
$params['formControls'] = 'payment,agree';
$params['captcha'] = 'modxCaptcha';	
$params['captchaParams'] = '{
"width":140,
"height":50
}';		
} else {
$params['rules'] = '{
"payment":{
	"required":"Обязательно укажите способ оплаты"
},
"message":{
	"required":"Обязательно введите сообщение",
	"minLength":{
		"params":10,
		"message":"Сообщение должно быть не менее 10 символов"
	}
}
}';
	
$params['formTpl'] = $formTpl2;
$params['reportTpl'] = $reportTpl2;
$params['formControls'] = 'payment';
$params['defaultsSources'] = 'user:web';
$params['keepDefaults'] = 'username,fullname,street,email,phone,mobilephone,state,fax,zip,discountInfo';
}

return $modx->runSnippet("FormLister", $params);

avatar
Можно без json, сразу массивы.
avatar
Пожалуй, это уже в следующий раз(( Тем более в доках и примерах везде так, и как мне кажется, так будет удобнее если где-то что-то потребуется поменять.

Или это на что-то принципиально влияет?

Спасибо за помощь и подсказки.
avatar
Влияет на удобство, и в доках как раз и написано всюду — json или php массив.
avatar
Словил похожую проблему (500 ошибку), помогло отключение плагина userHelper.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.