44 const ZERO_MODELS_CHECK_FILTER_PATH =
'application.modules.zurmo.controllers.filters.ZeroModelsCheckControllerFilter';
46 public function filters()
48 return array_merge(parent::filters(),
51 ZurmoBaseController::RIGHTS_FILTER_PATH .
' + pushDashboard',
52 'moduleClassName' =>
'ZurmoModule',
53 'rightName' => ZurmoModule::RIGHT_PUSH_DASHBOARD_OR_LAYOUT,
59 public function actionIndex()
74 $modelClassName = $this->getModule()->getPrimaryModelName();
75 $model = $modelClassName::getById(intval($id));
77 if (!$model->isAttribute($attribute) || !$model->{$attribute} instanceof
CustomField)
81 $model->{$attribute}->value = $value;
82 $saved = $model->save();
89 public function actionLoadSavedSearch($id, $redirectAction =
'list')
93 $getParams = unserialize($savedSearch->serializedData);
94 $getParams = array_merge($getParams, array(
'savedSearchId' => $id));
95 $url = Yii::app()->createUrl($this->getModule()->getId() .
'/' . $this->getId() .
'/' .
96 $redirectAction, $getParams);
97 $this->redirect($url);
112 $relationAttributeName,
115 $stateMetadataAdapterClassName = null)
119 $relationAttributeName,
120 (
int)$relationModelId,
122 $portlet->getUniquePortletPageId(),
125 $this->getModule()->getId()
131 public function actionAutoComplete($term, $autoCompleteOptions = null)
133 $modelClassName = $this->getModule()->getPrimaryModelName();
134 echo $this->renderAutoCompleteResults($modelClassName, $term, $autoCompleteOptions);
137 protected function renderAutoCompleteResults($modelClassName, $term, $autoCompleteOptions = null)
139 $pageSize = Yii::app()->pagination->resolveActiveForCurrentUserByType(
'autoCompleteListPageSize',
140 get_class($this->getModule()));
142 if (empty($autoCompleteResults))
144 $autoCompleteResults = array(array(
'id' => null,
146 'label' => Zurmo::t(
'Core',
'No results found')));
148 return CJSON::encode($autoCompleteResults);
169 $relationModelId, $relationModuleId)
171 assert(
'$model instanceof RedBeanModel');
172 assert(
'is_string($relationAttributeName)');
173 assert(
'is_int($relationModelId)');
174 assert(
'is_string($relationModuleId)');
175 $relationType = $model->getRelationType($relationAttributeName);
178 $relationModel = $model->$relationAttributeName;
179 $relatedModel = $relationModel::getById((
int)$relationModelId);
180 $model->$relationAttributeName = $relatedModel;
184 $relationModelClassName = Yii::app()->getModule($relationModuleId)->getPrimaryModelName();
185 $relatedModel = $relationModelClassName::getById($relationModelId);
186 $model->$relationAttributeName->add($relatedModel);
188 $this->addRelatedModelAccountToModel($model, $relatedModel);
199 if (isset($relatedModel->account) && $relatedModel->account->id > 0 &&
202 $model->account = $relatedModel->account;
216 public function actionAuditEventsModalList($id)
218 $model = $this->resolveModelForAuditEventsModalList($id);
222 Yii::app()->getClientScript()->setToAjaxMode();
226 protected function resolveModelForAuditEventsModalList($id)
228 $modelClassName = $this->getModule()->getPrimaryModelName();
229 return $modelClassName::getById((
int)$id);
232 protected function getModelName()
234 return $this->getModule()->getPrimaryModelName();
237 protected static function getSearchFormClassName()
242 protected function export($stickySearchKey = null, $modelClassName = null, $exportFileName = null)
244 assert(
'$stickySearchKey == null || is_string($stickySearchKey)');
245 assert(
'$modelClassName == null || is_string($modelClassName)');
246 assert(
'$exportFileName == null || is_string($exportFileName)');
247 if ($modelClassName == null)
249 $modelClassName = $this->getModelName();
251 $searchFormClassName = static::getSearchFormClassName();
253 $model =
new $modelClassName(
false);
255 if ($searchFormClassName != null)
257 $searchForm =
new $searchFormClassName($model);
264 $stateMetadataAdapterClassName = $this->resolveStateMetadataAdapterClassNameForExport();
265 $dataProvider = $this->getDataProviderByResolvingSelectAllFromGet(
268 Yii::app()->user->userModel->id,
269 $stateMetadataAdapterClassName,
275 $idsToExport = array_filter(explode(
",", trim($_GET[
'selectedIds'],
" ,")));
277 $totalItems = static::getSelectedRecordCountByResolvingSelectAllFromGet($dataProvider,
false);
282 if ($totalItems <= ExportModule::$asynchronousThreshold)
288 if (count($modelsToExport) > 0)
291 $headerData = $modelToExportAdapter->getHeaderData();
293 foreach ($modelsToExport as $model)
298 $data[] = $modelToExportAdapter->getData();
304 $headerData = array();
305 foreach ($idsToExport as $idToExport)
307 $model = $modelClassName::getById(intval($idToExport));
311 $data[] = $modelToExportAdapter->getData();
312 if (count($headerData) == 0)
314 $headerData = $modelToExportAdapter->getHeaderData();
322 if ($exportFileName == null)
324 $moduleName = $this->getModule()->getName();
325 if ($moduleName ==
'projects')
329 elseif ($moduleName ==
'accounts')
333 elseif ($moduleName ==
'contacts')
337 elseif ($moduleName ==
'leads')
341 elseif ($moduleName ==
'meetings')
345 elseif ($moduleName ==
'notes')
349 elseif ($moduleName ==
'opportunities')
353 elseif ($moduleName ==
'products')
357 elseif ($moduleName ==
'productTemplates')
361 elseif ($moduleName ==
'tasks')
367 $fileName = $this->getModule()->getName();
369 $fileName = $fileName .
".csv";
373 $fileName = $exportFileName .
".csv";
379 Yii::app()->user->setFlash(
'notification',
380 Zurmo::t(
'ZurmoModule',
'There is no data to export.')
392 $serializedData = serialize($idsToExport);
397 $exportItem->isCompleted =
false;
398 $exportItem->exportFileType =
'csv';
399 $exportItem->exportFileName = $this->getModule()->getName();
400 $exportItem->modelClassName = $modelClassName;
401 $exportItem->serializedData = $serializedData;
402 $exportItem->isJobRunning =
false;
403 $exportItem->cancelExport =
false;
405 $exportItem->forget();
406 Yii::app()->user->setFlash(
'notification',
407 Zurmo::t(
'ZurmoModule',
'A large amount of data has been requested for export. You will receive ' .
408 'a notification with the download link when the export is complete.')
414 Yii::app()->user->setFlash(
'notification',
415 Zurmo::t(
'ZurmoModule',
'There is no data to export.')
418 $this->redirect(array($this->getId() .
'/index'));
421 protected function resolveStateMetadataAdapterClassNameForExport()
423 return $this->getModule()->getStateMetadataAdapterClassName();
426 protected static function getModelAndCatchNotFoundAndDisplayError($modelClassName, $id)
428 assert(
'is_string($modelClassName)');
429 assert(
'is_int($id)');
432 return $modelClassName::getById($id);
436 $messageContent = Zurmo::t(
'ZurmoModule',
'The record you are trying to access does not exist.');
439 echo $view->render();
440 Yii::app()->end(0,
false);
444 public function actionRenderStickyListBreadCrumbContent($stickyOffset, $stickyKey, $stickyModelId)
446 if ($stickyOffset == null)
448 Yii::app()->end(0,
false);
450 $pageSize = Yii::app()->pagination->resolveActiveForCurrentUserByType(
451 'listPageSize', get_class($this->getModule()));
452 $modelClassName = $this->getModule()->getPrimaryModelName();
453 $searchFormClassName = static::getSearchFormClassName();
454 $model =
new $modelClassName(
false);
455 $searchForm =
new $searchFormClassName($model);
456 $dataProvider = $this->resolveSearchDataProvider(
463 $totalCount = $dataProvider->calculateTotalItemCount();
465 $dataProvider->setOffset($finalOffset);
466 $dataList = $dataProvider->getData();
467 if (count($dataList) > 0)
469 $menuItems = array(
'label' =>
'รท');
470 foreach ($dataList as $row => $data)
472 $url = Yii::app()->createUrl($this->getModule()->getId() .
'/' . $this->getId() .
'/details',
473 array(
'id' => $data->id,
'stickyOffset' => $row + $finalOffset));
474 if ($data->id == $stickyModelId)
476 $menuItems[
'items'][] = array(
'label' => strval($data),
478 'itemOptions' => array(
'class' =>
'strong'));
482 $menuItems[
'items'][] = array(
'label' => strval($data),
'url' => $url);
485 $cClipWidget =
new CClipWidget();
486 $cClipWidget->beginClip(
"StickyList");
487 $cClipWidget->widget(
'application.core.widgets.MbMenu', array(
488 'htmlOptions' => array(
'id' =>
'StickyListMenu'),
489 'items' => array($menuItems),
491 $cClipWidget->endClip();
492 echo $cClipWidget->getController()->clips[
'StickyList'];
496 public function actionUnlink($id)
501 if ($relationModelClassName == null || $relationModelId == null || $relationModelRelationName == null)
505 $relationModel = $relationModelClassName::GetById(intval($relationModelId));
511 $modelClassName = $relationModel->getRelationModelClassName($relationModelRelationName);
512 $model = $modelClassName::getById((
int)$id);
515 $relationModel->$relationModelRelationName->remove($model);
516 $saved = $relationModel->save();
539 $mergedModelFormClassName,
544 $getData = GetUtil::getData();
551 $message = Zurmo::t(
'ZurmoModule',
'At least one record you are trying to merge does not exist.');
552 Yii::app()->user->setFlash(
'notification', $message);
553 $this->redirect(
'index');
555 $model =
new $mergedModelFormClassName(
'listViewMerge');
556 $model->selectedModels = $modelsList;
558 $redirectUrl = Yii::app()->createUrl($redirectUrl);
559 if ($model->validate())
561 $titleBarAndEditView = $this->makeListMergeView(
562 $this->attemptToSaveModelFromPost($model->primaryModel, null, $redirectUrl),
563 $viewPrefix, array_values($modelsList));
565 makeStandardViewForCurrentUser($this, $titleBarAndEditView));
566 echo $view->render();
570 $this->redirect($redirectUrl);
580 assert(
'$model instanceof RedBeanModel');
581 $getData = GetUtil::getData();
582 if ($this->getAction()->
id ==
'listViewMerge')
584 Yii::app()->gameHelper->muteScoringModelsOnSave();
586 Yii::app()->gameHelper->unmuteScoringModelsOnSave();
590 public function actionPushLayout($id)
592 $modelClassName = $this->getModelName();
593 $model = $modelClassName::getById(intval($id));
594 if (isset($_POST[$modelClassName]))
598 Yii::app()->user->setFlash(
'notification', Zurmo::t(
'ZurmoModule',
'Layout pushed successfully'));
599 $this->redirect(array($this->getId() .
'/details',
'id' => $id));
602 Zurmo::t(
'ZurmoModule',
'Push Layout'));
604 echo $view->render();
static resolveGroupsAndUsersFromPost($postData)
resolveNewModelByRelationInformation($model, $relationAttributeName, $relationModelId, $relationModuleId)
static processCopyRelationsAndDeleteNonPrimaryModelsInMerge($primaryModel, $getData)
static getDataForExport(CDataProvider $dataProvider)
static getSelectedModelsListForMerge($modelClassName, $getData)
static renderList(CController $controller, $dataProvider)
static getTranslationParamsForAllModules()
static getSerializedDataForExport(CDataProvider $dataProvider)
static doesCurrentUserHavePermissionOnSecurableItem($securableItem, $permissionToCheck)
static pushLayoutToUsers($model, $groupsAndUsers)
processListViewMerge($modelClassName, $mergedModelFormClassName, $viewPrefix, $pageView, $redirectUrl)
static getArrayValue($array, $element, $defaultValue=null)
actionSearchForDuplicateModels($attribute, $value)
static resolveFinalOffsetForStickyList($stickyOffset, $pageSize, $totalCount)
static setPrimaryModelForListViewMerge($model, $getData)
static makeDataProviderBySearchAttributeData($searchAttributeData)
static resolveAccessCanCurrentUserReadModel(RedBeanModel $model, $fromAjax=false)
static getByPartialName($modelClassName, $partialName, $pageSize, $autoCompleteOptions=null)
static export($data, $headerData=array(), $exportFileName= 'exports.csv', $download=false, $allowHeaderOnlyConversion=false, $shouldTrim=false)
static makeModalSearchAttributeDataByAuditedModel($model)
static getById($id, $modelClassName=null)
static setAjaxModeAndRenderModalSearchList(CController $controller, $modalListLinkProvider, $stateMetadataAdapterClassName=null)
addRelatedModelAccountToModel(RedBeanModel $model, RedBeanModel $relatedModel)
actionUpdateAttributeValue($id, $attribute, $value)
static makeStandardViewForCurrentUser(CController $controller, View $containedView)
actionCreateFromRelation($relationAttributeName, $relationModelId, $relationModuleId, $redirectUrl)
actionSelectFromRelatedList($portletId, $uniqueLayoutId, $relationAttributeName, $relationModelId, $relationModuleId, $stateMetadataAdapterClassName=null)
static resolveAccessCanCurrentUserWriteModel(RedBeanModel $model, $fromAjax=false)