Вход Регистрация
Файл: upload/include/library/phpfox/ajax/ajax.class.php
Строк: 558
<?php
/**
 * [PHPFOX_HEADER]
 */

defined('PHPFOX') or exit('NO DICE!');

/**
 * Handles AJAX Requests and returns data outputed
 * by the specified call which connects to a modules ajax
 * component. Many of the methods within this class returns the
 * classes own object thus allow calls like:
 * <code>
 * $this->hide('#foo')->show('#bar')->html('Test Content')->call('init();');
 * </code>
 * 
 * @copyright        [PHPFOX_COPYRIGHT]
 * @author            Raymond Benc
 * @package         Phpfox
 * @version         $Id: ajax.class.php 4479 2012-07-06 07:50:02Z Raymond_Benc $
 */
class Phpfox_Ajax
{
    
/**
     * Stores all the AJAX calls.
     * 
     * @static 
     * @var array
     */
    
private static $_aCalls = array();    
    
    
/**
     * Holds all the $_POST data when sending information via AJAX.
     * 
     * @static
     * @var array
     */
    
private static $_aParams = array();
    
    
/**
     * During an AJAX call you can use "Phpfox_Error::set();" to set error messages and
     * by default the AJAX class will pick up on these errors and return the error message
     * to the user. However, in some cases you may not want to use the default error reporting
     * routine and create your own and by setting this to false will disable to error reporting
     * routine.
     *
     * @var bool
     */
    
private static $_bShowErrors true;
    
    
/**
     * This is the HTML div ID that holds error messages
     *
     * @var string
     */
    
private static $_sErrorHolder null;
    
    
/**
     * These are jQuery functions we support, which can be called via this class
     *
     * @example $this->hide('#sample'); This in jQuery would be $('#sample').hide();
     * @var array
     */
    
private $_aJquery = array(
        
'addClass',
        
'removeClass',
        
'val',
        
'focus',
        
'show',
        
'remove',
        
'hide',
        
'slideDown',
        
'slideUp',
        
'submit',
        
'attr',
        
'height',
        
'width',
        
'after',
        
'before',
        
'fadeOut'
    
);
    
    
/**
     * Holds the Request object
     *
     * @var object
     */
    
private $_oReq null;

    
/**
     * Holds the default 'phpfox' parameters being passed by the
     * post request.
     *
     * @var array
     */
    
private $_aRequest = array();    
    
    
/**
     * Class Constructor
     *
     */
    
public function __construct()
    {
        
$this->_oReq Phpfox::getLib('request');
        
$this->_aRequest $this->_oReq->getArray(Phpfox::getTokenName());    

        ((
$sPlugin Phpfox_Plugin::get('ajax__construct')) ? eval($sPlugin) : false);    
    }
    
    
/**
     * Process the AJAX request
     *
     * @return bool If we can load the component we return true, false on failure
     */
    
public function process()
    {            
        
Phpfox::getService('log.session')->verifyToken();
        
        if (empty(
$this->_aRequest))
        {
            return 
false;
        }
        
$aParts explode('.'$this->_aRequest['call']);
        
$sModule $aParts[0];
        if (isset(
$aParts[2]))
        {
            
$sModule .= '.' $aParts[1] . '.ajax';    
            
$sMethod $aParts[2];
        }
        else 
        {
            
$sMethod $aParts[1];    
        }        

        foreach (
$this->_oReq->getRequests() as $sKey => $mValue)
        {
            
self::$_aParams[$sKey] = $mValue;
        }        
        
        if (
$sModule == 'im' && ($sMethod == 'getRooms' || $sMethod == 'getMessages'))
        {            
            
$sMethod 'getUpdate';
        }
        ((
$sPlugin Phpfox_Plugin::get('ajax_process')) ? eval($sPlugin) : false);
        
        
$this->template()->assign('aGlobalUser', (Phpfox::isUser() ? Phpfox::getUserBy(null) : array()));
        
$this->template()->assign('aGlobalProfilePageLogin', (Phpfox::getUserBy('profile_page_id') ? Phpfox::getService('pages')->getLastLogin() : false));
        
        if (isset(
$this->_aRequest['is_user_profile']) && $this->_aRequest['is_user_profile'] && !defined('PHPFOX_IS_USER_PROFILE') && isset($this->_aRequest['profile_user_id']))
        {
            
define('PHPFOX_IS_USER_PROFILE'true);
            
Phpfox::getService('profile')->setUserId($this->_aRequest['profile_user_id']);
        }
        
        
$bCache false;
        
// Should we cache the data?
        
if (isset(self::$_aParams[Phpfox::getTokenName()]['cache']) && self::$_aParams[Phpfox::getTokenName()]['cache'])
        {
            
$bCache true;
            
$oCache Phpfox::getLib('cache');
            
$sCacheId $oCache->set('ajax_' strtolower($sModule) . '_' strtolower($sMethod));
            if (
$sContent $oCache->get($sCacheId))
            {
                echo 
$sContent;
                return 
true;
            }
        }        
        
        
// Lets get the Ajax component for this module
        
if ($oObject Phpfox::getComponent($sModule, array(), 'ajax'))
        {
            
// Call the method for this component
            
$oObject->$sMethod();    
            
            if (
$bCache)
            {
                
$oCache->save($sCacheIdob_get_contents());
            }
            
            return 
true;
        }
        
        
// Since this is now an invalid call lets clear out the error message
        
ob_clean();
        
        
// Lets tell the dev that its an invalid call
        // $this->debug('Invalid Component: ' . $sModule . 'ajax');
        
        
return false;
    }
    
    
/**
     * Used to get $_POST requests send via an AJAX request
     *
     * @param string $sVar Name of the post param
     * @param mixed $mDef You can pass a default value incase the $_POST data was not sent
     * @return mixed Returns the value if the $_POST data, which is usually either a string or array
     */
    
public function get($sVar$mDef null)
    {
        return isset(
self::$_aParams[$sVar]) ? self::$_aParams[$sVar] : $mDef;
    }    
    
    
/**
     * Get all the $_POST params sent over via an AJAX request
     *
     * @return array Array of all the $_POST params
     */
    
public function getAll()
    {
        return 
self::$_aParams;
    }
    
    
/**
     * Manually set $_POST information if it was not sent via an AJAX request
     *
     * @example $this->set('foo', 'bar') or $this->set(array('foo' => 'bar'))
     * @param mixed $mVar It can be a string, which will hold the param var or an array of values
     * @param mixed $mDef This is the default value of the param you are creating
     */
    
public function set($mVar$mDef '')
    {
        if (!
is_array($mVar))
        {
            
$mVar = array($mVar);
        }
        
        foreach (
$mVar as $sKey => $mValue)
        {
            
self::$_aParams[$sKey] = $mValue;
        }
    }
    
    
/**
     * jQuery has support for innerHTML and we use that method, however we add a little extra
     * protection with our routine.
     *
     * @example $this->html('#sample', 'This is a test');
     * @param string $sId HTML id for the element
     * @param string $sContent Content to place inside the HTML element
     * @param string $sExtra Optional jQuery functions you may want to execute
     * @return object Return the AJAX object
     */
    
public function html($sId$sContent$sExtra '')
    {
        
$sContent str_replace('\', '\\', $sContent);
        $sContent = str_replace('"', '"', $sContent);
        
        (($sPlugin = Phpfox_Plugin::get('
ajax_html')) ? eval($sPlugin) : false);
        
        $this->call("$('" . 
$sId . "').html("" . $sContent . "")" . $sExtra . ";");
        
        return $this;
    }
    
    /**
     * jQuery has support for prepend() and we use that method, however we add a little extra
     * protection with our routine.
     *
     * @example $this->prepend('
#sample', 'This is a test');
     
* @param string $sId HTML id for the element
     
* @param string $sContent Content to prepend
     
* @param string $sExtra Optional jQuery functions you may want to execute
     
* @return object Return the AJAX object
     
*/    
    public function 
prepend($sId$sContent$sExtra '')
    {
        
$sContent str_replace(array("n""t"), ''$sContent);        
        
$sContent str_replace('\', '\\', $sContent);
        $sContent = str_replace('"', '"', $sContent);        
        
        (($sPlugin = Phpfox_Plugin::get('
ajax_prepend')) ? eval($sPlugin) : false);
        
        $this->call("$('" . 
$sId . "').prepend("" . $sContent . "")" . $sExtra . ";");
        
        return $this;        
    }
    
    /**
     * jQuery has support for append() and we use that method, however we add a little extra
     * protection with our routine.
     *
     * @example $this->append('
#sample', 'This is a test');
     
* @param string $sId HTML id for the element
     
* @param string $sContent Content to append
     
* @param string $sExtra Optional jQuery functions you may want to execute
     
* @return object Return the AJAX object
     
*/        
    public function 
append($sId$sContent$sExtra '')
    {
        
$sContent str_replace(array("n""t"), ''$sContent);        
        
$sContent str_replace('\', '\\', $sContent);
        $sContent = str_replace('"', '"', $sContent);        
        
        (($sPlugin = Phpfox_Plugin::get('
ajax_append')) ? eval($sPlugin) : false);
        
        $this->call("$('" . 
$sId . "').append("" . $sContent . "")" . $sExtra . ";");
        
        return $this;        
    }    
    
    /**
     * Used to call any JavaScript back to the browser once the AJAX routine is complete.
     *
     * @example $this->call("document.getElementById('
test').style.display = 'none';"); or $this->call('$("#test").hide();');
     * @param string $sCall JavaScript that you plan to execute back to the browser
     * @return object Return the AJAX object
     */
    public function call($sCall)
    {
        $sCall = str_replace('
im.getMessages', 'im.getUpdate', $sCall);
        $sCall = str_replace('
im.getRooms', 'im.getUpdate', $sCall);
        self::$_aCalls[] = $sCall;

        return $this;
    }
    
    /**
     * Our product is designed to automatically echo data from components such as blocks and controllers
     * and within an AJAX call we need to get that from the output buffer so we could possible place it
     * within a specific HTML element.
     *
     * @param bool $bClean Set to true if we should attempt to clean out the content depending on how you plan to return it.
     * @return string Returns the output thus allowing you to use it in any way you want.
     */
    public function getContent($bClean = true)
    {
        $sContent = ob_get_contents();
    
        ob_clean();        
    
        if ($bClean)
        {
            $sContent = str_replace(array("n", "t"), '', $sContent);                    
            $sContent = str_replace('
\', '\\', $sContent);
            $sContent = str_replace("'", "
\'", $sContent);            
            $sContent = str_replace('"', '"', $sContent);
        }        
        
        (($sPlugin = Phpfox_Plugin::get('
ajax_getcontent')) ? eval($sPlugin) : false);
        
        return $sContent;
    }
    
    /**
     * Controlls if you want to use our default error system or create your own.
     *
     * @param bool $bShowErrors True by default and will use our error system | False to create your own.
     */
    public function error($bShowErrors)
    {
        self::$_bShowErrors = $bShowErrors;        
    }
    
    /**
     * We have our own default error div with a specific ID, however you can use this with this function.
     *
     * @param string $sDiv ID of the HTML element
     */
    public function errorSet($sDiv)
    {
        self::$_sErrorHolder = $sDiv;
    }
    
    /**
     * This is the final output to the browser once the AJAX request is complete.
     *
     * @return string Data to return back to the browser. It must be JavaScript code.
     */
    public function getData()
    {
        if ($this->get('
js_block_click_lis_cache'))
        {
            $this->remove('
.js_block_click_lis_cache');
        }
        
        if ($this->get('
global_ajax_message'))
        {
            $this->slideUp('
#global_ajax_message');
        
}
        
        if (empty(
$this->_aRequest))
        {
            return 
'';
        }
        if (
$this->_aRequest['call'] != 'im.getRooms' && $this->_aRequest['call'] != 'im.getMessages' && !isset(self::$_aParams['js_disable_ajax_restart']))
        {
            if (isset(
$this->_aRequest['last_call']))
            {
                if (
$this->_aRequest['call'] != 'im.load' 
                    
&& $this->_aRequest['call'] != 'im.open'
                    
&& $this->_aRequest['call'] != 'im.chat'
                    
&& $this->_aRequest['call'] != 'im.close'
                    
&& $this->_aRequest['call'] != 'im.getRooms'
                    
&& $this->_aRequest['call'] != 'im.getMessages'
                
)
                {
                    switch (
$this->_aRequest['last_call'])
                    {
                        case 
'im.getRooms':
                            
$this->call("$.ajaxCall('im.getRooms','','GET');");
                            break;
                        case 
'im.getMessages':
                            
$this->call("$.ajaxCall('im.getMessages', 'im_id=" $this->_aRequest['last_param'] . "','GET');");
                            break;
                    }
                }
            }        
        }
        
        
$sXml '';        
        foreach (
self::$_aCalls as $sCall
        {            
            
$sXml .= $this->_ajaxSafe($sCall);
        }
        
        ((
$sPlugin Phpfox_Plugin::get('ajax_getdata')) ? eval($sPlugin) : false);
    
        if (
self::$_bShowErrors && !Phpfox_Error::isPassed())
        {
            
$sErrors '';
            foreach (
Phpfox_Error::get() as $sError)
            {
                
$sErrors .= '<div class="error_message">' $sError '</div>';
            }        
                        
            echo 
$sXml;
            
            if (
self::$_sErrorHolder !== null)
            {
                
self::$_aCalls = array();
                
                
$this->show(self::$_sErrorHolder)->html(self::$_sErrorHolder$sErrors);                
                
                return 
implode(''self::$_aCalls);
            }
            else 
            {
                
$this->alert($sErrorsPhpfox::getPhrase('core.error'));
            }
            
            return 
'';
        }        
    
        return 
$sXml;
    }
    
    
/**
     * Quick function that can be used to identify if a user is logged it or not and if not
     * they will not be able to use the specific feature and display a login form.
     *
     * @return mixed Returns true if they are logged in or simply exisits the script and returns JavaScript to display the login form.
     */
    
public function isUser()
    {
        if (!
Phpfox::isUser())
        {            
            if (isset(
self::$_aParams['width'])) // && isset(self::$_aParams['height']))
            
{
                echo 
'<script type="text/javascript">$('.js_box_title').html('' . Phpfox::getPhrase('user.login_ajax'). '');</script>';
                
Phpfox::getBlock('user.login-ajax');    
            }
            else 
            {                
                if (
Phpfox::getLib('request')->get('do') != '')
                {
                    
Phpfox::getLib('session')->set('redirect'Phpfox::getLib('request')->get('do'));
                }
                
                echo 
"tb_show('" Phpfox::getPhrase('user.login_title') . "', $.ajaxBox('user.login', 'height=250&width=400" . ((isset(self::$_aParams[Phpfox::getTokenName()]['is_admincp']) && self::$_aParams[Phpfox::getTokenName()]['is_admincp']) ? '&' Phpfox::getTokenName() . '[is_admincp]=1' '') . "'));";
                echo 
"$('body').css('cursor', 'auto');";
            }
            exit;
        }
        return 
true;
    }    
    
    
/**
     * Sets the title of the AJAX modal
     *
     * @param string $sTitle Title to set
     * @return object Return the AJAX object
     */
    
public function setTitle($sTitle)
    {
        
$this->call('<div class="js_box_title_store">' $sTitle '</div>');
        
        return 
$this;
    }
    
    
/**
     * This is a small function to show soft notices, for example when several ajax interactions are
     * expected to happen in a short amount of time. Primarily used in the designDnD feature
     * so when moving a block it gives a quick feedback that the change was saved.
     * @param string $sText Message to show
     * @param string $sType relates to the css class to use, this class must exist in common.css
     */
    
public function softNotice($sText$sType 'positive'$iTimeout 2000)
    {
        
$sId 'softNotice' rand(10,20) . '';
        
$sDiv '<div id="' $sId '" class="softNotice' ucwords($sType) .'">' $sText '</div>';
        
$this->call('$("body").append(''.$sDiv.''); $("#'.$sId.'").slideDown("slow");setTimeout(function(){$("#'.$sId.'").slideUp("slow", function(){    $(this).remove();});                },'.$iTimeout.');');
        return 
true;
    }
    
    
/**
     * Set debug information which can be picked up with Firebug.
     *
     * @param string $sMsg Debug information you want to pass to Firebug
     */
    
public static function debug($sMsg)
    {
        
self::call('debug("' $sMsg '");');
    }    
    
    
/**
     * At times you may want to notify your users and instead of using the default JavaScript alert() we provide
     * a AJAX popup version that works well with the sites theme.
     *
     * @param string $sMessage Message to pass to your users
     * @param string $sTitle Title of the alert box
     * @param int $iWidth Width of the alert box
     * @param int $iHeight Height of the alert box
     * @param bool $bClose TRUE to remove the alert box after 2 seconds
     */
    
public static function alert($sMessage$sTitle null$iWidth 300$iHeight 150$bClose false$bReturn false)
    {
        if (isset(
self::$_aParams['tb']))
        {
            
ob_clean();
            
            echo 
$sMessage;    
        }
        else 
        {
            
$sStr "tb_show('" str_replace("'""'", ($sTitle === null Phpfox::getPhrase('core.notice') : $sTitle)) . "', $.ajaxBox('core.message', 'height={$iHeight}&width={$iWidth}&message=' + encodeURIComponent('" str_replace("'""'"$sMessage) . "') + ''));";
            if (
$bClose)
            {
                
$sStr .= 'setTimeout('tb_remove();', 2000);';
            }
            
            if (
$bReturn)
            {
                return 
$sStr;
            }
            echo 
$sStr;
        }        
    }

    
/**
     * Emulate jQuery calls.
     *
     * @param string $sMethod jQuery method we are trying to call.
     * @param array $aArguments Array of option arguments being passed to jQuery.
     */
    
public function __call($sMethod$aArguments)
    {
        if (!
in_array($sMethod$this->_aJquery))
        {
            return 
Phpfox_Error::trigger('Not a valid jQuery function'E_USER_ERROR);
        }
        
        
$sArgs '';
        foreach (
$aArguments as $iKey => $sArgument)
        {
            if (
$iKey == 0)
            {
                continue;
            }
            
            
$sValue ''' . str_replace("'", "'", $sArgument) . ''';
            if (
is_bool($sArgument))
            {
                
$sValue = ($sArgument === true 'true' 'false');
            }
            
            
$sArgs .= $sValue ',';
        }
        
$sArgs rtrim($sArgs',');
        
        
$this->call('$('' . $aArguments[0] . '').' $sMethod '(' $sArgs ');');
        
        return 
$this;
    }
    
    
/**
     * Sets a public message on the site for the user to see and closes the AJAX popup box for you.
     *
     * @param string $sMessage Message you want to display to the user.
     */
    
public function setMessage($sMessage)
    {
        
$this->height('#TB_ajaxContent''35px')->html('#TB_ajaxContent''<div class="valid_message">' $sMessage '</div>')->call('setTimeout("tb_remove();", 1000);');        
    }
    
    
/**
     * Updates moderation count menu
     *
     */
    
public function updateCount()
    {
        
$this->call('var oSubsectionCountItem = $('.sub_section_menu .active .pending'); if ($(oSubsectionCountItem).length > 0) { var iSubsectionCount = parseInt(oSubsectionCountItem.html()); if (iSubsectionCount > 1) { oSubsectionCountItem.html(parseInt(iSubsectionCount - 1)); } else { $('.sub_section_menu .active').remove(); } }');
    }
    
    
/**
     * Extend template
     * 
     * @example $this->template()->assign();
     * @example $this->template()->getTemplate();
     * @return object Template object
     */
    
protected function template()
    {
        return 
Phpfox::getLib('template');
    }    
    
    
/**
     * Safe AJAX Code
     * 
     * @param    string    $sStr String to replace
     * @return    string    Safe string
     */
    
private function _ajaxSafe($sStr)
    {
        
$sStr str_replace(array("n""r"), '\n'$sStr);
        
        ((
$sPlugin Phpfox_Plugin::get('ajax__ajaxsafe')) ? eval($sPlugin) : false);

        return 
$sStr;
    }
}

?>
Онлайн: 0
Реклама