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

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

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

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

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 (я уже не помню всех его возможностей, но вроде бы он меня устраивал).
Как можно сделать удобный раздел модерации для админа сайта?

Спасибо

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

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), наверное, можно целиком всю папку удалять, но останутся былые кэш и тумбочки.

Да уж, задачка…
avatar
Да нет там никакой особой задачки. SimpleGallery раскидывает свои картинки в пронумерованные по id документа папки, кэш — аналогично. Так что при удалении документа легко проверить наличие этих двух папок и удалить.
С TV сложнее и зависит от того, где хранятся картинки. Если они изначально тоже хранятся в папках, зависящих от id документа, то удалить эти две папки (оригиналов и кэшей) совершенно не сложно. А вот если эти картинки просто разбросаны по другим папкам (например по id пользователя) — то соответственно мы можем получить путь только текущей картинки (ну и ее кэш найти функцией glob, зная имя и часть пути кэша). В этом случае (картинки хранятся в папке пользователя) неиспользуемые можно найти разве что перебором: берем все картинки из папки, берем все картинки всех объявлений пользователя из TV и сравниваем — если в тв нет — удаляем.

Ну а если картинки просто разбросаны по произвольным папкам — то тут уж при удалении объявления неиспользуемые мы и не найдем, т.к. следов не осталось, а перебирать все картинки базы и все картинки во всех папках каждый раз — не очень хорошая идея. Когда у меня была похожая задача с целью очистки диска, я просто писал отдельный сниппет, который собирал все картинки из папок в базу и сверял с записями tv — удалял несуществующие иногда по крону, для очистки места на диске :)
avatar
С TV сложнее и зависит от того, где хранятся картинки. Если они изначально тоже хранятся в папках, зависящих от id документа, то удалить эти две папки (оригиналов и кэшей) совершенно не сложно.
да, именно так и сделано, по типу как в SimpleGallery, только в папке images/property/id. Но в папке кэш все картинки хранятся скопом, без разбиения по папочкам, даже если они есть в папке images((
Когда у меня была похожая задача с целью очистки диска, я просто писал отдельный сниппет, который собирал все картинки из папок в базу и сверял с записями tv — удалял несуществующие иногда по крону, для очистки места на диске :)
Я вот тоже смотрю в сторону этого решения и чистить по необходимости. Но пока не тестировал. Хотя, конечно, лучше изначально не доводить до такого состояния.
avatar
Не совсем понял про кэш. Если картинки режутся phpthumb, то картинки из папки assets/images/property/id/ складируются в папку assets/cache/images/property/id/ — т.е. пути известны :) Имена немного модифицируются — т.е. вместо picture.jpg становится что-то picture-размер-доп.парам.jpg — т.е. фактически с помощью glob(«picture*.jpg») можно получить массив обрезков этой картинки всех размеров и удалить их.
Ну или я не совсем понял проблему поиска кэша :)

Глянул приведенное решение — оно не удаляет кэшированные обрезки, а также может удалить лишние :)
Комментарий отредактирован 2018-11-16 08:44:33 пользователем webber
avatar
Не совсем понял про кэш. Если картинки режутся phpthumb, то картинки из папки assets/images/property/id/ складируются в папку assets/cache/images/property/id/ — т.е. пути известны :)
Так и было раньше. А новая версия 1.4.6 — все скопом (( Посмотрите, плз, как у Вас именно в этой версии, если уже ставили.
avatar
Не ставил, но судя по коду phpthumb ничего вроде не должно поменяться в этом плане. Если поменялось — то наверно это баг и об этом надо написать либо тут отдельной темой либо тут
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.