diff --git a/modules/mailchimp_lists/mailchimp_lists.module b/modules/mailchimp_lists/mailchimp_lists.module index adf5806..086ae96 100644 --- a/modules/mailchimp_lists/mailchimp_lists.module +++ b/modules/mailchimp_lists/mailchimp_lists.module @@ -368,23 +368,56 @@ function _mailchimp_lists_subscription_has_changed($instance, $field, $entity, $ function _mailchimp_lists_mergevars_populate($mergefields, $entity, $entity_type) { $wrapper = entity_metadata_wrapper($entity_type, $entity); $mergevars = array(); - foreach ($mergefields as $label => $property) { - if (!empty($property) && strlen($property)) { - $elements = explode(':', $property); - $object = $wrapper; - foreach ($elements as $element) { - if ($object instanceof EntityListWrapper) { - $object = $object[0]; + foreach ($mergefields as $label => $field) { + if (!empty($field) && strlen($field)) { + // For normal fields this is just the field name. For entity reference + // fields like a term_reference field this is field_name:property so we + // can determine which property from the referenced entity to use here. + list($element, $child_element) = explode(':', $field); + + $values = array(); + // If this is a multi-value field or property we need to get the value of + // each row. + if ($wrapper->{$element} instanceof EntityListWrapper) { + foreach ($wrapper->{$element} as $ref_item) { + // If $property is set, we're dealing with a reference to another entity. + if (isset($child_element)) { + $values[] = $ref_item->{$child_element}->value(); + } + // Otherwise, can just get the properties label. + else { + // Sometimes elements in a list have a label(), so we'll use that if + // we can. This will allow for using 'authenticated user' instead of + // just '1' for properties like $user->roles. + $l = $ref_item->label(); + if (!empty($l)) { + $values[] = $l; + } + // Otherwise we can just fallback to whatever the field/property + // value is. + else { + $values[] = $ref_item->value(); + } + } } - if ($object->value() === NULL || !isset($object->{$element})) { - $object = NULL; - break; + } + // Handle single value fields. + else { + // Make sure we can handle referenced entities properly. + if (isset($child_element)) { + $values[] = $wrapper->{$element}->{$child_element}->value(); + } + else { + $values[] = $wrapper->{$element}->value(); } - $object = $object->{$element}; } - $mergevars[$label] = isset($object) ? $object->value() : NULL; + + // If there are multiple values combine them together into a single comma + // separated string. + $mergevars[$label] = implode(', ', $values); } } + drupal_alter('mailchimp_lists_mergevars', $mergevars, $entity, $entity_type); return $mergevars; }