diff --git a/CRM/Civirules/Upgrader.php b/CRM/Civirules/Upgrader.php index 9e41f584bc052b84508abde47934475691839e3a..24b4f3332e050d2d32e5255144ae41299a89e6b4 100755 --- a/CRM/Civirules/Upgrader.php +++ b/CRM/Civirules/Upgrader.php @@ -31,7 +31,7 @@ class CRM_Civirules_Upgrader extends CRM_Civirules_Upgrader_Base { CRM_Core_DAO::executeQuery(" INSERT INTO civirule_event (name, label, object_name, op, cron, class_name, created_date, created_user_id) VALUES - ('groupmembership', 'Daily trigger for group members', NULL, NULL, 1, 'CRM_CivirulesCronEvent_GroupMembership', CURDATE(), 1); + ('groupmembership', 'Daily trigger for group members', NULL, NULL, 1, 'CRM_CivirulesCronTrigger_GroupMembership', CURDATE(), 1); "); } return true; diff --git a/CRM/Civirules/Utils.php b/CRM/Civirules/Utils.php index 39ffe891512da000ef6d560038d2765260586e3c..08d217da352250accf0d754ee9da0ecdb1efa895 100755 --- a/CRM/Civirules/Utils.php +++ b/CRM/Civirules/Utils.php @@ -211,6 +211,27 @@ class CRM_Civirules_Utils { return $return; } + /** + * Method to get the membership types + * @param bool $onlyActive + * @return array + */ + public static function getMembershipTypes($onlyActive = TRUE) { + $return = array(); + if ($onlyActive) { + $params = array('is_active' => 1); + } else { + $params = array(); + } + try { + $membershipTypes = civicrm_api3("MembershipType", "Get", $params); + foreach ($membershipTypes['values'] as $membershipType) { + $return[$membershipType['id']] = $membershipType['name']; + } + } catch (CiviCRM_API3_Exception $ex) {} + return $return; + } + /** * Method to check if the incoming date is later than today * diff --git a/CRM/CivirulesConditions/Form/Membership/Type.php b/CRM/CivirulesConditions/Form/Membership/Type.php new file mode 100644 index 0000000000000000000000000000000000000000..11dc4d0402773ae37a68082bc3e8fd3304284411 --- /dev/null +++ b/CRM/CivirulesConditions/Form/Membership/Type.php @@ -0,0 +1,61 @@ +<?php +/** + * Class for CiviRules Condition Membership Type Form + * + * @author Erik Hommel (CiviCooP) <erik.hommel@civicoop.org> + * @license AGPL-3.0 + */ + +class CRM_CivirulesConditions_Form_Membership_Type extends CRM_CivirulesConditions_Form_Form { + + /** + * Overridden parent method to build form + * + * @access public + */ + public function buildQuickForm() { + $this->add('hidden', 'rule_condition_id'); + + $membershipTypes = CRM_Civirules_Utils::getMembershipTypes(); + $membershipTypes[0] = ts('- select -'); + asort($membershipTypes); + $this->add('select', 'membership_type_id', ts('Membership type'), $membershipTypes, true); + $this->add('select', 'operator', ts('Operator'), array('equals', 'is not equal to'), true); + + $this->addButtons(array( + array('type' => 'next', 'name' => ts('Save'), 'isDefault' => TRUE,), + array('type' => 'cancel', 'name' => ts('Cancel')))); + } + + /** + * Overridden parent method to set default values + * + * @return array $defaultValues + * @access public + */ + public function setDefaultValues() { + $defaultValues = parent::setDefaultValues(); + $data = unserialize($this->ruleCondition->condition_params); + if (!empty($data['membership_type_id'])) { + $defaultValues['membership_type_id'] = $data['membership_type_id']; + } + if (!empty($data['operator'])) { + $defaultValues['operator'] = $data['operator']; + } + return $defaultValues; + } + + /** + * Overridden parent method to process form data after submission + * + * @throws Exception when rule condition not found + * @access public + */ + public function postProcess() { + $data['membership_type_id'] = $this->_submitValues['membership_type_id']; + $data['operator'] = $this->_submitValues['operator']; + $this->ruleCondition->condition_params = serialize($data); + $this->ruleCondition->save(); + parent::postProcess(); + } +} \ No newline at end of file diff --git a/CRM/CivirulesConditions/Form/ValueComparison.php b/CRM/CivirulesConditions/Form/ValueComparison.php index 5dc8974f77cb7dcc3fd939f2a50eb301174eb433..310bc55333286c2bae3a8fb02f77ce561fee202d 100644 --- a/CRM/CivirulesConditions/Form/ValueComparison.php +++ b/CRM/CivirulesConditions/Form/ValueComparison.php @@ -117,7 +117,9 @@ class CRM_CivirulesConditions_Form_ValueComparison extends CRM_CivirulesConditio $data = unserialize($this->ruleCondition->condition_params); $data['operator'] = $this->_submitValues['operator']; $data['value'] = $this->_submitValues['value']; - $data['multi_value'] = explode("\r\n", $this->_submitValues['multi_value']); + if (isset($this->_submitValues['multi_value'])) { + $data['multi_value'] = explode("\r\n", $this->_submitValues['multi_value']); + } $this->ruleCondition->condition_params = serialize($data); $this->ruleCondition->save(); diff --git a/CRM/CivirulesConditions/Membership/Type.mgd.php b/CRM/CivirulesConditions/Membership/Type.mgd.php new file mode 100644 index 0000000000000000000000000000000000000000..5b3dc55fd9e6b641930b8d5ee9219c4490fb48b5 --- /dev/null +++ b/CRM/CivirulesConditions/Membership/Type.mgd.php @@ -0,0 +1,17 @@ +<?php + +return array ( + 0 => + array ( + 'name' => 'Civirules:Condition.MembershipType', + 'entity' => 'CiviRuleCondition', + 'params' => + array ( + 'version' => 3, + 'name' => 'membership_type', + 'label' => 'Membership is (not) of membership type ...', + 'class_name' => 'CRM_CivirulesConditions_Membership_Type', + 'is_active' => 1 + ), + ), +); \ No newline at end of file diff --git a/CRM/CivirulesConditions/Membership/Type.php b/CRM/CivirulesConditions/Membership/Type.php new file mode 100644 index 0000000000000000000000000000000000000000..4f8d78ae6ddda81aff4cf03ceacae18377ae08aa --- /dev/null +++ b/CRM/CivirulesConditions/Membership/Type.php @@ -0,0 +1,96 @@ +<?php + +class CRM_CivirulesConditions_Membership_Type extends CRM_Civirules_Condition { + + private $conditionParams = array(); + + /** + * Method to set the Rule Condition data + * + * @param array $ruleCondition + * @access public + */ + public function setRuleConditionData($ruleCondition) { + parent::setRuleConditionData($ruleCondition); + $this->conditionParams = array(); + if (!empty($this->ruleCondition['condition_params'])) { + $this->conditionParams = unserialize($this->ruleCondition['condition_params']); + } + } + + /** + * Method to determine if the condition is valid + * + * @param CRM_Civirules_TriggerData_TriggerData $triggerData + * @return bool + */ + public function isConditionValid(CRM_Civirules_TriggerData_TriggerData $triggerData) { + $isConditionValid = FALSE; + $membership = $triggerData->getEntityData('Membership'); + switch ($this->conditionParams['operator']) { + case 0: + if ($membership['membership_type_id'] == $this->conditionParams['membership_type_id']) { + $isConditionValid = TRUE; + } + break; + case 1: + if ($membership['membership_type_id'] != $this->conditionParams['membership_type_id']) { + $isConditionValid = TRUE; + } + break; + } + return $isConditionValid; + } + + /** + * Returns a redirect url to extra data input from the user after adding a condition + * + * Return false if you do not need extra data input + * + * @param int $ruleConditionId + * @return bool|string + * @access public + * @abstract + */ + public function getExtraDataInputUrl($ruleConditionId) { + return CRM_Utils_System::url('civicrm/civirule/form/condition/membershiptype', 'rule_condition_id=' + .$ruleConditionId); + } + + /** + * Returns a user friendly text explaining the condition params + * e.g. 'Older than 65' + * + * @return string + * @access public + */ + public function userFriendlyConditionParams() { + try { + $membershipTypes = civicrm_api3('MembershipType', 'Get', array('is_active' => 1)); + $operator = null; + if ($this->conditionParams['operator'] == 0) { + $operator = 'equals'; + } + if ($this->conditionParams['operator'] == 1) { + $operator = 'is not equal to'; + } + foreach ($membershipTypes['values'] as $membershipType) { + if ($membershipType['id'] == $this->conditionParams['membership_type_id']) { + return "Membership Type ".$operator." ".$membershipType['name']; + } + } + } catch (CiviCRM_API3_Exception $ex) {} + return ''; + } + + /** + * Returns an array with required entity names + * + * @return array + * @access public + */ + public function requiredEntities() { + return array('Membership'); + } + +} \ No newline at end of file diff --git a/sql/insertCiviruleTrigger.sql b/sql/insertCiviruleTrigger.sql index 38d489159e45ea785deb103ea6e252dcfbea919a..2eb1470db0d82486d5f65281d416baa49c9ecf49 100644 --- a/sql/insertCiviruleTrigger.sql +++ b/sql/insertCiviruleTrigger.sql @@ -87,6 +87,6 @@ VALUES INSERT INTO civirule_trigger (name, label, object_name, op, cron, class_name, created_date, created_user_id) VALUES - ('birthday', 'Individual has birthday', null, null, 1, 'CRM_CivirulesCronEvent_Birthday', CURDATE(), 1), - ('groupmembership', 'Daily trigger for group members', null, null, 1, 'CRM_CivirulesCronEvent_GroupMembership', CURDATE(), 1); + ('birthday', 'Individual has birthday', null, null, 1, 'CRM_CivirulesCronTrigger_Birthday', CURDATE(), 1), + ('groupmembership', 'Daily trigger for group members', null, null, 1, 'CRM_CivirulesCronTrigger_GroupMembership', CURDATE(), 1); diff --git a/sql/update_1003.sql b/sql/update_1003.sql index 9a7b61a1c2d1f064dbe753fa5878947b6c745987..edeb52725bc093b2608193db306dc673715ced9e 100644 --- a/sql/update_1003.sql +++ b/sql/update_1003.sql @@ -2,4 +2,5 @@ UPDATE `civirule_trigger` SET `class_name`='CRM_CivirulesPostTrigger_Activity' W UPDATE `civirule_trigger` SET `class_name`='CRM_CivirulesPostTrigger_Contact' WHERE `class_name` = 'CRM_CivirulesPostEvent_Contact'; UPDATE `civirule_trigger` SET `class_name`='CRM_CivirulesPostTrigger_GroupContact' WHERE `class_name` = 'CRM_CivirulesPostEvent_GroupContact'; UPDATE `civirule_trigger` SET `class_name`='CRM_CivirulesCronTrigger_Birthday' WHERE `class_name` = 'CRM_CivirulesCronEvent_Birthday'; -UPDATE `civirule_trigger` SET `class_name`='CRM_CivirulesCronTrigger_GroupMembership' WHERE `class_name` = 'CRM_CivirulesCronTrigger_GroupMembership'; \ No newline at end of file +UPDATE `civirule_trigger` SET `class_name`='CRM_CivirulesCronTrigger_GroupMembership' WHERE `class_name` = 'CRM_CivirulesCronTrigger_GroupMembership'; +UPDATE `civirule_trigger` SET `class_name`='CRM_CivirulesCronTrigger_GroupMembership' WHERE `class_name` = 'CRM_CivirulesCronEvent_GroupMembership'; diff --git a/templates/CRM/CivirulesConditions/Form/Membership/Type.tpl b/templates/CRM/CivirulesConditions/Form/Membership/Type.tpl new file mode 100644 index 0000000000000000000000000000000000000000..987006eb7d294c819fde1663eda26566e2b40f76 --- /dev/null +++ b/templates/CRM/CivirulesConditions/Form/Membership/Type.tpl @@ -0,0 +1,16 @@ +<h3>{$ruleConditionHeader}</h3> +<div class="crm-block crm-form-block crm-civirule-rule_condition-block-membership_type"> + <div class="crm-section"> + <div class="label">{$form.operator.label}</div> + <div class="content">{$form.operator.html}</div> + <div class="clear"></div> + </div> + <div class="crm-section"> + <div class="label">{$form.membership_type_id.label}</div> + <div class="content">{$form.membership_type_id.html}</div> + <div class="clear"></div> + </div> +</div> +<div class="crm-submit-buttons"> + {include file="CRM/common/formButtons.tpl" location="bottom"} +</div> \ No newline at end of file diff --git a/templates/CRM/CivirulesConditions/Form/ValueComparison.tpl b/templates/CRM/CivirulesConditions/Form/ValueComparison.tpl index 08e7af2f73a002e1f18dbd2dba0edb0b20f69d46..ab36ebe8c13236a509e311328038192b95349e88 100644 --- a/templates/CRM/CivirulesConditions/Form/ValueComparison.tpl +++ b/templates/CRM/CivirulesConditions/Form/ValueComparison.tpl @@ -38,7 +38,7 @@ {/literal} {if ($field_options)} {foreach from=$field_options item=value key=key} - options[options.length] = {'key': key, 'value': value}; + {literal}options[options.length] = {'key': key, 'value': value};{/literal} {/foreach} {/if} {if ($is_field_option_multiple)} diff --git a/xml/Menu/civirules.xml b/xml/Menu/civirules.xml index 4be88e7548617d4e79fd57b4d3e70a8b011c7d08..04fb38ffec5754686dbbbc07b2ca078c7a76d184 100755 --- a/xml/Menu/civirules.xml +++ b/xml/Menu/civirules.xml @@ -56,6 +56,13 @@ <access_arguments>access CiviCRM</access_arguments> <access_arguments>administer CiviCRM</access_arguments> </item> + <item> + <path>civicrm/civirule/form/condition/membershiptype</path> + <page_callback>CRM_CivirulesConditions_Form_Membership_Type</page_callback> + <title>membership type</title> + <access_arguments>access CiviCRM</access_arguments> + <access_arguments>administer CiviCRM</access_arguments> + </item> <item> <path>civicrm/civirule/form/condition/contribution_totalcontributedamount</path> <page_callback>CRM_CivirulesConditions_Form_Contribution_TotalContributedAmount</page_callback>