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

class XenForo_ControllerAdmin_Cron extends XenForo_ControllerAdmin_Abstract
{
    protected function 
_preDispatch($action)
    {
        
$this->assertAdminPermission('cron');
    }

    
/**
     * Displays a list of cron entries.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionIndex()
    {
        
$cronModel $this->_getCronModel();

        
$viewParams = array(
            
'entries' => $cronModel->prepareCronEntries($cronModel->getAllCronEntries())
        );

        return 
$this->responseView('XenForo_ViewAdmin_Cron_List''cron_list'$viewParams);
    }

    
/**
     * Gets the cron entry add/edit form response.
     *
     * @param array $entry
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
protected function _getCronEntryAddEditResponse(array $entry)
    {
        if (!empty(
$entry['entry_id']))
        {
            
$masterTitle $this->_getCronModel()->getCronEntryMasterTitlePhraseValue($entry['entry_id']);
        }
        else
        {
            
$masterTitle '';
        }

        
$addOnModel $this->_getAddOnModel();

        
$viewParams = array(
            
'entry' => $entry,
            
'masterTitle' => $masterTitle,
            
'addOnOptions' => $this->_getAddOnModel()->getAddOnOptionsListIfAvailable(),
            
'addOnSelected' => (isset($entry['addon_id']) ? $entry['addon_id'] : $addOnModel->getDefaultAddOnId())
        );

        return 
$this->responseView('XenForo_ViewAdmin_Cron_Edit''cron_edit'$viewParams);
    }

    
/**
     * Displays a form to add a new cron entry.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionAdd()
    {
        return 
$this->_getCronEntryAddEditResponse($this->_getCronModel()->getDefaultCronEntry());
    }

    
/**
     * Displays a form to edit an existing cron entry.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionEdit()
    {
        
$entryId $this->_input->filterSingle('entry_id'XenForo_Input::STRING);
        
$entry $this->_getCronEntryOrError($entryId);

        return 
$this->_getCronEntryAddEditResponse($entry);
    }

    
/**
     * Inserts a new cron entry or updates an existing one.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionSave()
    {
        
$this->_assertPostOnly();

        
$originalEntryId $this->_input->filterSingle('original_entry_id'XenForo_Input::STRING);
        
$dwData $this->_input->filter(array(
            
'entry_id' => XenForo_Input::STRING,
            
'cron_class' => XenForo_Input::STRING,
            
'cron_method' => XenForo_Input::STRING,
            
'run_rules' => XenForo_Input::ARRAY_SIMPLE,
            
'active' => XenForo_Input::UINT,
            
'addon_id' => XenForo_Input::STRING
        
));
        
$titlePhrase $this->_input->filterSingle('title'XenForo_Input::STRING);

        
$dw XenForo_DataWriter::create('XenForo_DataWriter_CronEntry');
        if (
$originalEntryId)
        {
            
$dw->setExistingData($originalEntryId);
        }
        
$dw->bulkSet($dwData);
        
$dw->setExtraData(XenForo_DataWriter_CronEntry::DATA_TITLE$titlePhrase);
        
$dw->save();

        return 
$this->responseRedirect(
            
XenForo_ControllerResponse_Redirect::SUCCESS,
            
XenForo_Link::buildAdminLink('cron') . $this->getLastHash($dwData['entry_id'])
        );
    }

    
/**
     * Deletes a cron entry.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionDelete()
    {
        
// TODO: need to prevent cron entries from being deleted that belong to add-ons in non-debug mode

        
if ($this->isConfirmedPost())
        {
            return 
$this->_deleteData(
                
'XenForo_DataWriter_CronEntry''entry_id',
                
XenForo_Link::buildAdminLink('cron')
            );
        }
        else
        {
            
$entryId $this->_input->filterSingle('entry_id'XenForo_Input::STRING);
            
$entry $this->_getCronEntryOrError($entryId);

            
$viewParams = array(
                
'entry' => $entry
            
);

            return 
$this->responseView('XenForo_ViewAdmin_Cron_Delete''cron_delete'$viewParams);
        }
    }

    
/**
     * Helper to switch the active state for an cron entry and get the controller response.
     *
     * @param string $entryId Cron entry ID
     * @param integer $activeState O or 1
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
protected function _switchCronEntryActiveStateAndGetResponse($entryId$activeState)
    {
        
$dw XenForo_DataWriter::create('XenForo_DataWriter_CronEntry');
        
$dw->setExistingData($entryId);
        
$dw->set('active'$activeState);
        
$dw->save();

        return 
$this->responseRedirect(
            
XenForo_ControllerResponse_Redirect::SUCCESS,
            
XenForo_Link::buildAdminLink('cron')
        );
    }

    
/**
     * Enables the specified cron entry.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionEnable()
    {
        
// can be requested over GET, so check for the token manually
        
$this->_checkCsrfFromToken($this->_input->filterSingle('_xfToken'XenForo_Input::STRING));

        
$entryId $this->_input->filterSingle('entry_id'XenForo_Input::STRING);
        return 
$this->_switchCronEntryActiveStateAndGetResponse($entryId1);
    }

    
/**
     * Disables the specified cron entry.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionDisable()
    {
        
// can be requested over GET, so check for the token manually
        
$this->_checkCsrfFromToken($this->_input->filterSingle('_xfToken'XenForo_Input::STRING));

        
$entryId $this->_input->filterSingle('entry_id'XenForo_Input::STRING);
        return 
$this->_switchCronEntryActiveStateAndGetResponse($entryId0);
    }

    
/**
     * Runs a cron entry. This does not relate to the next run time.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionRun()
    {
        
$this->_checkCsrfFromToken($this->_input->filterSingle('_xfToken'XenForo_Input::STRING));

        
$entryId $this->_input->filterSingle('entry_id'XenForo_Input::STRING);
        
$entry $this->_getCronEntryOrError($entryId);

        if (
$entry['addon_id'] && $entry['addon_id'] != 'XenForo')
        {
            
$addOn $this->_getAddOnModel()->getAddOnById($entry['addon_id']);
            if (!
$addOn || !$addOn['active'])
            {
                return 
$this->responseError(new XenForo_Phrase('cron_entry_associated_with_inactive_add_on_cannot_run'));
            }
        }

        
$this->_getCronModel()->runEntry($entry); // TODO: capture output or something more useful

        
return $this->responseMessage(new XenForo_Phrase('cron_entry_run_successfully'));
    }

    
/**
     * Selectively enables or disables specified cron task
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionToggle()
    {
        return 
$this->_getToggleResponse(
            
$this->_getCronModel()->getAllCronEntries(),
            
'XenForo_DataWriter_CronEntry',
            
'cron');
    }

    
/**
     * Gets the specified cron entry or throws an exception.
     *
     * @param string $id
     *
     * @return array
     */
    
protected function _getCronEntryOrError($id)
    {
        
$cronModel $this->_getCronModel();

        return 
$cronModel->prepareCronEntry(
            
$this->getRecordOrError(
                
$id$cronModel'getCronEntryById',
                
'requested_cron_entry_not_found'
            
)
        );
    }

    
/**
     * @return XenForo_Model_Cron
     */
    
protected function _getCronModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_Cron');
    }

    
/**
     * @return XenForo_Model_AddOn
     */
    
protected function _getAddOnModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_AddOn');
    }
}
Онлайн: 0
Реклама