From 69216abc810ad0eaf6f8f7f4797ebe07b56ad567 Mon Sep 17 00:00:00 2001 From: Adam Vessey Date: Tue, 9 Jul 2013 16:21:21 +0000 Subject: [PATCH 1/4] Use renderable arrays instead of the array of strings we used to. ... Arrays of strings are still supported... Just not encouraged. --- includes/utilities.inc | 35 +++++++++++++++++++++++++++++++++++ islandora.module | 21 +++++++++++++++------ 2 files changed, 50 insertions(+), 6 deletions(-) diff --git a/includes/utilities.inc b/includes/utilities.inc index 66c03d26..29f450b1 100644 --- a/includes/utilities.inc +++ b/includes/utilities.inc @@ -865,3 +865,38 @@ function islandora_deprecated($release, $solution = NULL) { } return $message; } + +/** + * Transform recursively-merged array of strings to renderable arrays. + * + * Previously, functions/hooks like islandora_view_object would return an + * associative array with string values containing markup. These values were + * then imploded into one large piece of markup. Here, we transform this older + * structure which was generated into a renderable array, because renderable + * arrays are awesome! + * + * @param array $markup_array + * An associative array of which the values are either a string or an array + * of strings, which we transform to renderable markup elements (by + * reference). + */ +function islandora_array_of_markup_to_renderable_array(&$markup_array) { + foreach ($markup_array as &$value) { + if (!is_array($value)) { + $value = array( + '#markup' => $value, + ); + } + else { + foreach ($value as &$inner) { + if (!is_array($inner)) { + $inner = array( + '#markup' => $inner, + ); + } + } + unset($inner); + } + } + unset($value); +} diff --git a/islandora.module b/islandora.module index c579580c..8f552f37 100644 --- a/islandora.module +++ b/islandora.module @@ -624,6 +624,7 @@ function islandora_manage_overview_object(AbstractObject $object) { $output = array(); foreach (islandora_build_hook_list(ISLANDORA_OVERVIEW_HOOK, $object->models) as $hook) { $temp = module_invoke_all($hook, $object); + islandora_array_of_markup_to_renderable_array($temp); if (!empty($temp)) { $output = array_merge_recursive($output, $temp); } @@ -634,7 +635,7 @@ function islandora_manage_overview_object(AbstractObject $object) { } arsort($output); drupal_alter(ISLANDORA_OVERVIEW_HOOK, $object, $output); - return implode('', $output); + return $output; } /** @@ -649,7 +650,9 @@ function islandora_manage_overview_object(AbstractObject $object) { */ function islandora_default_islandora_manage_overview_object(AbstractObject $object) { $output = theme('islandora_default_overview', array('islandora_object' => $object)); - return array('Default overview output' => $output); + return array('Default overview output' => array( + '#markup' => $output, + )); } /** @@ -675,6 +678,7 @@ function islandora_edit_object(AbstractObject $object) { $output = array(); foreach (islandora_build_hook_list(ISLANDORA_EDIT_HOOK, $object->models) as $hook) { $temp = module_invoke_all($hook, $object); + islandora_array_of_markup_to_renderable_array($temp); if (!empty($temp)) { $output = array_merge_recursive($output, $temp); } @@ -685,7 +689,7 @@ function islandora_edit_object(AbstractObject $object) { } arsort($output); drupal_alter(ISLANDORA_EDIT_HOOK, $object, $output); - return implode('', $output); + return $output; } /** @@ -700,7 +704,9 @@ function islandora_edit_object(AbstractObject $object) { */ function islandora_default_islandora_edit_object(AbstractObject $object) { $output = theme('islandora_default_edit', array('islandora_object' => $object)); - return array('Default Edit output' => $output); + return array('Default Edit output' => array( + '#markup' => $output, + )); } /** @@ -743,6 +749,7 @@ function islandora_view_object(AbstractObject $object) { // @todo Remove page number and size from this hook, implementers of the // hook should use drupal page handling directly. $temp = module_invoke_all($hook, $object, $page_number, $page_size); + islandora_array_of_markup_to_renderable_array($temp); if (!empty($temp)) { $output = array_merge_recursive($output, $temp); } @@ -753,7 +760,7 @@ function islandora_view_object(AbstractObject $object) { } arsort($output); drupal_alter($hooks, $object, $output); - return implode('', $output); + return $output; } @@ -786,7 +793,9 @@ function islandora_drupal_title(AbstractObject $object) { */ function islandora_default_islandora_view_object($object) { $output = theme('islandora_default', array('islandora_object' => $object)); - return array('Default output' => $output); + return array('Default output' => array( + '#markup' => $output, + )); } /** From c5680fd1e062510a1619ed6d408113ba89351251 Mon Sep 17 00:00:00 2001 From: Adam Vessey Date: Tue, 9 Jul 2013 17:43:45 +0000 Subject: [PATCH 2/4] Change function name and slightly safer logic. --- includes/utilities.inc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/includes/utilities.inc b/includes/utilities.inc index 29f450b1..5ce2ca14 100644 --- a/includes/utilities.inc +++ b/includes/utilities.inc @@ -869,6 +869,8 @@ function islandora_deprecated($release, $solution = NULL) { /** * Transform recursively-merged array of strings to renderable arrays. * + * Renderable arrays are passed-through as-is. + * * Previously, functions/hooks like islandora_view_object would return an * associative array with string values containing markup. These values were * then imploded into one large piece of markup. Here, we transform this older @@ -880,16 +882,24 @@ function islandora_deprecated($release, $solution = NULL) { * of strings, which we transform to renderable markup elements (by * reference). */ -function islandora_array_of_markup_to_renderable_array(&$markup_array) { +function islandora_as_renderable_array(&$markup_array) { foreach ($markup_array as &$value) { if (!is_array($value)) { + // Not a renderable array, just a string. Let's convert it to a + // renderable '#markup' element. $value = array( '#markup' => $value, ); } - else { + elseif (!isset($value['#type']) && !isset($value['#markup'])) { + // A simple array--possibly the result of a recursive merge? Let's + // look at each, to possibly convert them to a renderable '#markup' + // elements. foreach ($value as &$inner) { if (!is_array($inner)) { + // If it is an array at this level, we can assume that it is a + // renderable array. If it is not an array, convert to a renderable + // '#markup' element. $inner = array( '#markup' => $inner, ); From e6fe09947806fb8c095b857dd747669bee73a628 Mon Sep 17 00:00:00 2001 From: Adam Vessey Date: Tue, 9 Jul 2013 17:46:36 +0000 Subject: [PATCH 3/4] Carry through through the function rename. Also, be sure to call the transformer function after the alter, just in case a modules adds in another value in the manner it used to use 'em. --- islandora.module | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/islandora.module b/islandora.module index 8f552f37..574aef51 100644 --- a/islandora.module +++ b/islandora.module @@ -624,7 +624,7 @@ function islandora_manage_overview_object(AbstractObject $object) { $output = array(); foreach (islandora_build_hook_list(ISLANDORA_OVERVIEW_HOOK, $object->models) as $hook) { $temp = module_invoke_all($hook, $object); - islandora_array_of_markup_to_renderable_array($temp); + islandora_as_renderable_array($temp); if (!empty($temp)) { $output = array_merge_recursive($output, $temp); } @@ -635,6 +635,7 @@ function islandora_manage_overview_object(AbstractObject $object) { } arsort($output); drupal_alter(ISLANDORA_OVERVIEW_HOOK, $object, $output); + islandora_as_renderable_array($output); return $output; } @@ -678,7 +679,7 @@ function islandora_edit_object(AbstractObject $object) { $output = array(); foreach (islandora_build_hook_list(ISLANDORA_EDIT_HOOK, $object->models) as $hook) { $temp = module_invoke_all($hook, $object); - islandora_array_of_markup_to_renderable_array($temp); + islandora_as_renderable_array($temp); if (!empty($temp)) { $output = array_merge_recursive($output, $temp); } @@ -689,6 +690,7 @@ function islandora_edit_object(AbstractObject $object) { } arsort($output); drupal_alter(ISLANDORA_EDIT_HOOK, $object, $output); + islandora_as_renderable_array($output); return $output; } @@ -749,7 +751,7 @@ function islandora_view_object(AbstractObject $object) { // @todo Remove page number and size from this hook, implementers of the // hook should use drupal page handling directly. $temp = module_invoke_all($hook, $object, $page_number, $page_size); - islandora_array_of_markup_to_renderable_array($temp); + islandora_as_renderable_array($temp); if (!empty($temp)) { $output = array_merge_recursive($output, $temp); } @@ -760,6 +762,7 @@ function islandora_view_object(AbstractObject $object) { } arsort($output); drupal_alter($hooks, $object, $output); + islandora_as_renderable_array($output); return $output; } From cde90385b23c175a6c2fd6ba5b296971542b04be Mon Sep 17 00:00:00 2001 From: Adam Vessey Date: Tue, 9 Jul 2013 18:49:48 +0000 Subject: [PATCH 4/4] Fix code standard issues. --- islandora.module | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/islandora.module b/islandora.module index 574aef51..5b45fb1a 100644 --- a/islandora.module +++ b/islandora.module @@ -651,9 +651,11 @@ function islandora_manage_overview_object(AbstractObject $object) { */ function islandora_default_islandora_manage_overview_object(AbstractObject $object) { $output = theme('islandora_default_overview', array('islandora_object' => $object)); - return array('Default overview output' => array( - '#markup' => $output, - )); + return array( + 'Default overview output' => array( + '#markup' => $output, + ), + ); } /** @@ -706,9 +708,11 @@ function islandora_edit_object(AbstractObject $object) { */ function islandora_default_islandora_edit_object(AbstractObject $object) { $output = theme('islandora_default_edit', array('islandora_object' => $object)); - return array('Default Edit output' => array( - '#markup' => $output, - )); + return array( + 'Default Edit output' => array( + '#markup' => $output, + ), + ); } /** @@ -796,9 +800,11 @@ function islandora_drupal_title(AbstractObject $object) { */ function islandora_default_islandora_view_object($object) { $output = theme('islandora_default', array('islandora_object' => $object)); - return array('Default output' => array( - '#markup' => $output, - )); + return array( + 'Default output' => array( + '#markup' => $output, + ), + ); } /**