com.megaphonetech.relateent.../CRM/RelateEntities/Form/RelatedEntity.php

284 lines
8.2 KiB
PHP

<?php
/**
* This class generates form components for Bank Account
*/
class CRM_RelateEntities_Form_RelatedEntity extends CRM_Core_Form {
use CRM_Core_Form_EntityFormTrait;
public $_id;
/**
* Set variables up before form is built.
*/
public function preProcess() {
parent::preProcess();
$this->entity_table = CRM_Utils_Request::retrieve('entityTable', 'String', $this, TRUE);
$this->_id = CRM_Utils_Request::retrieve('id', 'String', $this);
if (!$this->_id) {
$this->entity_id = CRM_Utils_Request::retrieve('entityId', 'Positive', $this, TRUE);
}
$this->entityA = ($this->entity_table == 'Contact') ? 'Contact' : 'FinancialType';
$this->entityB = ($this->entity_table == 'FinancialType') ? 'Contact' : 'FinancialType';
}
/**
* Set entity fields to be assigned to the form.
*/
protected function setEntityFields() {
$this->entityFields = [
'is_active' => [
'name' => 'is_active',
'required' => TRUE,
],
];
return $this->entityFields;
}
/**
* Classes extending CRM_Core_Form should implement this method.
*
*/
public function getDefaultContext() {
return 'create';
}
/**
* Classes extending CRM_Core_Form should implement this method.
*/
public function getDefaultEntity() {
return 'RelateEntities';
}
/**
* Set the delete message.
*
* We do this from the constructor in order to do a translation.
*/
public function setDeleteMessage() {
$this->deleteMessage = ts('Deleting a related entity cannot be undone.') . ts('Do you want to continue?');
}
/**
* Add defined entity field to template.
*/
protected function addEntityFieldsToTemplates() {
foreach ($this->setEntityFields() as $fieldSpec) {
if (empty($fieldSpec['not-auto-addable'])) {
$element = $this->addField($fieldSpec['name'], CRM_Utils_Array::value('props', $fieldSpec, []), CRM_Utils_Array::value('required', $fieldSpec));
if (!empty($fieldSpec['is_freeze'])) {
$element->freeze();
}
}
}
}
/**
* Build the form object.
*/
public function buildQuickForm() {
self::buildQuickEntityForm();
if ($this->_action & CRM_Core_Action::DELETE) {
$this->addButtons([
[
'type' => 'next',
'name' => ts('Delete'),
'isDefault' => TRUE,
],
[
'type' => 'cancel',
'name' => ts('Cancel'),
],
]);
return;
}
$this->addEntityFieldsToTemplates();
$this->addEntityRef(
'entity_a',
ts('Entity A'),
[
'entity' => $this->entityA,
],
TRUE
)->freeze();
$this->addEntityRef(
'entity_b',
ts('Entity B'),
[
'entity' => $this->entityB,
'select' => ['minimumInputLength' => 0],
],
TRUE
);
$this->add(
'select',
'relationship_type_id',
ts('Relationship Type'),
CRM_Contact_BAO_Relationship::getContactRelationshipType(NULL, NULL, NULL, NULL, TRUE),
FALSE,
['class' => 'crm-select2', 'placeholder' => ts('Select Relationship Types')]
);
$fields = [
'entity_a' => [
'name' => 'entity_a',
],
'relationship_type_id' => [
'name' => 'relationship_type_id',
],
'entity_b' => [
'name' => 'entity_b',
]
] + $this->entityFields;
$this->assign('entityFields', $fields);
$this->addButtons([
[
'type' => 'next',
'name' => ts('Save'),
'isDefault' => TRUE,
],
[
'type' => 'next',
'name' => ts('Save and New'),
'subName' => 'new',
],
[
'type' => 'cancel',
'name' => ts('Cancel'),
],
]);
$this->addFormRule(array('CRM_RelateEntities_Form_RelatedEntity', 'formRule'), $this);
}
/**
* Global form rule.
*
* @param array $fields
* The input form values.
* @param array $files
* The uploaded files if any.
* @param $self
*
* @return bool|array
* true if no errors, else array of errors
*/
public static function formRule($fields, $files, $self) {
$error = [];
return $error;
}
/**
* Set the default values for the form.
*/
public function setDefaultValues() {
$defaults = [];
if (!$this->_id) {
$defaults['is_active'] = 1;
$defaults['entity_a'] = $this->entity_id;
}
else {
$defaults = civicrm_api3('RelateEntities', 'getsingle', [
'id' => $this->_id,
]);
if ($defaults['entity_table_b'] == CRM_RelateEntities_Utils::getEntityTable($this->entityB)) {
$defaults['entity_b'] = $defaults['entity_id_b'];
$defaults['relationship_type_id'] .= '_a_b';
}
else if ($defaults['entity_table_a'] == CRM_RelateEntities_Utils::getEntityTable($this->entityB)) {
$defaults['entity_b'] = $defaults['entity_id_a'];
$defaults['relationship_type_id'] .= '_b_a';
}
if ($defaults['entity_table_b'] == CRM_RelateEntities_Utils::getEntityTable($this->entityA)) {
$defaults['entity_a'] = $defaults['entity_id_b'];
}
else if ($defaults['entity_table_a'] == CRM_RelateEntities_Utils::getEntityTable($this->entityA)) {
$defaults['entity_a'] = $defaults['entity_id_a'];
}
}
return $defaults;
}
/**
* Process the form submission.
*/
public function postProcess() {
if ($this->_action & CRM_Core_Action::DELETE) {
$result = civicrm_api3('RelateEntities', 'delete', [
'id' => $this->_id,
]);
if (!empty($result['is_error'])) {
CRM_Core_Error::statusBounce($result['error_message'], CRM_Utils_System::url('civicrm/', "reset=1&action=browse"), ts('Cannot Delete'));
}
CRM_Core_Session::setStatus(ts('Selected Related entity has been deleted.'), ts('Record Deleted'), 'success');
}
else {
// store the submitted values in an array
$params = $this->_submitValues;
try {
$apiParams = $this->buildParams($params);
if ($this->_id) {
$apiParams['id'] = $this->_id;
}
civicrm_api3('RelateEntities', 'create', $apiParams);
CRM_Core_Session::setStatus(ts('The Related entity has been saved.'), ts('Saved'), 'success');
}
catch (CRM_Core_Exception $e) {
CRM_Core_Error::statusBounce($e->getMessage());
}
}
$buttonName = $this->controller->getButtonName();
$session = CRM_Core_Session::singleton();
if ($this->entity_table == 'Contact') {
$this->ajaxResponse['updateTabs']['#tab_relateentities'] = CRM_RelateEntities_Utils::getRelatedEntities(
'Contact', $apiParams['entity_id_a'], FALSE, TRUE
);
}
if ($buttonName == $this->getButtonName('next', 'new')) {
CRM_Core_Session::setStatus(ts(' You can add another Related entity.'));
$session->replaceUserContext(CRM_Utils_System::url('civicrm/relatedentities/add',
"action=add&reset=1&entityTable={$this->entity_table}&entityId={$apiParams['entity_id_a']}")
);
}
else {
if ($this->entity_table == 'Contact') {
$url = CRM_Utils_System::url('civicrm/contact/view',
"reset=1&force=1&cid={$apiParams['entity_id_a']}&selectedChild=relateentities");
}
if ($this->entity_table == 'FinancialType') {
$url = CRM_Utils_System::url('civicrm/admin/financial/financialType', 'reset=1');
}
$session->replaceUserContext($url);
}
}
public function buildParams($formValues) {
$rType = explode('_', $formValues['relationship_type_id'], 2);
if ($rType[1] == 'a_b') {
$params = [
'entity_id_a' => $formValues['entity_a'],
'entity_id_b' => $formValues['entity_b'],
'entity_table_a' => CRM_RelateEntities_Utils::getEntityTable($this->entityA),
'entity_table_b' => CRM_RelateEntities_Utils::getEntityTable($this->entityB),
];
}
else {
$params = [
'entity_id_a' => $formValues['entity_b'],
'entity_id_b' => $formValues['entity_a'],
'entity_table_a' => CRM_RelateEntities_Utils::getEntityTable($this->entityB),
'entity_table_b' => CRM_RelateEntities_Utils::getEntityTable($this->entityA),
];
}
$params['relationship_type_id'] = $rType[0];
$params['is_active'] = $formValues['is_active'];
return $params;
}
}