Вход Регистрация
Файл: concrete5.7.5.6/concrete/src/Workflow/Progress/Progress.php
Строк: 219
<?php

namespace ConcreteCoreWorkflowProgress;

use 
ConcreteCoreFoundationObject;
use 
ConcreteCoreWorkflowWorkflow;
use 
ConcreteCoreWorkflowRequestRequest as WorkflowRequest;
use 
ConcreteCoreWorkflowEmptyWorkflow;
use 
ConcreteCoreWorkflowProgressCategory as WorkflowProgressCategory;
use 
ConcreteCorePackagePackageList;
use 
Database;
use 
Core;

/**
 * Base class for workflow progresses.
 *
 * @method static Progress add(string $wpCategoryHandle, Workflow $wf, WorkflowRequest $wr) Deprecated method. Use Progress::create instead.
 */
abstract class Progress extends Object
{
    protected 
$wpID;
    protected 
$wpDateAdded;
    protected 
$wfID;
    protected 
$response;
    protected 
$wpDateLastAction;

    
/**
     * Gets the Workflow object attached to this WorkflowProgress object.
     *
     * @return Workflow
     */
    
public function getWorkflowObject()
    {
        if (
$this->wfID 0) {
            
$wf Workflow::getByID($this->wfID);
        } else {
            
$wf = new EmptyWorkflow();
        }

        return 
$wf;
    }

    
/**
     * Gets an optional WorkflowResponse object. This is set in some cases.
     */
    
public function getWorkflowProgressResponseObject()
    {
        return 
$this->response;
    }

    public function 
setWorkflowProgressResponseObject($obj)
    {
        
$this->response $obj;
    }

    
/**
     * Gets the date of the last action.
     */
    
public function getWorkflowProgressDateLastAction()
    {
        return 
$this->wpDateLastAction;
    }

    
/**
     * Gets the ID of the progress object.
     */
    
public function getWorkflowProgressID()
    {
        return 
$this->wpID;
    }

    
/**
     * Gets the ID of the progress object.
     */
    
public function getWorkflowProgressCategoryHandle()
    {
        return 
$this->wpCategoryHandle;
    }

    
/**
     * Get the category ID.
     */
    
public function getWorkflowProgressCategoryID()
    {
        return 
$this->wpCategoryID;
    }

    
/**
     * Gets the date the WorkflowProgress object was added.
     *
     * @return datetime
     */
    
public function getWorkflowProgressDateAdded()
    {
        return 
$this->wpDateAdded;
    }

    
/**
     * Get the WorkflowRequest object for the current WorkflowProgress object.
     *
     * @return WorkflowRequest
     */
    
public function getWorkflowRequestObject()
    {
        if (
$this->wrID 0) {
            
$cat WorkflowProgressCategory::getByID($this->wpCategoryID);
            
$handle $cat->getWorkflowProgressCategoryHandle();
            
$class '\Core\Workflow\Request\' . Core::make('helper/text')->camelcase($handle) . 'Request';
            $pkHandle = $cat->getPackageHandle();
            $class = core_class($class, $pkHandle);
            $wr = $class::getByID($this->wrID);
            if (is_object($wr)) {
                $wr->setCurrentWorkflowProgressObject($this);

                return $wr;
            }
        }
    }

    public static function __callStatic($name, $arguments)
    {
        if (strcasecmp($name, '
add') === 0) {
            return call_user_func_array('
static::create', $arguments);
        }
        trigger_error("Call to undefined method ".__CLASS__."::$name()", E_USER_ERROR);
    }

    /**
     * Creates a WorkflowProgress object (which will be assigned to a Page, File, etc... in our system.
     *
     * @param string $wpCategoryHandle
     * @param Workflow $wf
     * @param WorkflowRequest $wr
     *
     * @return self
     */
    public static function create($wpCategoryHandle, Workflow $wf, WorkflowRequest $wr)
    {
        $db = Database::connection();
        $wpDateAdded = Core::make('
helper/date')->getOverridableNow();
        $wpCategoryID = $db->fetchColumn('
select wpCategoryID from WorkflowProgressCategories where wpCategoryHandle = ?', array($wpCategoryHandle));
        $db->executeQuery('
insert into WorkflowProgress (wfIDwrIDwpDateAddedwpCategoryIDvalues (?, ?, ?, ?)', array(
            $wf->getWorkflowID(), $wr->getWorkflowRequestID(), $wpDateAdded, $wpCategoryID,
        ));
        $wp = self::getByID($db->lastInsertId());
        $wp->addWorkflowProgressHistoryObject($wr);

        return $wp;
    }

    public function delete()
    {
        $db = Database::connection();
        $wr = $this->getWorkflowRequestObject();
        $db->executeQuery('
delete from WorkflowProgress where wpID = ?', array($this->wpID));
        // now we clean up any WorkflowRequests that aren'
t in use any longer
        $cnt 
$db->fetchColumn('select count(wpID) from WorkflowProgress where wrID = ?', array($this->wrID));
        if (
$cnt == 0) {
            
$wr->delete();
        }
    }

    public static function 
getByID($wpID)
    {
        
$db Database::connection();
        
$r $db->fetchAssoc('select WorkflowProgress.*, WorkflowProgressCategories.wpCategoryHandle, WorkflowProgressCategories.pkgID from WorkflowProgress inner join WorkflowProgressCategories on WorkflowProgress.wpCategoryID = WorkflowProgressCategories.wpCategoryID where wpID  = ?', array($wpID));
        if (!
is_array($r) || (!$r['wpID'])) {
            return 
false;
        }
        
$class '\Core\Workflow\Progress\' . Core::make('helper/text')->camelcase($r['wpCategoryHandle']) . 'Progress';

        if ($r['
pkgID']) {
            $pkgHandle = PackageList::getHandle($r['
pkgID']);
        }
        $class = core_class($class, $pkgHandle);
        $wp = Core::make($class);
        $wp->setPropertiesFromArray($r);
        $wp->loadDetails();

        return $wp;
    }

    public static function getRequestedTask()
    {
        $task = '';
        foreach ($_POST as $key => $value) {
            if (strpos($key, '
action_') > -1) {
                return substr($key, 7);
            }
        }
    }

    /**
     * The function that is automatically run when a workflowprogress object is started.
     */
    public function start()
    {
        $wf = $this->getWorkflowObject();
        if (is_object($wf)) {
            $r = $wf->start($this);
            $this->updateOnAction($wf);
        }

        return $r;
    }

    public function updateOnAction(Workflow $wf)
    {
        $db = Database::connection();
        $num = $wf->getWorkflowProgressCurrentStatusNum($this);
        $time = Core::make('
helper/date')->getOverridableNow();
        $db->executeQuery('
update WorkflowProgress set wpDateLastAction = ?, wpCurrentStatus = ? where wpID = ?', array($time, $num, $this->wpID));
    }

    /**
     * Attempts to run a workflow task on the bound WorkflowRequest object first, then if that doesn'
t existattempts to run
     
it on the current WorkflowProgress object.
     *
     * @return 
WorkflowProgressResponse
     
*/
    public function 
runTask($task$args = array())
    {
        
$wf $this->getWorkflowObject();
        if (
in_array($task$wf->getAllowedTasks())) {
            
$wpr call_user_func_array(array($wf$task), array($this$args));
            
$this->updateOnAction($wf);
        }
        if (!(
$wpr instanceof Response)) {
            
$wpr = new Response();
        }

        return 
$wpr;
    }

    public function 
getWorkflowProgressActions()
    {
        
$w $this->getWorkflowObject();
        
$req $this->getWorkflowRequestObject();
        
$actions $req->getWorkflowRequestAdditionalActions($this);
        
$actions array_merge($actions$w->getWorkflowProgressActions($this));

        return 
$actions;
    }

    abstract public function 
getWorkflowProgressFormAction();
    abstract public function 
loadDetails();

    public function 
getWorkflowProgressHistoryObjectByID($wphID)
    {
        
$class '\Concrete\Core\Workflow\Progress\' . camelcase($this->getWorkflowProgressCategoryHandle()) . 'History';
        $db = Database::connection();
        $row = $db->fetchAssoc('
select from WorkflowProgressHistory where wphID = ?', array($wphID));
        if (is_array($row) && ($row['
wphID'])) {
            $obj = new $class();
            $obj->setPropertiesFromArray($row);
            $obj->object = @unserialize($row['
object']);

            return $obj;
        }
    }

    public function addWorkflowProgressHistoryObject($obj)
    {
        $db = Database::connection();
        $db->executeQuery('
insert into WorkflowProgressHistory (wpIDobjectvalues (?, ?)', array($this->wpID, serialize($obj)));
    }

    public function markCompleted()
    {
        $db = Database::connection();
        $db->executeQuery('
update WorkflowProgress set wpIsCompleted 1 where wpID = ?', array($this->wpID));
    }

    abstract public function getPendingWorkflowProgressList();
}
Онлайн: 1
Реклама