PageRenderTime 51ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/app/protected/modules/workflows/controllers/DefaultController.php

https://bitbucket.org/zurmo/zurmo/
PHP | 581 lines | 510 code | 33 blank | 38 comment | 23 complexity | d98fe92c98a5042d914a398deb34d867 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause, GPL-2.0, LGPL-3.0, LGPL-2.1, BSD-2-Clause
  1. <?php
  2. /*********************************************************************************
  3. * Zurmo is a customer relationship management program developed by
  4. * Zurmo, Inc. Copyright (C) 2015 Zurmo Inc.
  5. *
  6. * Zurmo is free software; you can redistribute it and/or modify it under
  7. * the terms of the GNU Affero General Public License version 3 as published by the
  8. * Free Software Foundation with the addition of the following permission added
  9. * to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK
  10. * IN WHICH THE COPYRIGHT IS OWNED BY ZURMO, ZURMO DISCLAIMS THE WARRANTY
  11. * OF NON INFRINGEMENT OF THIRD PARTY RIGHTS.
  12. *
  13. * Zurmo is distributed in the hope that it will be useful, but WITHOUT
  14. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  15. * FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
  16. * details.
  17. *
  18. * You should have received a copy of the GNU Affero General Public License along with
  19. * this program; if not, see http://www.gnu.org/licenses or write to the Free
  20. * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  21. * 02110-1301 USA.
  22. *
  23. * You can contact Zurmo, Inc. with a mailing address at 27 North Wacker Drive
  24. * Suite 370 Chicago, IL 60606. or at email address contact@zurmo.com.
  25. *
  26. * The interactive user interfaces in original and modified versions
  27. * of this program must display Appropriate Legal Notices, as required under
  28. * Section 5 of the GNU Affero General Public License version 3.
  29. *
  30. * In accordance with Section 7(b) of the GNU Affero General Public License version 3,
  31. * these Appropriate Legal Notices must retain the display of the Zurmo
  32. * logo and Zurmo copyright notice. If the display of the logo is not reasonably
  33. * feasible for technical reasons, the Appropriate Legal Notices must display the words
  34. * "Copyright Zurmo Inc. 2015. All rights reserved".
  35. ********************************************************************************/
  36. /**
  37. * Default controller for all workflow actions
  38. */
  39. class WorkflowsDefaultController extends ZurmoBaseController
  40. {
  41. const USER_EMAIL_TEMPLATE_ACCESS_FILTER_PATH =
  42. 'application.modules.workflows.controllers.filters.UserCanAccessEmailTemplatesForWorkflowCheckControllerFilter';
  43. const ZERO_MODELS_CHECK_FILTER_PATH = 'application.modules.workflows.controllers.filters.WorkflowZeroModelsCheckControllerFilter';
  44. public static function getListBreadcrumbLinks()
  45. {
  46. $title = Zurmo::t('WorkflowsModule', 'Workflows');
  47. return array($title);
  48. }
  49. public static function getManageOrderBreadcrumbLinks()
  50. {
  51. $title = Zurmo::t('ZurmoModule', 'Ordering');
  52. return array($title);
  53. }
  54. public function filters()
  55. {
  56. return array_merge(parent::filters(),
  57. array(
  58. array(
  59. self::getRightsFilterPath() . ' + selectType',
  60. 'moduleClassName' => 'WorkflowsModule',
  61. 'rightName' => WorkflowsModule::RIGHT_CREATE_WORKFLOWS,
  62. ),
  63. array(
  64. static::USER_EMAIL_TEMPLATE_ACCESS_FILTER_PATH,
  65. 'controller' => $this,
  66. ),
  67. array(
  68. static::ZERO_MODELS_CHECK_FILTER_PATH . ' + list, index',
  69. 'controller' => $this,
  70. 'activeActionElementType' => 'WorkflowsMenu',
  71. 'breadCrumbLinks' => static::getListBreadcrumbLinks(),
  72. ),
  73. array(
  74. static::ZERO_MODELS_CHECK_FILTER_PATH . ' + manageOrder',
  75. 'controller' => $this,
  76. 'activeActionElementType' => 'WorkflowManageOrderMenu',
  77. 'breadCrumbLinks' => static::getManageOrderBreadcrumbLinks(),
  78. ),
  79. )
  80. );
  81. }
  82. public function actionIndex()
  83. {
  84. $this->actionList();
  85. }
  86. public function actionList()
  87. {
  88. $pageSize = Yii::app()->pagination->resolveActiveForCurrentUserByType(
  89. 'listPageSize', get_class($this->getModule()));
  90. $activeActionElementType = 'WorkflowsMenu';
  91. $savedWorkflow = new SavedWorkflow(false);
  92. $searchForm = new WorkflowsSearchForm($savedWorkflow);
  93. $dataProvider = $this->resolveSearchDataProvider($searchForm, $pageSize, null,
  94. 'WorkflowsSearchView');
  95. $breadCrumbLinks = static::getListBreadcrumbLinks();
  96. if (isset($_GET['ajax']) && $_GET['ajax'] == 'list-view')
  97. {
  98. $mixedView = $this->makeListView(
  99. $searchForm,
  100. $dataProvider
  101. );
  102. $view = new WorkflowsPageView($mixedView);
  103. }
  104. else
  105. {
  106. $mixedView = $this->makeActionBarSearchAndListView($searchForm, $dataProvider,
  107. 'SecuredActionBarForWorkflowsSearchAndListView', null, $activeActionElementType);
  108. $view = new WorkflowsPageView(ZurmoDefaultAdminViewUtil::
  109. makeViewWithBreadcrumbsForCurrentUser(
  110. $this, $mixedView, $breadCrumbLinks, 'WorkflowBreadCrumbView'));
  111. }
  112. echo $view->render();
  113. }
  114. public function actionDetails($id)
  115. {
  116. $savedWorkflow = static::getModelAndCatchNotFoundAndDisplayError('SavedWorkflow', intval($id));
  117. ControllerSecurityUtil::resolveCanCurrentUserAccessModule($savedWorkflow->moduleClassName);
  118. ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($savedWorkflow);
  119. AuditEvent::logAuditEvent('ZurmoModule', ZurmoModule::AUDIT_EVENT_ITEM_VIEWED,
  120. array(strval($savedWorkflow), 'WorkflowsModule'), $savedWorkflow);
  121. $breadCrumbLinks = array(strval($savedWorkflow));
  122. $workflow = SavedWorkflowToWorkflowAdapter::makeWorkflowBySavedWorkflow($savedWorkflow);
  123. $workflowToWizardFormAdapter = new WorkflowToWizardFormAdapter($workflow);
  124. $form = $workflowToWizardFormAdapter->makeFormByType();
  125. $detailsView = new WorkflowDetailsView($this->getId(), $this->getModule()->getId(), $form);
  126. $view = new WorkflowsPageView( ZurmoDefaultAdminViewUtil::
  127. makeViewWithBreadcrumbsForCurrentUser(
  128. $this,
  129. $detailsView,
  130. $breadCrumbLinks,
  131. 'WorkflowBreadCrumbView'));
  132. echo $view->render();
  133. }
  134. public function actionSelectType()
  135. {
  136. $breadCrumbLinks = array(Zurmo::t('WorkflowsModule', 'Select Workflow Type'));
  137. $view = new WorkflowsPageView( ZurmoDefaultAdminViewUtil::
  138. makeViewWithBreadcrumbsForCurrentUser(
  139. $this,
  140. new WorkflowWizardTypesGridView(),
  141. $breadCrumbLinks,
  142. 'WorkflowBreadCrumbView'));
  143. echo $view->render();
  144. }
  145. public function actionCreate($type = null)
  146. {
  147. if ($type == null)
  148. {
  149. $this->actionSelectType();
  150. Yii::app()->end(0, false);
  151. }
  152. $breadCrumbLinks = array(Zurmo::t('Core', 'Create'));
  153. assert('is_string($type)');
  154. $workflow = new Workflow();
  155. $workflow->setType($type);
  156. $workflow->setIsActive(true);
  157. $progressBarAndStepsView = WorkflowWizardViewFactory::makeStepsAndProgressBarViewFromWorkflow($workflow);
  158. $wizardWizardView = WorkflowWizardViewFactory::makeViewFromWorkflow($workflow);
  159. $view = new WorkflowsPageView( ZurmoDefaultAdminViewUtil::
  160. makeTwoViewsWithBreadcrumbsForCurrentUser(
  161. $this, $progressBarAndStepsView,
  162. $wizardWizardView,
  163. $breadCrumbLinks,
  164. 'WorkflowBreadCrumbView'));
  165. echo $view->render();
  166. }
  167. public function actionEdit($id, $isBeingCopied = false)
  168. {
  169. $savedWorkflow = SavedWorkflow::getById((int)$id);
  170. ControllerSecurityUtil::resolveCanCurrentUserAccessModule($savedWorkflow->moduleClassName);
  171. $breadCrumbLinks = array(strval($savedWorkflow));
  172. $workflow = SavedWorkflowToWorkflowAdapter::makeWorkflowBySavedWorkflow($savedWorkflow);
  173. $progressBarAndStepsView = WorkflowWizardViewFactory::makeStepsAndProgressBarViewFromWorkflow($workflow);
  174. $wizardWizardView = WorkflowWizardViewFactory::makeViewFromWorkflow($workflow, (bool)$isBeingCopied);
  175. $view = new WorkflowsPageView( ZurmoDefaultAdminViewUtil::
  176. makeTwoViewsWithBreadcrumbsForCurrentUser(
  177. $this, $progressBarAndStepsView,
  178. $wizardWizardView,
  179. $breadCrumbLinks,
  180. 'WorkflowBreadCrumbView'));
  181. echo $view->render();
  182. }
  183. public function actionSave($type, $id = null, $isBeingCopied = false)
  184. {
  185. $postData = PostUtil::getData();
  186. $savedWorkflow = null;
  187. $workflow = null;
  188. $this->resolveSavedWorkflowAndWorkflowByPostData($postData, $savedWorkflow, $workflow, $type, $id,
  189. (bool)$isBeingCopied);
  190. $workflowToWizardFormAdapter = new WorkflowToWizardFormAdapter($workflow);
  191. $model = $workflowToWizardFormAdapter->makeFormByType();
  192. if (isset($postData['ajax']) && $postData['ajax'] === 'edit-form')
  193. {
  194. $this->actionValidate($postData, $model);
  195. }
  196. SavedWorkflowToWorkflowAdapter::resolveWorkflowToSavedWorkflow($workflow, $savedWorkflow);
  197. SavedWorkflowsUtil::resolveOrder($savedWorkflow, (bool)$isBeingCopied);
  198. if ($savedWorkflow->id > 0)
  199. {
  200. ControllerSecurityUtil::resolveCanCurrentUserAccessModule($savedWorkflow->moduleClassName);
  201. }
  202. if ($savedWorkflow->save())
  203. {
  204. echo CJSON::encode(array('id' => $savedWorkflow->id, 'redirectToList' => false));
  205. Yii::app()->end(0, false);
  206. }
  207. else
  208. {
  209. throw new FailedToSaveModelException();
  210. }
  211. }
  212. public function actionRelationsAndAttributesTree($type, $treeType, $id = null, $nodeId = null, $isBeingCopied = false)
  213. {
  214. $postData = PostUtil::getData();
  215. $savedWorkflow = null;
  216. $workflow = null;
  217. $this->resolveSavedWorkflowAndWorkflowByPostData($postData, $savedWorkflow, $workflow, $type, $id,
  218. (bool)$isBeingCopied);
  219. if ($nodeId != null)
  220. {
  221. $wizardToTreeAdapter = new WorkflowRelationsAndAttributesToTreeAdapter($workflow, $treeType);
  222. echo ZurmoTreeView::saveDataAsJson($wizardToTreeAdapter->getData($nodeId));
  223. Yii::app()->end(0, false);
  224. }
  225. $view = new WorkflowRelationsAndAttributesTreeView($type, $treeType, 'edit-form');
  226. $content = $view->render();
  227. Yii::app()->getClientScript()->setToAjaxMode();
  228. Yii::app()->getClientScript()->render($content);
  229. echo $content;
  230. }
  231. public function actionAddAttributeFromTree($type, $treeType, $nodeId, $rowNumber,
  232. $trackableStructurePosition = false, $id = null, $isBeingCopied = false)
  233. {
  234. $postData = PostUtil::getData();
  235. $savedWorkflow = null;
  236. $workflow = null;
  237. $this->resolveSavedWorkflowAndWorkflowByPostData($postData, $savedWorkflow, $workflow, $type, $id,
  238. (bool)$isBeingCopied);
  239. $nodeIdWithoutTreeType = WorkflowRelationsAndAttributesToTreeAdapter::
  240. removeTreeTypeFromNodeId($nodeId, $treeType);
  241. $moduleClassName = $workflow->getModuleClassName();
  242. $modelClassName = $moduleClassName::getPrimaryModelName();
  243. $form = new WizardActiveForm();
  244. $form->id = WorkflowWizardView::getFormId();
  245. $form->enableAjaxValidation = true; //ensures error validation populates correctly
  246. $wizardFormClassName = WorkflowToWizardFormAdapter::getFormClassNameByType($workflow->getType());
  247. $model = ComponentForWorkflowFormFactory::makeByComponentType($moduleClassName,
  248. $modelClassName, $workflow->getType(), $treeType);
  249. $form->modelClassNameForError = $wizardFormClassName;
  250. $attribute = WorkflowRelationsAndAttributesToTreeAdapter::
  251. resolveAttributeByNodeId($nodeIdWithoutTreeType);
  252. $model->attributeIndexOrDerivedType = WorkflowRelationsAndAttributesToTreeAdapter::
  253. resolveAttributeByNodeId($nodeIdWithoutTreeType);
  254. $inputPrefixData = WorkflowRelationsAndAttributesToTreeAdapter::
  255. resolveInputPrefixData($wizardFormClassName,
  256. $treeType, (int)$rowNumber);
  257. $adapter = new WorkflowAttributeToElementAdapter($inputPrefixData, $model,
  258. $form, $treeType);
  259. $view = new AttributeRowForWorkflowComponentView($adapter,
  260. (int)$rowNumber, $inputPrefixData, $attribute,
  261. (bool)$trackableStructurePosition, true, $treeType);
  262. $content = $view->render();
  263. $form->renderAddAttributeErrorSettingsScript($view::getFormId());
  264. Yii::app()->getClientScript()->setToAjaxMode();
  265. Yii::app()->getClientScript()->render($content);
  266. echo $content;
  267. }
  268. public function actionDelete($id)
  269. {
  270. $savedWorkflow = SavedWorkflow::GetById(intval($id));
  271. ControllerSecurityUtil::resolveCanCurrentUserAccessModule($savedWorkflow->moduleClassName);
  272. ControllerSecurityUtil::resolveAccessCanCurrentUserDeleteModel($savedWorkflow);
  273. $savedWorkflow->delete();
  274. $this->redirect(array($this->getId() . '/index'));
  275. }
  276. public function actionGetAvailableAttributesForTimeTrigger($type, $id = null, $isBeingCopied = false)
  277. {
  278. $postData = PostUtil::getData();
  279. $savedWorkflow = null;
  280. $workflow = null;
  281. $this->resolveSavedWorkflowAndWorkflowByPostData($postData, $savedWorkflow, $workflow, $type, $id,
  282. (bool)$isBeingCopied);
  283. $moduleClassName = $workflow->getModuleClassName();
  284. $modelClassName = $moduleClassName::getPrimaryModelName();
  285. $dataAndLabels = WorkflowUtil::resolveDataAndLabelsForTimeTriggerAvailableAttributes(
  286. $moduleClassName, $modelClassName, $workflow->getType());
  287. echo CJSON::encode($dataAndLabels);
  288. }
  289. public function actionAddOrChangeTimeTriggerAttribute($type, $attributeIndexOrDerivedType, $moduleClassName,
  290. $id = null, $isBeingCopied = false)
  291. {
  292. $componentType = TimeTriggerForWorkflowForm::getType();
  293. $postData = PostUtil::getData();
  294. //Special situation since this is coming form GET
  295. $postData['ByTimeWorkflowWizardForm']['moduleClassName'] = $moduleClassName;
  296. $savedWorkflow = null;
  297. $workflow = null;
  298. $this->resolveSavedWorkflowAndWorkflowByPostData($postData, $savedWorkflow, $workflow, $type, $id,
  299. (bool)$isBeingCopied);
  300. $moduleClassName = $workflow->getModuleClassName();
  301. $modelClassName = $moduleClassName::getPrimaryModelName();
  302. $form = new WizardActiveForm();
  303. $form->enableAjaxValidation = true; //ensures error validation populates correctly
  304. $form->id = WorkflowWizardView::getFormId();
  305. $wizardFormClassName = WorkflowToWizardFormAdapter::getFormClassNameByType($workflow->getType());
  306. $model = ComponentForWorkflowFormFactory::makeByComponentType($moduleClassName,
  307. $modelClassName, $workflow->getType(), $componentType);
  308. $form->modelClassNameForError = $wizardFormClassName;
  309. $model->attributeIndexOrDerivedType = $attributeIndexOrDerivedType;
  310. $inputPrefixData = array($wizardFormClassName, $componentType);
  311. $adapter = new WorkflowAttributeToElementAdapter($inputPrefixData, $model,
  312. $form, $componentType);
  313. $view = new AttributeRowForWorkflowComponentView($adapter,
  314. 1, $inputPrefixData, $attributeIndexOrDerivedType,
  315. false, true, $componentType);
  316. $content = $view->render();
  317. $form->renderAddAttributeErrorSettingsScript($view::getFormId());
  318. Yii::app()->getClientScript()->setToAjaxMode();
  319. Yii::app()->getClientScript()->render($content);
  320. echo $content;
  321. }
  322. public function actionChangeActionType($moduleClassName, $type)
  323. {
  324. $content = ZurmoHtml::dropDownList(ActionsForWorkflowWizardView::ACTION_TYPE_RELATION_NAME,
  325. null, ActionsForWorkflowWizardView::resolveTypeRelationDataAndLabels(
  326. $moduleClassName, $moduleClassName::getPrimaryModelName(), $type));
  327. echo $content;
  328. }
  329. public function actionChangeActionTypeRelatedModel($moduleClassName, $type, $relation)
  330. {
  331. $content = ZurmoHtml::dropDownList(ActionsForWorkflowWizardView::ACTION_TYPE_RELATED_MODEL_RELATION_NAME,
  332. null,
  333. ActionsForWorkflowWizardView::resolveTypeRelatedModelRelationDataAndLabels(
  334. $moduleClassName, $moduleClassName::getPrimaryModelName(), $type, $relation));
  335. echo $content;
  336. }
  337. public function actionAddAction($moduleClassName, $type, $actionType, $rowNumber, $relation = null,
  338. $relatedModelRelation = null)
  339. {
  340. $form = new WizardActiveForm();
  341. $form->enableAjaxValidation = true; //ensures error validation populates correctly
  342. $form->id = WorkflowWizardView::getFormId();
  343. $wizardFormClassName = WorkflowToWizardFormAdapter::getFormClassNameByType($type);
  344. $model = ComponentForWorkflowFormFactory::makeByComponentType($moduleClassName,
  345. $moduleClassName::getPrimaryModelName(), $type,
  346. ComponentForWorkflowForm::TYPE_ACTIONS);
  347. $model->type = $actionType;
  348. $model->relation = $relation;
  349. $model->relatedModelRelation = $relatedModelRelation;
  350. $inputPrefixData = array($wizardFormClassName, ComponentForWorkflowForm::TYPE_ACTIONS,
  351. (int)$rowNumber);
  352. $view = new ActionRowForWorkflowComponentView($model, (int)$rowNumber,
  353. $inputPrefixData, $form);
  354. $content = $view->render();
  355. $form->renderAddAttributeErrorSettingsScript($view::getFormId());
  356. Yii::app()->getClientScript()->setToAjaxMode();
  357. Yii::app()->getClientScript()->render($content);
  358. echo $content;
  359. }
  360. public function actionAddEmailMessage($moduleClassName, $type, $rowNumber)
  361. {
  362. $form = new WizardActiveForm();
  363. $form->id = WorkflowWizardView::getFormId();
  364. $form->enableAjaxValidation = true; //ensures error validation populates correctly
  365. $rowCounterInputId = ComponentForWorkflowWizardView::
  366. resolveRowCounterInputId(ComponentForWorkflowForm::TYPE_EMAIL_MESSAGES);
  367. $wizardFormClassName = WorkflowToWizardFormAdapter::getFormClassNameByType($type);
  368. $model = ComponentForWorkflowFormFactory::makeByComponentType($moduleClassName,
  369. $moduleClassName::getPrimaryModelName(), $type,
  370. ComponentForWorkflowForm::TYPE_EMAIL_MESSAGES);
  371. $inputPrefixData = array($wizardFormClassName, ComponentForWorkflowForm::TYPE_EMAIL_MESSAGES,
  372. (int)$rowNumber);
  373. $form->setInputPrefixData($inputPrefixData);
  374. $view = new EmailMessageRowForWorkflowComponentView($model, (int)$rowNumber,
  375. $inputPrefixData, $form,
  376. WorkflowToWizardFormAdapter::getFormClassNameByType($type),
  377. $rowCounterInputId);
  378. $content = $view->render();
  379. $form->renderAddAttributeErrorSettingsScript($view::getFormId());
  380. Yii::app()->getClientScript()->setToAjaxMode();
  381. Yii::app()->getClientScript()->render($content);
  382. echo $content;
  383. }
  384. public function actionAddEmailMessageRecipient($moduleClassName, $type, $recipientType, $rowNumber,
  385. $recipientRowNumber)
  386. {
  387. $form = new WizardActiveForm();
  388. $form->id = WorkflowWizardView::getFormId();
  389. $form->enableAjaxValidation = true; //ensures error validation populates correctly
  390. $wizardFormClassName = WorkflowToWizardFormAdapter::getFormClassNameByType($type);
  391. $model = WorkflowEmailMessageRecipientFormFactory::make($recipientType,
  392. $moduleClassName::getPrimaryModelName(), $type);
  393. $inputPrefixData = array($wizardFormClassName, ComponentForWorkflowForm::TYPE_EMAIL_MESSAGES,
  394. (int)$rowNumber, EmailMessageForWorkflowForm::TYPE_EMAIL_MESSAGE_RECIPIENTS,
  395. $recipientRowNumber);
  396. $adapter = new WorkflowEmailMessageRecipientToElementAdapter($model, $form,
  397. $recipientType, $inputPrefixData);
  398. $view = new EmailMessageRecipientRowForWorkflowComponentView($adapter,
  399. (int)$recipientRowNumber, $inputPrefixData);
  400. $content = $view->render();
  401. $form->renderAddAttributeErrorSettingsScript($view::getFormId());
  402. Yii::app()->getClientScript()->setToAjaxMode();
  403. Yii::app()->getClientScript()->render($content);
  404. echo $content;
  405. }
  406. public function actionManageOrder()
  407. {
  408. $activeActionElementType = 'WorkflowManageOrderMenu';
  409. $actionBarView = new SecuredActionBarForWorkflowsSearchAndListView(
  410. $this->getId(),
  411. $this->getModule()->getId(), new SavedWorkflow(),
  412. 'list-view',
  413. 'sequence',
  414. false,
  415. $activeActionElementType);
  416. $gridView = new GridView(2, 1);
  417. $gridView->setView($actionBarView, 0, 0);
  418. $gridView->setView(new WorkflowManageOrderView(), 1, 0);
  419. $breadCrumbLinks = static::getManageOrderBreadcrumbLinks();
  420. $view = new WorkflowsPageView( ZurmoDefaultAdminViewUtil::
  421. makeViewWithBreadcrumbsForCurrentUser(
  422. $this,
  423. $gridView,
  424. $breadCrumbLinks,
  425. 'WorkflowBreadCrumbView'));
  426. echo $view->render();
  427. }
  428. public function actionLoadOrderByModule($moduleClassName)
  429. {
  430. $savedWorkflows = SavedWorkflow::getAllByModuleClassName($moduleClassName);
  431. if (count($savedWorkflows) == 0)
  432. {
  433. echo CJSON::encode(array('dataToOrder' => 'false'));
  434. Yii::app()->end(0, false);
  435. }
  436. $view = new WorkflowManageOrderListView($savedWorkflows);
  437. $content = $view->render();
  438. Yii::app()->getClientScript()->setToAjaxMode();
  439. Yii::app()->getClientScript()->render($content);
  440. echo CJSON::encode(array('content' => $content, 'dataToOrder' => 'true'));
  441. }
  442. public function actionSaveOrder()
  443. {
  444. $savedWorkflowData = ArrayUtil::getArrayValue(PostUtil::getData(), 'SavedWorkflow');
  445. if ($savedWorkflowData != null && isset($savedWorkflowData['savedWorkflowIds']) &&
  446. count($savedWorkflowData['savedWorkflowIds']) > 0)
  447. {
  448. $order = 1;
  449. foreach ($savedWorkflowData['savedWorkflowIds'] as $savedWorkflowId)
  450. {
  451. $savedWorkflow = SavedWorkflow::getById((int)$savedWorkflowId);
  452. $savedWorkflow->order = $order;
  453. $saved = $savedWorkflow->save();
  454. if (!$saved)
  455. {
  456. throw new FailedToSaveModelException();
  457. }
  458. $order++;
  459. }
  460. $message = Zurmo::t('WorkflowsModule', 'Order saved successfully.');
  461. echo CJSON::encode(array('message' => $message, 'type' => 'message'));
  462. }
  463. else
  464. {
  465. echo CJSON::encode(array('message' => Zurmo::t('Core', 'There was an error processing your request'),
  466. 'type' => 'error'));
  467. }
  468. Yii::app()->end(0, false);
  469. }
  470. public function actionInQueuesAutoComplete($term, $formClassName)
  471. {
  472. $scopeData = GlobalSearchUtil::resolveGlobalSearchScopeFromGetData($_GET[$formClassName],
  473. 'anyMixedAttributesScope');
  474. $pageSize = Yii::app()->pagination->resolveActiveForCurrentUserByType(
  475. 'autoCompleteListPageSize', get_class($this->getModule()));
  476. $autoCompleteResults = WorkflowInQueuesModelAutoCompleteUtil::getGlobalSearchResultsByPartialTerm(
  477. $term,
  478. $pageSize,
  479. Yii::app()->user->userModel,
  480. $scopeData);
  481. echo CJSON::encode($autoCompleteResults);
  482. }
  483. protected function resolveCanCurrentUserAccessWorkflows()
  484. {
  485. if (!RightsUtil::doesUserHaveAllowByRightName('WorkflowsModule',
  486. WorkflowsModule::RIGHT_CREATE_WORKFLOWS,
  487. Yii::app()->user->userModel))
  488. {
  489. $messageView = new AccessFailureView();
  490. $view = new AccessFailurePageView($messageView);
  491. echo $view->render();
  492. Yii::app()->end(0, false);
  493. }
  494. return true;
  495. }
  496. protected function resolveMetadataBeforeMakingDataProvider(& $metadata)
  497. {
  498. $metadata = SavedWorkflowsUtil::resolveSearchAttributeDataByModuleClassNames($metadata,
  499. Workflow::getWorkflowSupportedModulesClassNamesCurrentUserHasAccessTo());
  500. }
  501. protected function resolveSavedWorkflowAndWorkflowByPostData(Array $postData, & $savedWorkflow, & $workflow,
  502. $type, $id = null, $isBeingCopied = false)
  503. {
  504. if ($id == null)
  505. {
  506. $this->resolveCanCurrentUserAccessWorkflows();
  507. $savedWorkflow = new SavedWorkflow();
  508. $workflow = new Workflow();
  509. $workflow->setType($type);
  510. }
  511. elseif ($isBeingCopied)
  512. {
  513. $savedWorkflow = new SavedWorkflow();
  514. $oldWorkflow = SavedWorkflow::getById(intval($id));
  515. ControllerSecurityUtil::resolveAccessCanCurrentUserReadModel($oldWorkflow);
  516. ZurmoCopyModelUtil::copy($oldWorkflow, $savedWorkflow);
  517. $workflow = SavedWorkflowToWorkflowAdapter::makeWorkflowBySavedWorkflow($savedWorkflow);
  518. }
  519. else
  520. {
  521. $savedWorkflow = SavedWorkflow::getById(intval($id));
  522. ControllerSecurityUtil::resolveAccessCanCurrentUserWriteModel($savedWorkflow);
  523. $workflow = SavedWorkflowToWorkflowAdapter::makeWorkflowBySavedWorkflow($savedWorkflow);
  524. }
  525. DataToWorkflowUtil::resolveWorkflowByWizardPostData($workflow, $postData,
  526. WorkflowToWizardFormAdapter::getFormClassNameByType($type));
  527. }
  528. protected function actionValidate($postData, WorkflowWizardForm $model)
  529. {
  530. if (isset($postData['validationScenario']) && $postData['validationScenario'] != null)
  531. {
  532. $model->setScenario($postData['validationScenario']);
  533. }
  534. else
  535. {
  536. throw new NotSupportedException();
  537. }
  538. $model->validate();
  539. $errorData = array();
  540. foreach ($model->getErrors() as $attribute => $errors)
  541. {
  542. $errorData[ZurmoHtml::activeId($model, $attribute)] = $errors;
  543. }
  544. echo CJSON::encode($errorData);
  545. Yii::app()->end(0, false);
  546. }
  547. }
  548. ?>