• avatar paic
  • 0
Спасибо огромное!

И если можно, уже другой вопрос.
Если я авторизован в админке сайта и одновременно авторизован в профле зарегистрированного пользователя, то очень часто выбрасывает из админке. Приходится авторизоваться повторно, после чего выбрасывает из профиля веб-пользователя. Как с этим бороться?
$id = $modx->getLoginUserID('web');
if (!$id) {
$FormLister->renderTpl = 'formNoRegistered';} else {
$FormLister->renderTpl = 'formYesRegistered';
}
  • avatar paic
  • 0
Вот дошел и до prepare, но с ним у меня похуже, как мне представляется, должно быть так
$id = $modx->getLoginUserID('web');
if (!$id) {
    $FormLister->config->setConfig(array(
        'formTpl'=>'formNoRegistered'
        ));
} else {
    $FormLister->config->setConfig(array(
        'formTpl'=>'formYesRegistered'
        ));
}

где formYesRegistered и formNoRegistered — названия чанков с формами для зарегистрированного и не зарегистрированного пользователей. Но он не работает, что-то я упустил ((
Как «передать глобальный плейсхолдер» (поле) из «оборачивающего» поля во вложенное групповое? Пример:

'templates' => [
  'owner' => '[+images+]',
   
  'images' => '<img src="[[phpthumb? &input=`[+image+]` &options=`[+crop_global+]`]]">',
],

'fields' => [
   'crop_global' => [
       'caption'  => 'Обрезка картинок',
       'type'     => 'dropdown',
       'elements' => 'w=1074||w=537||w=268',          
   ],  
         
   'images' => [
      'caption' => 'Картинки',
      'type'    => 'group',
      'fields' => [
         'image' => [
             'caption' => 'Картинка',
             'type'    => 'image',
         ],            
      ],
   ],
],


Хотелось бы один раз задать поле crop_global, чтобы потом не задавать его отдельно для каждой картинки, а чтобы его значение использовалось для обрезки любой новой картинки во вложенном групповом поле images.

Но внутри вложенного шаблона «внешний» плейсхолдер недоступен. Есть ли какие-то варианты?
Еще раз говорю — через prepare можно менять любые параметры как угодно.
  • avatar paic
  • 0
Для красоты и удобства — значительно приятнее зарегистрированному пользователю сайта видеть форму с 1-2 полями для заполнения и одной кнопкой, без капчи и политики конфиденциальности (он уже с ней согласился при регистрации), плюс у зарегистрированного пользователя есть накопительная скидка, которую нужно отразить.

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

А аннотацию перед формой меняю с помощью Вашего сниппета LoginWidget — вполне себе достойный заменитель Personalize, который теперь тоже можно выкинуть))
Можно было бы и формы менять с помощью LoginWidget внутри tpl, но в этом случае капча в форме для незарегистрированного пользователя почему-то не отображается.
eFilter шагает по планете — приятно :)
Не знаю почему, но у меня первая ассоциация с розеткой))
Если уже используется defaultsSource, то зачем эти инпуты скрытые, данные и так попадут в обработку. Параметр keepDefaults как бы есть еще.
Да, инпут с кнопкой.
  • avatar paic
  • 0
Имеется ввиду 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>

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

А по удалению профиля не подскажете? Я так понял — там один инпут для пароля и кнопка «Удалить» или еще что-то надо?
Через prepare можно подменять настройки.
  • avatar paic
  • 0
В общем, послушался умных людей (а куда деваться?) и переписал весь сайт на 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 сам подключал нужный шаблон.

Спасибо.
(:
Да, конечно можно применять разные приемы. Но тип данных JSON в базе данных для того и придуман что-бы облегчить жизнь программистам. В фреймворке Laravel версии 5.2.23 или выше есть возможность работать с типом данных JSON из коробки. А учитывая что началась работа над EVO 2 (перенос функционала Eloquent ORM) можно предположить что и возможность свободно использовать конструктор запросов для формирования запроса в формате JSON тоже будет работать.
перебрать все документы и обработать PHP кодом

Можно использовать предикаты LIKE и RLIKE в запросе к БД. Вот парочка простых примеров:

<?php
//1. Хотим получить документы в которых ЗАПОЛНЕНЫ ВСЕ ПОЛЯ image в MultiTV
/*
$where='tmplvarid=52 AND value LIKE "%\"fieldValue\":%" AND value NOT LIKE "%\"image\":\"\"%"';
*/
	
//2. Хотим получить документы в которых ЗАПОЛНЕНО ХОТЯ БЫ ОДНО ПОЛЕ image в MultiTV
/**/
$where='tmplvarid=52 AND value RLIKE "\"image\":\"[^\"]"';
/**/

//выполняем запрос
$res=$modx->db->select('contentid,value',$modx->getFullTableName('site_tmplvar_contentvalues'),$where);
if($res){
	//выводим результаты
	while($row=$modx->db->getRow($res)){
		echo $row['contentid'].' - '.$modx->getDocument($row['contentid'],'pagetitle')['pagetitle'].'
';
		echo $row['value'].'

';
	}
}
  • avatar paic
  • 0
да есть у меня эта форма, лежит в закромах)) Но если по уму, так надо все переделывать — и форму регистрации с дополнительными полями и как-то эти поля состыковать с имеемой таблицей от addWebUserFields, и формы заказа, а их две — для зарегистрированного пользователя (данные подтягиваются из аккаунта) и не зарегистрированного пользователя (обычная). Это навскидку, а там и еще что-то подтянется…
P.S. Про FormLister в курсе, но это не новый проект и все переделывать не хочется

Явно было бы быстрее переделать форму логина на FormLister, чем два дня заниматься бесполезными изысканиями ((:
Тип данных JSON в базе данных появился не так уж и давно. (Имеено как тип данных JSON, а не строка json) И появились инструменты для работы с json прямо в базе данных.
Что это дает — более быструю выборку документов. Например у вас есть 10 тыс товаров и к каждому товару вы привязали какой нибудь multiTV параметр. Потом было принято решение что-бы этот multiTV параметр участвовал в фильтре (выборке\сортировке). Если данные хранятся как просто строка json — то надо будет перебрать все 10 тысяч документов (TV параметров) и обработать их PHP кодом. Если тип данных JSON то можно изловчиться и эту работу переложить на сервер базы данных (Это он делает хорошо в большинстве случаев).
Или другой пример — есть MultiTV параметр с картинкой и описанием, у каких-то документов картинки не заполенены. Надо получить список с картинками/без картинок. Опять-же надо перебрать все документы и обработать PHP кодом или возложить эту работу на базу данных.
  • avatar paic
  • 0
Что еще заметил.
1. На сайте установлен сниппет Personalize, используется в шапке сайта для смены ссылок Войти/Выйти и Регистрация/Личный кабинет. Так вот сейчас он при авторизации сразу не срабатывает, хотя при авторизации страница перегружается. Надо еще раз перегрузить или перейти куда-то по меню.
2. При обновлении из таблицы modx_active_users исчезла колонка ip, в структуре таблицы она осталась, а из дампа исчезла.