Вход Регистрация
Файл: library/XenForo/NodeHandler/Abstract.php
Строк: 247
<?php

/**
 * Class to handle preparing nodes of a specified type for display.
 *
 * @package XenForo_Nodes
 */
abstract class XenForo_NodeHandler_Abstract
{
    
/**
     * Determines if the specified node is viewable with the given permissions.
     *
     * @param array $node Node info
     * @param array $nodePermissions Permissions for this node
     *
     * @return boolean
     */
    
abstract public function isNodeViewable(array $node, array $nodePermissions);
    
// TODO: be able to pass in $viewingUser

    /**
     * Renders the specified node for display in a node tree.
     * Note that if using a template, it is preferable to not explicitly
     * render the template here, but to return the object instead.
     *
     * @param XenForo_View $view View object doing the rendering
     * @param array $node Information about this node
     * @param array $permissions Pemissions for this node
     * @param array $renderedChildren List of rendered children, [node id] => rendered output
     * @param integer $level The level this node should be rendered at, relative to how it's to be displayed.
     *
     * @return string|XenForo_Template_Abstract
     */
    
abstract public function renderNodeForTree(XenForo_View $view, array $node, array $permissions,
        array 
$renderedChildren$level
    
);

    
/**
     * Gets the extra, node-type-specified data for the list of nodes.
     *
     * @param array $nodeIds
     *
     * @return array Format: [node id] => info
     */
    
public function getExtraDataForNodes(array $nodeIds)
    {
        return array();
    }

    
/**
     * Do type-specific node preparations.
     *
     * @param array $node Unprepared data
     *
     * @return array Prepared data
     */
    
public function prepareNode(array $node)
    {
        return 
$node;
    }

    
/**
     * Gets a count of total items in this node, broken down to discussions and messages.
     *
     * @param array $node
     *
     * @return array Keys: discussions, messages
     */
    
public function getNodeItemCounts(array $node)
    {
        
$output = array(
            
'discussions' => 0,
            
'messages' => 0
        
);

        if (isset(
$node['discussion_count']))
        {
            
$output['discussions'] = $node['discussion_count'];
        }
        if (isset(
$node['message_count']))
        {
            
$output['messages'] = $node['message_count'];
        }

        return 
$output;
    }

    
/**
     * Gets the effective data that can be pushed up to a parent node.
     *
     * @param array $node Current node info
     * @param array $childPushable List of pushable data from all child nodes: [node id] => pushable data
     * @param array $permissions Permissions for this node
     *
     * @return array List of pushable data (key-value pairs)
     */
    
public function getPushableDataForNode(array $node, array $childPushable, array $permissions)
    {
        return 
$this->_getForumLikePushableData($node$childPushable);
    }

    
/**
     * Gets the pushable data for a forum-like node. Most nodes, including
     * categories and forums, will fall into this category, provided the
     * key names match.
     *
     * This function does not check any permissions.
     *
     * @param array $node Info about the current node
     * @param array $childPushable List of pushable data for child nodes ([node id] => info)
     *
     * @return array Key-value pairs of pushable data
     */
    
protected function _getForumLikePushableData(array $node, array $childPushable)
    {
        
$newPushable = array(
            
'discussion_count' => (isset($node['discussion_count']) ? $node['discussion_count'] : 0),
            
'message_count' => (isset($node['message_count']) ? $node['message_count'] : 0),
            
'hasNew' => (isset($node['hasNew']) ? $node['hasNew'] : false)
        );

        if (
$newPushable['discussion_count'] && !XenForo_Visitor::getUserId())
        {
            
$newPushable['hasNew'] = true;
        }

        if (!empty(
$node['last_post_date']))
        {
            
$newPushable['last_post_id'] = $node['last_post_id'];
            
$newPushable['last_post_date'] = $node['last_post_date'];
            
$newPushable['last_post_user_id'] = $node['last_post_user_id'];
            
$newPushable['last_post_username'] = $node['last_post_username'];
            
$newPushable['last_thread_title'] = XenForo_Helper_String::censorString($node['last_thread_title']);
        }

        return 
$this->_compileForumLikePushableData($newPushable$childPushable);
    }

    
/**
     * Takes collected pushable data and compiles it with the child pushable data into a final value.
     *
     * @param array $newPushable
     * @param array $childPushable
     *
     * @return array
     */
    
protected function _compileForumLikePushableData(array $newPushable, array $childPushable)
    {
        
$newPushable array_merge(array(
            
'discussion_count' => 0,
            
'message_count' => 0,
            
'hasNew' => false,
            
'privateInfo' => false,
            
'childCount' => 0,
            
'last_post_id' => 0,
            
'last_post_date' => 0,
            
'last_post_user_id' => 0,
            
'last_post_username' => '',
            
'last_thread_title' => ''
        
), $newPushable);

        foreach (
$childPushable AS $childData)
        {
            if (!empty(
$childData['discussion_count']))
            {
                
$newPushable['discussion_count'] += $childData['discussion_count'];
            }

            if (!empty(
$childData['message_count']))
            {
                
$newPushable['message_count'] += $childData['message_count'];
            }

            if (!empty(
$childData['last_post_date']) && $childData['last_post_date'] > $newPushable['last_post_date'])
            {
                
$newPushable['last_post_id'] = $childData['last_post_id'];
                
$newPushable['last_post_date'] = $childData['last_post_date'];
                
$newPushable['last_post_user_id'] = $childData['last_post_user_id'];
                
$newPushable['last_post_username'] = $childData['last_post_username'];
                
$newPushable['last_thread_title'] = $childData['last_thread_title'];
            }

            if (!empty(
$childData['hasNew']))
            {
                
// one child has new stuff
                
$newPushable['hasNew'] = true;
            }

            
$newPushable['childCount'] += + (!empty($childData['childCount']) ? $childData['childCount'] : 0);
        }

        
$newPushable['lastPost'] = array(
            
'post_id'   => $newPushable['last_post_id'],
            
'date'      => $newPushable['last_post_date'],
            
'user_id'   => $newPushable['last_post_user_id'],
            
'username'  => $newPushable['last_post_username'],
            
'title'     => $newPushable['last_thread_title']
        );

        return 
$newPushable;
    }
}
Онлайн: 3
Реклама