Нужна помощь по личному кабинету для веб-пользователя

Всем добрый день!

Делаю сайт с личным кабинетом для веб-пользователей.

С чем столкнулся и чего еще не хватает для полного счастья (не нашел, не хватило ума, не придумал, другие причины — далее сокращенно ННН).
Прошу оказать помощь в следующих вопросах:

1. Очень желательно, чтобы с удалением акаунта веб-пользователем автоматически удалялись и все его объявления. По причинам: не засорять сайт лишними объявлениями — уже ненужными (веб-пользователь свою задачу решил, а прибрать за собой поленился), фейковыми (нехороший человек зарегился, наклепал всякой фигни, и удалился), тренировочными (зарегился — потестировал, и ушел), и много других причин. А это все будет висеть на сайте.
Как можно такое сделать?

2. Заблокированный пользователь. Причины аналогичные п.1, но с другого боку — веб-пользователь никуда не делся и не собирается, но нарушает правила сайта. Его админ банит. Нужно сделать так, чтобы объявления заблокированного пользователя и его данные на сайт не выводились.
2.1. Если по пользователям все понятно — они выводятся DL из свой таблицы web_user_attributes и их можно без проблем отфильтровать через addWhereList.
2.2. То по объявлениям сложнее. Вообще в каждом объявлении есть ТВ aid для определения авторства при редактировании объявления. В принципе, по этому параметру можно вытащить и его статус, что он забанен. А как отфильтровать? Поймет ли DL, ведь в этом случае от выводит объявления из таблицы content, а там такого столбца blocked нет, и ТВ такого тоже нет. Возможно (ННН), какие-то варианты и есть, подскажите в какую сторону посмотреть.

3. Администрирование веб-пользователей. То что есть в EVO (MODx EVO) — это очень неудобно и малофункционально. Для примера, у WebLoginPE есть такой параметр type=manager с соответствующими функционалом и шаблонами.

У FL пока ничего подобного нет (ННН). Возможно, что-то можно скомпоновать на базе существующих инструментов.
Например, можно сделать неопубликованную страницу для админа (залогиненный админ будет ее видеть), вывести на эту страницу всех менеджеров, может просмотреть их данные. Сегодня уважаемый Pathologic опубликовал замечательный плагин userAuth, с помощью которого админ сайта может войти в личный кабинет пользователя, просмотреть его профиль и объявления, оказать помощь в плане техподдержки, если у веб-пользователя что-то не получается. Ну и это все. Из карательных мер — только удалить непонравившиеся объявления (их веб-пользователь восстановить не сможет).
А надо бы, чтобы была возможность заблокировать или разблокировать, написать сообщение веб-пользователю (какое-то разъяснение, напоминание, причины блокировки и т.п.). Возможно, повесить какое-то уведомление в личном кабинете веб-пользователя и т.д. и т.п. хотя бы в объеме WebLoginPE (я уже не помню всех его возможностей, но вроде бы он меня устраивал).
Как можно сделать удобный раздел модерации для админа сайта?

Спасибо

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

avatar
1 и 2 — с помощью плагина вешает на события
для первого «OnBeforeWUsrFormDelete» или «OnWUsrFormDelete» точно не помню
а для второго «OnBeforeWUsrFormSave» или «OnWUsrFormSave» точно не помню

3 если нужен удобный функционал лучше написать свой модуль управления пользователями как тебе нужно и там же прописать функцию удаление объявлений. Если нужно по подробнее пиши в телеграмм @DG_send
avatar
Спасибо! А в личку можно? а то у меня с телеграмм пока как-то не сложилось…
avatar
пиши
avatar
Может у кого есть еще какие другие идеи по реализации?
avatar
В общем, по модулю пока ничего не делал, может и не буду. Но некоторые подвижки получились.
1. Удаление пользователя в личном кабинете (когда он сам себя удаляет) сделал так
[!FormLister?
&formid=`delete`
&controller=`DeleteUser`
&prepareAfterProcess=`delete_prepare`
&rules=`{
"password":{
	"required":"Обязательно введите пароль"
}
}`
&formTpl=`@CODE:[+form.messages+]
		<div class="row">
			<form method="post">
				<input type="hidden" name="formid" value="delete">
					<div class="col-md-12 col-sm-12">
						<div class="form-group">
							<input type="password" class="form-control" id="password" placeholder="Пароль" name="password" value="">
						[+password.error+]
						</div>
					</div>
					<div class="col-md-12 col-sm-12">
                                            <button class="btn btn-default">Удалить профиль <i class="fa fa-user-times"></i></button>
					    <button type="button" onclick="history.back();" class="btn btn-default orang">Отменить <i class="fa fa-reply"></i></button>
                                     </div>
				</form>
			 </div>`
&messagesOuterTpl=`@CODE:<div class="col-md-12 col-sm-12 col-xs-12 alert alert-danger" role="alert">[+messages+]</div>`
&errorTpl=`@CODE:<span class="error">[+message+]</span>`
&redirectTo=`1`
&to=`[(emailsender)]`
&subject=`Пользователь удален`
&reportTpl=`@CODE:
<p>Имя: [+username.value+]</p>
<p>Имя: [+fullname.value+]</p>
<p>Телефон: [+phone.value+]</p>
<p>Email: <a href="mailto:[+email.value+]">[+email.value+]</a></p>
<p>id объявления: [+id.value+]</p>`
!]

и сниппет delete_prepare
<?php
global $modx, $table_prefix;
$table = $modx->getFullTableName('site_tmplvar_contentvalues');
$table2 = $modx->getFullTableName('site_content');
//получаем id веб-пользователя
$user = $modx->getLoginUserId('web');
// получаем список id объявлений веб-пользователя
$res = $modx->db->select("contentid", $table, "tmplvarid='7' AND value='".$user."'");
$ids_user = '';
while ($row=$modx->db->getRow($res)) {
    $ids[] = $row['contentid'];
        $ids_user = implode(',', $ids);
}
// удаляем все его объявления
	$modx->db->delete($table2, "id IN ($ids_user)");
// удаляем TV этих объявлений
	$modx->db->delete($table, "contentid IN ($ids_user)");

где tmplvarid=7 — это ТВ параметр, в котором прописан aid автора объявления,
prepareAfterProcess — чтобы сниппет запускался после успешного удаления веб-пользователя.

2. Аналогично — в админке, когда веб-пользователя удаляет администратор сайта, через плагин (надоумил d-fm1301 , за что ему спасибо).
3. При блокировании веб-пользователя администратором сайта — тоже плагин, который отменяет публикацию всех объявлений блокируемого веб-пользователя, поэтому DL тревожить не пришлось, он неопубликованные документы и так не выводит.

Но попутно возник другой вопрос — а как быть с картинками от этих объявлений? Страницу удалил, тв-шки тоже, а картинки остались((((

Подскажите, как удалить картинки из папки images и из папки galleries (на удаляемых страницах есть фотогалерея SimpleGallery) одновременно с удалением страниц, к которым они прикреплены?

Спасибо.
  • paic
  • 0
avatar
Перед удалением tv взять с них адреса картинок, удалить их оригиналы (адрес брать из тв) и кэшированные обрезки (если есть, найти с помощью функции glob зная часть адреса и имя) — unlink ($filename). Аналогично — для галереи. А только потом уже удалять сами записи tv и в последнюю очередь — объявления.

Удаление картинок проще вынести в отдельный сниппет, передавая туда, например id ресурса и id tv с картинкой. В этом случае его можно будет использовать однотипно везде — и в плагинах и в других сниппетах, вроде prepare для formlister.
Комментарий отредактирован 2018-11-15 16:33:21 пользователем webber
avatar
Спасибо! И точно (спасибо за подсказку) еще же и кэш есть, а еще и thumb вдогонку(((

А еще есть и неиспользованные картинки. Например, при размещении объявления веб-пользователь загрузил одну картинку, а потом он ее еще 3 раза менял — итого: прикрепленная одна (возьму ее из ТВ), а еще 3 лишних просто висят и их адресов нигде не осталось. Одно хорошо — они в одной папке хранятся вместе с прикрепленной (сделал по id, как в SimpleGallery), наверное, можно целиком всю папку удалять, но останутся былые кэш и тумбочки.

Да уж, задачка…
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.