/** * @param boolean $includeRequired * @param boolean $includeNonRequired * @param $includeReadOnly * @return array */ protected function resolveDynamicallyDerivedAttributesForActionsOrTimeTriggerData($includeRequired = false, $includeNonRequired = false, $includeReadOnly = false) { assert('is_bool($includeRequired)'); assert('is_bool($includeNonRequired)'); assert('is_bool($includeReadOnly)'); $attributes = array(); foreach ($this->model->getAttributes() as $attribute => $notUsed) { if (!$this->model instanceof User && $this->model->isRelation($attribute) && (!$this->model->isAttributeReadOnly($attribute) || $includeReadOnly) && $this->model->getRelationModelClassName($attribute) == 'User') { $attributeIsRequired = $this->model->isAttributeRequired($attribute); if ($includeNonRequired && !$attributeIsRequired || $includeRequired && $attributeIsRequired) { $attributes[$attribute . FormModelUtil::DELIMITER . self::DYNAMIC_ATTRIBUTE_USER] = array('label' => $this->model->getAttributeLabel($attribute)); } } if ($this->model->isRelation($attribute) && $this->model->isOwnedRelation($attribute) && $this->isRelationASingularRelation($attribute) && ($this->model->getRelationModelClassName($attribute) == 'Address' || $this->model->getRelationModelClassName($attribute) == 'Email')) { $relatedModel = $this->model->{$attribute}; //Assumes only Email or Address are possible owned models here $zurmoRules = WorkflowRules::makeByModuleClassName('ZurmoModule'); foreach ($relatedModel->getAttributes() as $relatedAttribute => $notUsed) { if (!$relatedModel->isAttributeReadOnly($relatedAttribute) && !$relatedModel->isRelation($relatedAttribute) && $zurmoRules->attributeCanBeTriggered($relatedModel, $relatedAttribute)) { $relatedAttributeIsRequired = $relatedModel->isAttributeRequired($relatedAttribute); if ($includeNonRequired && !$relatedAttributeIsRequired || $includeRequired && $relatedAttributeIsRequired) { $attributes[$attribute . FormModelUtil::RELATION_DELIMITER . $relatedAttribute] = array('label' => $this->model->getAttributeLabel($attribute) . ' ' . ComponentForWorkflowForm::DISPLAY_LABEL_RELATION_DIVIDER . ' ' . $relatedModel->getAttributeLabel($relatedAttribute)); } } } } } return $attributes; }
/** * Some relations such as a CustomField are shown as non-related nodes in the workflow wizard. For a custom field * this method would return true for example. Whereas account -> opportunities would return false. * @param RedBeanModel $model * @param $relation * @return bool */ public function relationIsUsedAsAttribute(RedBeanModel $model, $relation) { assert('is_string($relation)'); $modelClassName = $model->getAttributeModelClassName($relation); $metadata = static::getMetadata(); if (isset($metadata[$modelClassName]) && isset($metadata[$modelClassName]['relationIsUsedAsAttributes']) && in_array($relation, $metadata[$modelClassName]['relationIsUsedAsAttributes'])) { return true; } if (in_array($model->getRelationModelClassName($relation), array('OwnedCustomField', 'CustomField', 'OwnedMultipleValuesCustomField', 'MultipleValuesCustomField', 'CurrencyValue'))) { return true; } return false; }
/** * @return array */ protected function getDynamicallyDerivedAttributesData() { if (isset(self::$dynamicallyDerivedAttributesData[get_class($this->model)])) { return self::$dynamicallyDerivedAttributesData[get_class($this->model)]; } $attributes = array(); foreach ($this->model->getAttributes() as $attribute => $notUsed) { if (!$this->model instanceof User && $this->model->isRelation($attribute) && $this->model->getRelationModelClassName($attribute) == 'User') { $attributes[$attribute . FormModelUtil::DELIMITER . self::DYNAMIC_ATTRIBUTE_USER] = array('label' => $this->model->getAttributeLabel($attribute)); } } self::$dynamicallyDerivedAttributesData[get_class($this->model)] = $attributes; return self::$dynamicallyDerivedAttributesData[get_class($this->model)]; }
/** * Make an array of message strings by RedBeanModel errors * @param array $errors RedBeanModel errors */ public static function makeMessagesByModel(RedBeanModel $model) { $messages = array(); foreach ($model->getErrors() as $attributeName => $errors) { foreach ($errors as $relationAttributeName => $errorOrRelatedError) { if (is_array($errorOrRelatedError)) { $relationModelClassName = $model->getRelationModelClassName($attributeName); foreach ($errorOrRelatedError as $relatedError) { if ($relatedError != '') { $messages[] = LabelUtil::makeModelAndAttributeNameCombinationLabel(get_class($model), $attributeName) . ' - ' . $relatedError; } } } elseif ($errorOrRelatedError != '') { $messages[] = LabelUtil::makeModelAndAttributeNameCombinationLabel(get_class($model), $attributeName) . ' - ' . $errorOrRelatedError; } } } return $messages; }
/** * @param RedBeanModel $model * @param string $relation * @return null|string * @throws NotSupportedException if the relation is not really reported as an attribute */ public function getGroupByRelatedAttributeForRelationReportedAsAttribute(RedBeanModel $model, $relation) { assert('is_string($relation)'); $modelClassName = $model->getAttributeModelClassName($relation); $metadata = static::getMetadata(); if (isset($metadata[$modelClassName]) && isset($metadata[$modelClassName]['relationsReportedAsAttributes']) && in_array($relation, $metadata[$modelClassName]['relationsReportedAsAttributes'])) { if (isset($metadata[$modelClassName]['relationsReportedAsAttributesGroupByAttributes'][$relation])) { return $metadata[$modelClassName]['relationsReportedAsAttributesGroupByAttributes'][$relation]; } else { return null; } } if (in_array($model->getRelationModelClassName($relation), array('OwnedCustomField', 'CustomField', 'OwnedMultipleValuesCustomField', 'MultipleValuesCustomField', 'CurrencyValue'))) { return 'value'; } throw new NotSupportedException(); }