From bd86af3e2af3d65d6f6d25bb569aedc9e04dc7f4 Mon Sep 17 00:00:00 2001 From: Roman Zimmermann Date: Fri, 2 Feb 2018 18:20:22 +0100 Subject: [PATCH] Support single address fields in WrapperField. --- src/CRM/Export/WrapperField.php | 22 ++++++++---- test/CRM/Export/WrapperFieldTest.php | 52 ++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 test/CRM/Export/WrapperFieldTest.php diff --git a/src/CRM/Export/WrapperField.php b/src/CRM/Export/WrapperField.php index 4ec6df251..7134a95d4 100644 --- a/src/CRM/Export/WrapperField.php +++ b/src/CRM/Export/WrapperField.php @@ -11,17 +11,25 @@ public function __construct($key) { $this->key = $key; } + /** + * Get value(s) for this field. + * + * @return mixed + * - NULL if the field doesn’t exist. + * - A single field value if $delta is given and not NULL. + * - All values as an array if $delta is NULL. + */ public function value($delta = 0) { $w = $this->exporter->getWrappedContact(); - if ($w->__isset($this->key)) { - $value = $w->{$this->key}->value(); - if (isset($delta) && is_array($value) && isset($value[$delta])) { - return $value[$delta]; - } - return $value; + if (!$w->__isset($this->key)) { + return NULL; + } + $field = $w->{$this->key}; + if ($field instanceof \EntityListWrapper) { + return is_null($delta) ? $field->value() : $field->get($delta)->value(); } else { - return NULL; + return is_null($delta) ? [$field->value()] : $field->value(); } } diff --git a/test/CRM/Export/WrapperFieldTest.php b/test/CRM/Export/WrapperFieldTest.php new file mode 100644 index 000000000..e52e259d1 --- /dev/null +++ b/test/CRM/Export/WrapperFieldTest.php @@ -0,0 +1,52 @@ +contact = entity_create('redhen_contact', ['type' => 'contact']); + $w = $this->contact->wrap(); + $w->field_address->set([[ + 'country' => 'GB', + ]]); + $w->field_gender->set('o'); + $this->exporter = new ExporterBase([]); + $this->exporter->setContact($this->contact); + } + + /** + * Test getting values from a multi-value field. + */ + public function testMultiValueField() { + $w = new WrapperField('field_address'); + $w->setExporter($this->exporter); + $this->assertEqual(['country' => 'GB'], $w->value()); + $this->assertEqual(['country' => 'GB'], $w->value(0)); + $this->assertEqual([['country' => 'GB']], $w->value(NULL)); + $this->assertNull($w->value(1)); + } + + /** + * Test getting values from a single value field. + */ + public function testSingleValueField() { + $w = new WrapperField('field_gender'); + $w->setExporter($this->exporter); + $this->assertEqual('o', $w->value()); + $this->assertEqual('o', $w->value(0)); + $this->assertEqual(['o'], $w->value(NULL)); + $this->assertEqual('o', $w->value(1)); + } + +}