Вход Регистрация
Файл: plugins/cnews/controllers/ajax.php
Строк: 402
<?php

class CNEWS_CTRL_Ajax extends PEEP_ActionController
{
    
/**
     *
     * @var CNEWS_BOL_Service
     */
    
protected $service;

    public function 
__construct()
    {
        
$this->service = CNEWS_BOL_Service::getInstance();
    }

    public function 
init()
    {
        if ( !
PEEP::getRequest()->isAjax() )
        {
            throw new 
Redirect404Exception();
        }
    }

    public function 
like()
    {
        if ( !
PEEP::getUser()->isAuthenticated() )
        {
            throw new 
AuthenticateException();
        }

        
$entityType = !empty($_POST['entityType']) ?  $_POST['entityType'] : null;
        
$entityId = !empty($_POST['entityId']) ? $_POST['entityId'] : null;

        
$like = $this->service->addLike(PEEP::getUser()->getId(), $entityType, $entityId);

        
$event = new PEEP_Event('feed.after_like_added', array(
            
'entityType' => $entityType,
            
'entityId' => $entityId,
            
'userId' => PEEP::getUser()->getId()
        ), array(
            
'likeId' => $like->id
        
));

        
PEEP::getEventManager()->trigger($event);
        
        
$this->afterLike($entityType, $entityId);
    }
    
    protected function 
afterLike( $entityType, $entityId )
    {
        
$cmp = new CNEWS_CMP_Likes($entityType, $entityId);

        echo 
json_encode(array(
            
'count' => $cmp->getCount(),
            
'markup' => $cmp->render()
        ));

        exit;
    }

    public function 
unlike()
    {
        if ( !
PEEP::getUser()->isAuthenticated() )
        {
            throw new 
AuthenticateException();
        }

        
$entityType = !empty($_POST['entityType']) ?  $_POST['entityType'] : null;
        
$entityId = !empty($_POST['entityId']) ? (int) $_POST['entityId'] : null;

        
$this->service->removeLike(PEEP::getUser()->getId(), $entityType, $entityId);

        
$event = new PEEP_Event('feed.after_like_removed', array(
            
'entityType' => $entityType,
            
'entityId' => $entityId,
            
'userId' => PEEP::getUser()->getId()
        ));

        
PEEP::getEventManager()->trigger($event);
        
        
$this->afterUnlike($entityType, $entityId);
    }
    
    protected function 
afterUnlike( $entityType, $entityId )
    {
        
$this->afterLike($entityType, $entityId);
    }

    public function 
statusUpdate()
    {
        if ( empty(
$_POST['status']) && empty($_POST['attachment']) )
        {
            echo 
json_encode(array(
                
"error" => PEEP::getLanguage()->text('base', 'form_validate_common_error_message')
            ));
            exit;
        }

        if ( !
PEEP::getUser()->isAuthenticated() )
        {
            echo 
json_encode(false);
            exit;
        }

        
$oembed = null;
        
$attachId = null;
        
$status = empty($_POST['status']) ? '' : strip_tags($_POST['status']);
        
$content = array();

        if ( !empty(
$_POST['attachment']) )
        {
            
$content = json_decode($_POST['attachment'], true);

            if ( !empty(
$content) )
            {
                if( 
$content['type'] == 'photo' && !empty($content['uid']) )
                {
                    
$attachmentData = PEEP::getEventManager()->call('base.attachment_save_image', array( 
                        
"pluginKey" => "cnews",
                        
'uid' => $content['uid']
                    ));
                    
                    
$content['url'] = $content['href'] = $attachmentData["url"];
                    
$attachId = $content['uid'];
                }

                if( 
$content['type'] == 'video' )
                {
                    
$content['html'] = BOL_TextFormatService::getInstance()->validateVideoCode($content['html']);
                }
            }
        }
        
        
$userId = PEEP::getUser()->getId();
        
        
$event = new PEEP_Event("feed.before_content_add", array(
            
"feedType" => $_POST['feedType'],
            
"feedId" => $_POST['feedId'],
            
"visibility" => $_POST['visibility'],
            
"userId" => $userId,
            
"status" => $status,
            
"type" => empty($content["type"]) ? "text" : $content["type"],
            
"data" => $content
        
));
        
        
PEEP::getEventManager()->trigger($event);
        
        
$data = $event->getData();
        
        if ( !empty(
$data) )
        {
            if ( !empty(
$attachId) )
            {
                
BOL_AttachmentService::getInstance()->deleteAttachmentByBundle("cnews", $attachId);
            }
            
            
$item = empty($data["entityType"]) || empty($data["entityId"])
                    ? 
null
                    
: array(
                        
"entityType" => $data["entityType"],
                        
"entityId" => $data["entityId"]
                    );
            
            echo 
json_encode(array(
                
"item" => $item,
                
"message" => empty($data["message"]) ? null : $data["message"],
                
"error" => empty($data["error"]) ? null : $data["error"]
            ));
            exit;
        }
        
        
$status = UTIL_HtmlTag::autoLink($status);
        
$out = CNEWS_BOL_Service::getInstance()
                ->
addStatus(PEEP::getUser()->getId(), $_POST['feedType'], $_POST['feedId'], $_POST['visibility'], $status, array(
                    
"content" => $content,
                    
"attachmentId" => $attachId
                
));
        
        echo 
json_encode(array(
            
"item" => $out
        
));
        exit;
    }

    public function 
remove()
    {
        
$id = !empty($_POST['actionId']) ? (int) $_POST['actionId'] : null;

        if ( !
$id )
        {
            throw new 
Redirect404Exception();
        }

        
$dto = $this->service->findActionById($id);

        if ( empty(
$dto) )
        {
            exit;
        }

        
// check permissions
        
$removeAllowed = PEEP::getUser()->isAuthorized("cnews");

        if ( !
$removeAllowed )
        {
            
$activities = $this->service->
                    
findActivity(CNEWS_BOL_Service::SYSTEM_ACTIVITY_CREATE . ':' . $dto->id);

            
// check for the ownership
            
foreach ($activities as $activity) {
                if ( 
PEEP::getUser()->getId() == $activity->userId ) {
                    
$removeAllowed = true;
                    break;
                }
            }
        }

        if ( 
$removeAllowed )
        {
            
$this->service->removeActionById($id);
            echo 
json_encode(PEEP::getLanguage()->text('cnews', 'item_deleted_feedback'));            
        }

        exit;
    }

    public function 
removeAttachment()
    {
        
$id = !empty($_POST['actionId']) ? (int) $_POST['actionId'] : null;

        if ( !
$id )
        {
            throw new 
Redirect404Exception();
        }

        
$dto = $this->service->findActionById($id);
        
$data = json_decode($dto->data, true);

        if( !empty(
$data['attachmentId']) )
        {
            
BOL_AttachmentService::getInstance()->deleteAttachmentByBundle("cnews", $data['attachmentId']);
        }

        unset(
$data['attachment']);
        
$dto->data = json_encode($data);

        
$this->service->saveAction($dto);

        exit;
    }

    public function 
loadItem()
    {
        
$params = json_decode($_GET['p'], true);

        
$feedData = $params['feedData'];

        
$driverClass = $feedData['driver']['class'];
        
/* @var $driver CNEWS_CLASS_Driver */
        
$driver = PEEP::getClassInstance($driverClass);
        
$driver->setup($feedData['driver']['params']);

        if ( isset(
$params['actionId']) )
        {
            
$action = $driver->getActionById($params['actionId']);
        }
        else if ( isset(
$params['entityType']) && isset($params['entityId']) )
        {
            
$action = $driver->getAction($params['entityType'], $params['entityId']);
        }
        else
        {
            throw new 
InvalidArgumentException('Invalid paraeters: `entityType` and `entityId` or `actionId`');
        }

        if ( 
$action === null )
        {
            
$this->echoError('Action not found');
        }

        
$data = $feedData['data'];

        
$sharedData['feedAutoId'] = $data['feedAutoId'];
        
$sharedData['feedType'] = $data['feedType'];
        
$sharedData['feedId'] = $data['feedId'];

        
$sharedData['configs'] = PEEP::getConfig()->getValues('cnews');

        
$userIdList = array($action->getUserId());
        
$sharedData['usersIdList'] = $userIdList;

        
$usersInfo = BOL_AvatarService::getInstance()->getDataForUserAvatars($userIdList);

        
$sharedData['usersInfo']['avatars'][$action->getUserId()] = $usersInfo[$action->getUserId()]['src'];
        
$sharedData['usersInfo']['urls'][$action->getUserId()] = $usersInfo[$action->getUserId()]['url'];
        
$sharedData['usersInfo']['names'][$action->getUserId()] = $usersInfo[$action->getUserId()]['title'];
        
$sharedData['usersInfo']['roleLabels'][$action->getUserId()] = array(
            
'label' => $usersInfo[$action->getUserId()]['label'],
            
'labelColor' => $usersInfo[$action->getUserId()]['labelColor']
        );

        
$entityList = array();
        
$entityList[] = array(
            
'entityType' => $action->getEntity()->type,
            
'entityId' => $action->getEntity()->id,
            
'pluginKey' => $action->getPluginKey(),
            
'userId' => $action->getUserId(),
            
'countOnPage' => $sharedData['configs']['comments_count']
        );

        
$sharedData['commentsData'] = BOL_CommentService::getInstance()->findBatchCommentsData($entityList);
        
$sharedData['likesData'] = CNEWS_BOL_Service::getInstance()->findLikesByEntityList($entityList);

        
$cmp = $this->createFeedItem($action, $sharedData);
        
$cmp->setDisplayType($data['displayType']);
        
$html = $cmp->renderMarkup(empty($params['cycle']) ? null : $params['cycle']);

        
$this->synchronizeData($data['feedAutoId'], array(
            
'data' => $data,
            
'driver' => $driver->getState()
        ));

        
$this->echoMarkup($html);
    }
    
    
/**
     * 
     * @param CNEWS_CLASS_Action $action
     * @param array $sharedData
     * @return CNEWS_CMP_FeedItem
     */
    
protected function createFeedItem( $action, $sharedData )
    {
        return 
PEEP::getClassInstance("CNEWS_CMP_FeedItem", $action, $sharedData);
    }

    public function 
loadItemList()
    {
        
$params = json_decode($_GET['p'], true);

        
$event = new PEEP_Event('feed.on_ajax_load_list', $params);
        
PEEP::getEventManager()->trigger($event);

        
$driverClass = $params['driver']['class'];

        
/*@var $cmp CNEWS_CLASS_Driver */
        
$driver = PEEP::getClassInstance($driverClass);

        
$driverParams = $params['driver']['params'];
        
$driverParams['displayCount'] = $driverParams['displayCount'] > 20 ? 20 : $driverParams['displayCount'];

        
$driver->setup($driverParams);

        
$driver->moveCursor();
        
$actionList = $driver->getActionList();

        
$list = $this->createFeedList($actionList, $params['data']);
        
$list->setDisplayType($params['data']['displayType']);
        
$html = $list->render();

        
$this->synchronizeData($params['data']['feedAutoId'], array(
            
'data' => $params['data'],
            
'driver' => $driver->getState()
        ));

        
$this->echoMarkup($html);
    }

    
/**
     * 
     * @param array $actionList
     * @param array $data
     * @return CNEWS_CMP_FeedList
     */
    
protected function createFeedList( $actionList, $data )
    {
        return 
PEEP::getClassInstance("CNEWS_CMP_FeedList", $actionList, $data);
    }
    
    private function 
synchronizeData( $autoId, $data )
    {
        
$script = UTIL_JsGenerator::newInstance()
                ->
callFunction(array('window', 'peep_cnews_feed_list', $autoId, 'setData'), array($data));
        
PEEP::getDocument()->addOnloadScript($script);
    }

    private function 
echoError( $msg, $code = null )
    {
        echo 
json_encode(array(
            
'result' => 'error',
            
'code' => $code,
            
'msg' => $msg
        
));

        exit;
    }

    private function 
echoMarkup( $html )
    {
        
/* @var $document PEEP_AjaxDocument */
        
$document = PEEP::getDocument();

        
$markup = array();

        
$markup['result'] = 'success';
        
$markup['html'] = trim($html);

        
$beforeIncludes = $document->getScriptBeforeIncludes();
        if ( !empty(
$beforeIncludes) )
        {
            
$markup['beforeIncludes'] = $beforeIncludes;
        }

        
$scripts = $document->getScripts();
        if ( !empty(
$scripts) )
        {
            
$markup['scriptFiles'] = $scripts;
        }

        
$styleSheets = $document->getStyleSheets();
        if ( !empty(
$styleSheets) )
        {
            
$markup['styleSheets'] = $styleSheets;
        }

        
$onloadScript = $document->getOnloadScript();
        if ( !empty(
$onloadScript) )
        {
            
$markup['onloadScript'] = $onloadScript;
        }

        
$styleDeclarations = $document->getStyleDeclarations();
        if ( !empty(
$styleDeclarations) )
        {
            
$markup['styleDeclarations'] = $styleDeclarations;
        }

        echo 
json_encode($markup);

        exit;
    }
}
Онлайн: 1
Реклама