Файл: base-sys/base/controllers/moderation.php
Строк: 378
<?php
class BASE_CTRL_Moderation extends PEEP_ActionController
{
const ITEMS_PER_PAGE = 20;
public function init()
{
parent::init();
if ( !PEEP::getUser()->isAuthenticated() )
{
throw new AuthenticateException;
}
}
protected function onlyModerators()
{
$isModerator = BOL_AuthorizationService::getInstance()->isModerator();
$isAdmin = PEEP::getUser()->isAdmin();
if ( !$isAdmin && !$isModerator )
{
throw new Redirect403Exception;
}
}
/**
*
* @return BASE_CMP_ContentMenu
*/
protected function getMenu()
{
$event = new BASE_CLASS_EventCollector("base.moderation_tools.collect_menu");
PEEP::getEventManager()->trigger($event);
$menuData = $event->getData();
if ( empty($menuData) )
{
return null;
}
$menu = new BASE_CMP_ContentMenu();
foreach ( array_reverse($menuData) as $item )
{
$element = new BASE_MenuItem();
$element->setUrl($item["url"]);
$element->setLabel($item["label"]);
$element->setIconClass($item["iconClass"]);
$element->setKey($item["key"]);
$menu->addElement($element);
}
return $menu;
}
public function index()
{
$this->setPageTitle(PEEP::getLanguage()->text("base", "moderation_tools"));
$this->setPageHeading(PEEP::getLanguage()->text("base", "moderation_tools"));
$menu = $this->getMenu();
if ( $menu === null )
{
return; // Zero situation
}
$menuItems = $menu->getMenuItems();
$this->redirect(end($menuItems)->getUrl());
}
public function flags( $params )
{
$this->onlyModerators();
$this->setPageTitle(PEEP::getLanguage()->text("base", "moderation_tools"));
$this->setPageHeading(PEEP::getLanguage()->text("base", "moderation_tools"));
$menu = $this->getMenu();
if ( $menu === null )
{
$this->redirect(PEEP::getRouter()->urlForRoute("base.moderation_tools"));
}
$menu->deactivateElements();
$menuItem = $menu->getElement("flags");
if ( $menuItem )
{
$menuItem->setActive(true);
}
$this->addComponent("menu", $menu);
$groups = BOL_FlagService::getInstance()->getContentGroupsWithCount();
if ( !empty($params["group"]) && empty($groups[$params["group"]]) )
{
$this->redirect(PEEP::getRouter()->urlForRoute("base.moderation_flags_index"));
}
$currentGroup = empty($params["group"])
? reset($groups)
: $groups[$params["group"]];
if ( empty($currentGroup) )
{
$this->redirect(PEEP::getRouter()->urlForRoute("base.moderation_tools"));
}
$contentMenu = new BASE_CMP_VerticalMenu();
$sideMenuOrder = 1;
foreach ( $groups as $groupKey => $group )
{
$item = new BASE_VerticalMenuItem();
$item->setKey($groupKey);
$item->setUrl($group["url"]);
$item->setNumber($group["count"]);
$item->setLabel($group["label"]);
$item->setActive($currentGroup["name"] == $group["name"]);
$item->setOrder($sideMenuOrder++);
$contentMenu->addElement($item);
}
$this->addComponent("contentMenu", $contentMenu);
// Paging
$page = (isset($_GET['page']) && intval($_GET['page']) > 0) ? $_GET['page'] : 1;
$perPage = self::ITEMS_PER_PAGE;
$limit = array(
($page - 1) * $perPage,
$perPage
);
$this->addComponent("paging", new BASE_CMP_Paging($page, ceil($currentGroup["count"] / $perPage), 5));
// List
$flags = BOL_FlagService::getInstance()->findFlagsByEntityTypeList($currentGroup["entityTypes"], $limit);
$entityList = array();
$userIds = array();
$reporterIds = array();
foreach ( $flags as $flag )
{
$entityList[$flag->entityType] = empty($entityList[$flag->entityType])
? array()
: $entityList[$flag->entityType];
$entityList[$flag->entityType][] = $flag->entityId;
$reporterIds[$flag->userId] = $flag->userId;
}
$contentData = array();
foreach ( $entityList as $entityType => $entityIds )
{
$infoList = BOL_ContentService::getInstance()->getContentList($entityType, $entityIds);
foreach ( $infoList as $entityId => $info )
{
$userIds[] = $info["userId"];
$contentData[$entityType . ':' . $entityId] = $info;
}
}
$avatarData = BOL_AvatarService::getInstance()->getDataForUserAvatars($userIds);
$reporterUrls = BOL_UserService::getInstance()->getUserUrlsForList($reporterIds);
$reporterNames = BOL_UserService::getInstance()->getDisplayNamesForList($reporterIds);
$tplFlags = array();
foreach ( $flags as $flag )
{
$content = $contentData[$flag->entityType . ":" . $flag->entityId];
$contentPresenter = new BASE_CMP_ContentPresenter($content);
$userName = $avatarData[$content["userId"]]["title"];
$userUrl = $avatarData[$content["userId"]]["url"];
$label = empty($content["label"]) ? $content["typeInfo"]["entityLabel"] : $content["label"];
$tplFlags[] = array(
"content" => $contentPresenter->render(),
"avatar" => $avatarData[$content["userId"]],
"string" => PEEP::getLanguage()->text("base", "moderation_flags_item_string", array(
"userName" => $userName,
"userUrl" => $userUrl,
"content" => strtolower($label)
)),
"contentLabel" => strtolower($label),
"entityType" => $flag->entityType,
"entityId" => $flag->entityId,
"time" => UTIL_DateTime::formatDate($flag->timeStamp),
"reason" => $flag->reason,
"reporter" => array(
"url" => $reporterUrls[$flag->userId],
"name" => $reporterNames[$flag->userId]
)
);
}
$uniqId = uniqid("m-");
$this->assign("uniqId", $uniqId);
$this->assign("flags", $tplFlags);
$this->assign("group", $currentGroup);
$this->assign("responderUrl", PEEP::getRouter()->urlFor(__CLASS__, "flagsResponder", array(
"group" => $currentGroup["name"]
)));
PEEP::getLanguage()->addKeyForJs("base", "are_you_sure");
PEEP::getLanguage()->addKeyForJs("base", "moderation_delete_confirmation");
PEEP::getLanguage()->addKeyForJs("base", "moderation_delete_multiple_confirmation");
PEEP::getLanguage()->addKeyForJs("base", "moderation_no_items_warning");
$options = array(
"groupLabel" => strtolower($currentGroup["label"])
);
$js = UTIL_JsGenerator::newInstance();
$js->callFunction("MODERATION_FlagsInit", array(
$uniqId, $options
));
PEEP::getDocument()->addOnloadScript($js);
}
public function flagsResponder( $params )
{
if ( !PEEP::getRequest()->isPost() ||
!(PEEP::getUser()->isAdmin() || BOL_AuthorizationService::getInstance()->isModerator()) )
{
throw new Redirect403Exception;
}
$data = $_POST;
$data["items"] = empty($data["items"]) ? array() : $data["items"];
list($command, $type) = explode(".", $data["command"]);
$backUrl = PEEP::getRouter()->urlForRoute("base.moderation_flags", array(
"group" => $params["group"]
));
$itemKeys = $type == "single" ? array($data["item"]) : $data["items"];
if ( empty($itemKeys) )
{
PEEP::getFeedback()->warning(PEEP::getLanguage()->text("base", "moderation_no_items_warning"));
$this->redirect($backUrl);
}
$itemIds = array();
foreach ( $itemKeys as $itemKey )
{
list($entityType, $entityId) = explode(":", $itemKey);
$itemIds[$entityType] = empty($itemIds[$entityType]) ? array() : $itemIds[$entityType];
$itemIds[$entityType][] = $entityId;
}
$affected = 0;
$lastEntityType = null;
foreach ( $itemIds as $entityType => $entityIds )
{
if ( $command == "delete" )
{
BOL_ContentService::getInstance()->deleteContentList($entityType, $entityIds);
}
if ( $command == "unflag" )
{
// Pass
}
BOL_FlagService::getInstance()->deleteFlagList($entityType, $entityIds);
$affected = count($entityIds);
$lastEntityType = $entityType;
}
// Feedback
$assigns = array();
$multiple = $affected > 1;
if ( $multiple )
{
$tmp = BOL_ContentService::getInstance()->getContentGroups();
$groupInfo = $tmp[$params["group"]];
$assigns["content"] = strtolower($groupInfo["label"]);
$assigns["count"] = $affected;
}
else
{
$typeInfo = BOL_ContentService::getInstance()->getContentTypeByEntityType($lastEntityType);
$assigns["content"] = $typeInfo["entityLabel"];
}
$feedbackKey = $command == "delete" ? "base+moderation_feedback_delete" : "base+moderation_feedback_unflag";
list($langPrefix, $langKey) = explode("+", $feedbackKey);
PEEP::getFeedback()->info(PEEP::getLanguage()
->text($langPrefix, $langKey . ($multiple ? "_multiple" : ""), $assigns));
// Redirection
$this->redirect($backUrl);
}
}