/** zagnieżdża proces za aktualnie wykonywanym krokiem * * uwaga w tej chwili istnieje możliwość zagnieżdżania procesów tylko w głównym procesie, * jeżeli kiedyś zajdzie taka potrzeba należy dorobić funkcjonalność zagnieżdzania procesów w głąb o więcej niż 1 stopień * * @param string $processName */ public function includeProcessAfterActualStep($processName) { $model = new Process(); $row = $model->fetchRow($model->select()->where('process_name = ?', $processName)); if (is_null($row)) { throw new Exception('Nie znaleziono procesu o takiej nazwie'); } $row = $row->toArray(); $processId = $row['id']; $processDescription = $row['description']; $model = new ProcessSteps(); $rowset = $model->fetchAll($model->select()->where('process_id = ?', $processId)->order('step_order')); if (is_null($rowset)) { throw new Exception('Nie znaleziono żadnych kroków przypisanych do tego procesu'); } $rowset = $rowset->toArray(); // jeżeli jesteśmy w głównym procesie if ($this->actualProcesName == $this->generalProcesName) { // budowana nowa tablica kroków z zagnieżdzonym procesem $newStepsArray = array(); for ($i = 0; $i <= $this->actualStep; $i++) { $newStepsArray[] = $this->sessionNamespace->stepArray[$i]; } $includedProcessArray = array(self::INCLUDED_PROCESS => true, 'processName' => $processName, 'description' => $processDescription, 'done' => false, 'stepArray' => array()); foreach ($rowset as $stepRow) { $tmpArray = array('action_name' => $stepRow['action'], 'controller' => $stepRow['controller'], 'description' => $stepRow['description'], 'done' => false); $includedProcessArray['stepArray'][] = $tmpArray; } $newStepsArray[] = $includedProcessArray; for ($i = $this->actualStep + 1; $i < count($this->sessionNamespace->stepArray); $i++) { $newStepsArray[] = $this->sessionNamespace->stepArray[$i]; } $this->sessionNamespace->stepArray = $newStepsArray; $this->setStepsToView(); } else { // @to_do zrobić możliwość zagnieżdżania procesów w głąb więcej niż o jeden! throw new Exception('Nie można zagnieżdżać procesów więcej niż 1 w głąb'); } }
public function __call($methodName, $args) { // jeżeli nie używać kolejki kroków if (!Base_Controller_Action_Helper_Steps::getUseSteps()) { return parent::__call($methodName, $args); } // jeżeli akcja nie jest akcją inicjującą proces if (substr($methodName, -13, 7) != 'Process' || substr($methodName, -6) != 'Action') { return parent::__call($methodName, $args); } $stepsHelper = $this->_helper->getHelper('steps'); $processName = substr($methodName, 0, -13); // jeżeli akcja zamykająca proces, zakończ proces i przekieruj na wyszukiwanie if ($processName == 'stop') { $ownerAction = $stepsHelper->getOwnerAction(); $this->_helper->messenger->error("Proces '" . $stepsHelper->getGeneralProcesDesc() . "' został anulowany"); $stepsHelper->closeStepsQueue(); $redirector = $this->_helper->getHelper('Redirector'); $redirector->setExit(true); if ($ownerAction === false || !is_array($ownerAction)) { $this->_helper->redirector('index', 'index', null, array()); } else { $this->_helper->redirector($ownerAction['action'], $ownerAction['controller'], null, $ownerAction['params']); } return; } // jeżeli jesteśmy w kolejce kroków if ($stepsHelper->isStepsQueue()) { // jeżeli wywołany proces jest innym procesem niż ten w kolejce if ($stepsHelper->getGeneralProcessName() != $processName) { $stepsHelper->closeStepsQueue(); $stepsHelper->initNewProcess($processName); } // jeżeli kolejka kroków nie istnieje } else { $model = new Process(); $row = $model->fetchRow($model->select('id')->where('process_name = ? ', $processName)); if (is_null($row)) { return parent::__call($methodName, $args); } $stepsHelper->initNewProcess($processName); } $stepsHelper->forwardToActualStep($this->getRequest()->getParams()); }