CRM-12133 option value create value & weight
authoreileen <eileen@fuzion.co.nz>
Mon, 18 Mar 2013 22:36:43 +0000 (11:36 +1300)
committereileen <eileen@fuzion.co.nz>
Thu, 21 Mar 2013 22:48:42 +0000 (11:48 +1300)
CRM-12133 fix default handling to be in BAO layer, also add tests on component_id & add to xml

CRM/Core/BAO/OptionValue.php
api/v3/OptionValue.php
tests/phpunit/api/v3/OptionValueTest.php
xml/schema/Core/OptionValue.xml

index 0340feabbc4e08febb5f4fc88f27e0acaa6f78db..c058f4400871f9de927c0c3e6b0a4ce5df38dc9d 100644 (file)
@@ -40,7 +40,57 @@ class CRM_Core_BAO_OptionValue extends CRM_Core_DAO_OptionValue {
   function __construct() {
     parent::__construct();
   }
-
+  /*
+   * Create email address - note that the create function calls 'add' but
+  * has more business logic
+  * Note that this is the right place to add pre & post hooks if we want them
+  * ? any reason not to?
+  *
+  * @param array $params input parameters
+  */
+  static function create($params) {
+    if (empty($params['id'])){
+      self::setDefaults($params);
+    }
+    $ids = array();
+    if (CRM_Utils_Array::value('id', $params)) {
+      $ids = array('optionValue' => $params['id']);
+    }
+    return  CRM_Core_BAO_OptionValue::add($params, $ids);
+    ;
+  }
+  /**
+   * Set default Parameters
+   * This functions sets default parameters if not set:
+   * - name & label are set to each other as required (it might make more sense for one
+   * to be required but this would mean a change to the api level)
+   * - ditto weight & value - but they both default to next weight
+   * NB am not sure that weight should be set to value as higher priority to
+   * setting it to the next weight - although this is existing logic
+   *
+   * @param unknown_type $params
+   */
+  static function setDefaults(&$params){
+    if(empty($params['label'])){
+      $params['label'] = $params['name'];
+    }
+    if(empty($params['name'])){
+      $params['name'] = $params['label'];
+    }
+    if(empty($params['weight'])){
+      //@todo consider this logic - see block comments
+      $params['weight'] = CRM_Utils_Array::value('value', $params,
+        (int) CRM_Utils_Weight::getDefaultWeight('CRM_Core_DAO_OptionValue',
+          array('option_group_id' => $params['option_group_id']))
+      );
+    }
+    if(empty($params['value'])){
+      $params['value'] = CRM_Utils_Array::value('weight', $params,
+        (int) CRM_Utils_Weight::getDefaultWeight('CRM_Core_DAO_OptionValue',
+          array('option_group_id' => $params['option_group_id']))
+      );
+    }
+  }
   /**
    * Takes a bunch of params that are needed to match certain criteria and
    * retrieves the relevant objects. Typically the valid params are only
index 30b7e26be114d16705fdd807f1a359ed73c5ed5c..de9c61394998603a33be2554c658ddd3652753ad 100644 (file)
@@ -40,47 +40,9 @@ function civicrm_api3_option_value_get($params) {
  */
 function civicrm_api3_option_value_create($params) {
 
-  // CRM-10921: do not fill-in defaults if this is an update
-  if (!CRM_Utils_Array::value('id', $params)) {
-    if (!CRM_Utils_Array::value('label', $params) && CRM_Utils_Array::value('name', $params)) {
-      // 'label' defaults to 'name'
-      $params['label'] = $params['name'];
-    }
-    if (!CRM_Utils_Array::value('value', $params) && CRM_Utils_Array::value('option_group_id', $params)) {
-      // 'value' defaults to next weight in option_group
-      $params['value'] = (int) CRM_Utils_Weight::getDefaultWeight('CRM_Core_DAO_OptionValue',
-        array('option_group_id' => $params['option_group_id'])
-      );
-    }
-    if (!CRM_Utils_Array::value('weight', $params) && CRM_Utils_Array::value('value', $params)) {
-      // 'weight' defaults to 'value'
-      $params['weight'] = $params['value'];
-    } elseif (CRM_Utils_Array::value('weight', $params) && $params['weight'] == 'next' && CRM_Utils_Array::value('option_group_id', $params)) {
-      // weight is numeric, so it's safe-ish to treat symbol 'next' as magical value
-      $params['weight'] = (int) CRM_Utils_Weight::getDefaultWeight('CRM_Core_DAO_OptionValue',
-        array('option_group_id' => $params['option_group_id'])
-      );
-    }
-  }
-
-  if (isset($params['component'])) {// allow a component to be reset to ''
-    // convert 'component' to 'component_id'
-    if (empty($params['component'])) {
-      $params['component_id'] = '';
-    } else {
-      $params['component_id'] = array_search($params['component'], CRM_Core_PseudoConstant::component());
-    }
-    unset($params['component']);
-  }
-
-  if (CRM_Utils_Array::value('id', $params)) {
-    $ids = array('optionValue' => $params['id']);
-  }
-  $optionValueBAO = CRM_Core_BAO_OptionValue::add($params, $ids);
+  $result = _civicrm_api3_basic_create(_civicrm_api3_get_BAO(__FUNCTION__), $params);
   civicrm_api('option_value', 'getfields', array('version' => 3, 'cache_clear' => 1, 'option_group_id' => $params['option_group_id']));
-  $values = array();
-  _civicrm_api3_object_to_array($optionValueBAO, $values[$optionValueBAO->id]);
-  return civicrm_api3_create_success($values, $params);
+  return $result;
 }
 
 /**
@@ -91,10 +53,10 @@ function civicrm_api3_option_value_create($params) {
  */
 function _civicrm_api3_option_value_create_spec(&$params) {
   $params['is_active']['api.default'] = 1;
-  $params['component']['type'] = CRM_Utils_Type::T_STRING;
-  $params['component']['options'] = array_values(CRM_Core_PseudoConstant::component());
+  //continue to support component
+  $params['component_id']['api.aliases'] = array('component');
   $params['name']['api.aliases'] = array('label');
-  // $params['component_id']['pseudoconstant'] = 'component';
+  $params['option_group_id']['api.required'] = TRUE;
 }
 
 /**
index e06679afc22ed009d80d2b1939ebf1508faec271..4e771d4b1e932a6cf51cd288d9080f70445112fd 100644 (file)
@@ -146,7 +146,7 @@ class api_v3_OptionValueTest extends CiviUnitTestCase {
       'name' => 'from_email_address',
       'sequential' => 1,
       'version' => $this->_apiversion,
-      'api.option_value.create' => array('domain_id' => 2, 'name' => 'my@y.com')
+      'api.option_value.create' => array('domain_id' => 2, 'name' => 'my@y.com'),
       ));
     $this->assertAPISuccess($result);
     $optionValueId = $result['values'][0]['api.option_value.create']['id'];
@@ -156,7 +156,99 @@ class api_v3_OptionValueTest extends CiviUnitTestCase {
       'return' => 'domain_id',
     ));
     $this->assertEquals(2, $domain_id);
+  }
+  /*
+   * Check that component_id is honoured
+  */
+  public function testCreateOptionSpecifyComponentID() {
+    $result = civicrm_api('option_group', 'get', array(
+      'name' => 'from_email_address',
+      'sequential' => 1,
+      'version' => $this->_apiversion,
+      'api.option_value.create' => array('component_id' => 2, 'name' => 'my@y.com'),
+    ));
+    $this->assertAPISuccess($result);
+    $optionValueId = $result['values'][0]['api.option_value.create']['id'];
+    $component_id = civicrm_api('option_value', 'getvalue', array(
+      'id' => $optionValueId,
+      'version' => $this->_apiversion,
+      'return' => 'component_id',
+    ));
+    $this->assertEquals(2, $component_id);
+  }
+  /*
+   * Check that component  continues to be honoured
+  */
+  public function testCreateOptionSpecifyComponent() {
+    $result = civicrm_api('option_group', 'get', array(
+      'name' => 'from_email_address',
+      'sequential' => 1,
+      'version' => $this->_apiversion,
+      'api.option_value.create' => array(
+        'component_id' => 'CiviContribute',
+        'name' => 'my@y.com'
+       ),
 
+    ));
+    $this->assertAPISuccess($result);
+    $optionValueId = $result['values'][0]['api.option_value.create']['id'];
+    $component_id = civicrm_api('option_value', 'getvalue', array(
+      'id' => $optionValueId,
+      'version' => $this->_apiversion,
+      'return' => 'component_id',
+    ));
+    $this->assertEquals(2, $component_id);
+  }
+  /*
+   * Check that component string is honoured
+  */
+  public function testCreateOptionSpecifyComponentString() {
+    $result = civicrm_api('option_group', 'get', array(
+      'name' => 'from_email_address',
+      'sequential' => 1,
+      'version' => $this->_apiversion,
+      'api.option_value.create' => array(
+        'component_id' => 'CiviContribute',
+        'name' => 'my@y.com'),
+
+    ));
+    $this->assertAPISuccess($result);
+    $optionValueId = $result['values'][0]['api.option_value.create']['id'];
+    $component_id = civicrm_api('option_value', 'getvalue', array(
+      'id' => $optionValueId,
+      'version' => $this->_apiversion,
+      'return' => 'component_id',
+    ));
+    $this->assertEquals(2, $component_id);
+  }
+  /*
+   * Check that domain_id is honoured
+  */
+  public function testCRM12133CreateOptionWeightNoValue() {
+    $optionGroup = civicrm_api(
+      'option_group', 'get', array(
+      'name' => 'gender',
+      'sequential' => 1,
+      'version' => $this->_apiversion,
+    ));
+    $this->assertAPISuccess($optionGroup);
+    $params = array(
+      'option_group_id' => $optionGroup['id'],
+      'label' => 'my@y.com',
+      'version' => $this->_apiversion,
+      'weight' => 3,
+    );
+    $optionValue = civicrm_api('option_value', 'create',  $params);
+    $this->assertAPISuccess($optionValue);
+    $params['weight'] = 4;
+    $optionValue2 = civicrm_api('option_value', 'create',  $params );
+    $this->assertAPISuccess($optionValue2);
+    $options = civicrm_api('option_value', 'get', array('version' => 3, 'option_group_id' => $optionGroup['id']));
+    $this->assertNotEquals($options['values'][$optionValue['id']]['value'], $options['values'][$optionValue2['id']]['value']);
+
+  //cleanup
+    civicrm_api('option_value', 'delete', array('version' => 3, 'id' => $optionValue['id']));
+    civicrm_api('option_value', 'delete', array('version' => 3, 'id' => $optionValue2['id']));
   }
 
   /*
@@ -206,6 +298,5 @@ class api_v3_OptionValueTest extends CiviUnitTestCase {
     );
     $this->assertFalse(in_array('newest', $fields['values']));
   }
-
 }
 
index 2dd7d8a3442046a1706ab17b69b3d02758b3b5a2..a417fc3b53e67ff29ff98151c5eafd3b407e04b6 100644 (file)
       <name>component_id</name>
       <type>int unsigned</type>
       <comment>Component that this option value belongs/caters to.</comment>
-       <add>2.0</add>
+      <add>2.0</add>
+      <pseudoconstant>
+        <name>component</name>
+        <table>civicrm_component</table>
+        <keyColumn>id</keyColumn>
+        <labelColumn>name</labelColumn>
+      </pseudoconstant>
   </field>
   <foreignKey>
        <name>component_id</name>