summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDries Buytaert <dries@buytaert.net>2009-07-15 17:40:18 +0000
committerDries Buytaert <dries@buytaert.net>2009-07-15 17:40:18 +0000
commit5a8452c55b9e6d7fcef921a7b56c23ef29eec3a9 (patch)
tree7285272f52d423a3a49b2a8ac3a596fb5939c49d
parentb692036962b8d2c5c2b12749cf662d537a889375 (diff)
downloadbrdo-5a8452c55b9e6d7fcef921a7b56c23ef29eec3a9.tar.gz
brdo-5a8452c55b9e6d7fcef921a7b56c23ef29eec3a9.tar.bz2
- Patch #493746 by JohnAlbin, ultimateboy, moshe weitzman: Enhance drupal_attributes() for multiple valued values.
-rw-r--r--includes/common.inc18
-rw-r--r--includes/theme.inc2
-rw-r--r--modules/image/image.module4
-rw-r--r--modules/simpletest/tests/common.test40
-rw-r--r--modules/user/user.module4
5 files changed, 56 insertions, 12 deletions
diff --git a/includes/common.inc b/includes/common.inc
index 7e553e473..487a716e9 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -2122,19 +2122,23 @@ function url($path = NULL, array $options = array()) {
/**
* Format an attribute string to insert in a tag.
*
+ * Each array key and its value will be formatted into an HTML attribute string.
+ * If a value is itself an array, then each array element is concatenated with a
+ * space between each value (e.g. a multi-value class attribute).
+ *
* @param $attributes
* An associative array of HTML attributes.
* @return
* An HTML string ready for insertion in a tag.
*/
function drupal_attributes($attributes = array()) {
- if (is_array($attributes)) {
- $t = '';
- foreach ($attributes as $key => $value) {
- $t .= " $key=" . '"' . check_plain($value) . '"';
+ foreach ($attributes as $attribute => $data) {
+ if (is_array($data)) {
+ $data = implode(' ', $data);
}
- return $t;
+ $items[] = $attribute . '="' . check_plain($data) . '"';
}
+ return isset($items) ? ' ' . implode(' ', $items) : '';
}
/**
@@ -4100,7 +4104,7 @@ function drupal_common_theme() {
'arguments' => array('links' => NULL, 'attributes' => array('class' => 'links')),
),
'image' => array(
- 'arguments' => array('path' => NULL, 'alt' => '', 'title' => '', 'attributes' => NULL, 'getsize' => TRUE),
+ 'arguments' => array('path' => NULL, 'alt' => '', 'title' => '', 'attributes' => array(), 'getsize' => TRUE),
),
'breadcrumb' => array(
'arguments' => array('breadcrumb' => NULL),
@@ -4124,7 +4128,7 @@ function drupal_common_theme() {
'arguments' => array('type' => MARK_NEW),
),
'item_list' => array(
- 'arguments' => array('items' => array(), 'title' => NULL, 'type' => 'ul', 'attributes' => NULL),
+ 'arguments' => array('items' => array(), 'title' => NULL, 'type' => 'ul', 'attributes' => array()),
),
'more_help_link' => array(
'arguments' => array('url' => NULL),
diff --git a/includes/theme.inc b/includes/theme.inc
index aee5e320f..f8ba34f55 100644
--- a/includes/theme.inc
+++ b/includes/theme.inc
@@ -1335,7 +1335,7 @@ function theme_links($links, $attributes = array('class' => 'links')) {
* @return
* A string containing the image tag.
*/
-function theme_image($path, $alt = '', $title = '', $attributes = NULL, $getsize = TRUE) {
+function theme_image($path, $alt = '', $title = '', $attributes = array(), $getsize = TRUE) {
if (!$getsize || (is_file($path) && (list($width, $height, $type, $image_attributes) = @getimagesize($path)))) {
$attributes = drupal_attributes($attributes);
$url = (url($path) == $path) ? $path : (base_path() . $path);
diff --git a/modules/image/image.module b/modules/image/image.module
index a979e6e5f..394bd5df5 100644
--- a/modules/image/image.module
+++ b/modules/image/image.module
@@ -29,7 +29,7 @@ function image_menu() {
function image_theme() {
return array(
'image_style' => array(
- 'arguments' => array('style' => NULL, 'path' => NULL, 'alt' => '', 'title' => '', 'attributes' => NULL, 'getsize' => TRUE),
+ 'arguments' => array('style' => NULL, 'path' => NULL, 'alt' => '', 'title' => '', 'attributes' => array(), 'getsize' => TRUE),
),
);
}
@@ -666,7 +666,7 @@ function image_effect_apply(&$image, $effect) {
* A string containing the image tag.
* @ingroup themeable
*/
-function theme_image_style($style_name, $path, $alt = '', $title = '', $attributes = NULL, $getsize = TRUE) {
+function theme_image_style($style_name, $path, $alt = '', $title = '', $attributes = array(), $getsize = TRUE) {
// theme_image() can only honor the $getsize parameter with local file paths.
// The derivative image is not created until it has been requested so the file
// may not yet exist, in this case we just fallback to the URL.
diff --git a/modules/simpletest/tests/common.test b/modules/simpletest/tests/common.test
index b2ae4a3dc..c396e9120 100644
--- a/modules/simpletest/tests/common.test
+++ b/modules/simpletest/tests/common.test
@@ -1074,3 +1074,43 @@ class FormatDateUnitTest extends DrupalWebTestCase {
drupal_save_session(TRUE);
}
}
+
+/**
+ * Tests for the format_date() function.
+ */
+class DrupalAttributesUnitTest extends DrupalUnitTestCase {
+ public static function getInfo() {
+ return array(
+ 'name' => t('HTML Attributes'),
+ 'description' => t('Perform unit tests on the drupal_attributes() function.'),
+ 'group' => t('System')
+ );
+ }
+
+ /**
+ * Tests that drupal_css_class() cleans the class name properly.
+ */
+ function testDrupalAttributes() {
+ // Verify that special characters are HTML encoded.
+ $this->assertIdentical(drupal_attributes(array('title' => '&"\'<>')), ' title="&amp;&quot;&#039;&lt;&gt;"', t('HTML encode attribute values.'));
+
+ // Verify multi-value attributes are concatenated with spaces.
+ $attributes = array('class' => array('first', 'last'));
+ $this->assertIdentical(drupal_attributes(array('class' => array('first', 'last'))), ' class="first last"', t('Concatenate multi-value attributes.'));
+
+ // Verify empty attribute values are rendered.
+ $this->assertIdentical(drupal_attributes(array('alt' => '')), ' alt=""', t('Empty attribute value #1.'));
+ $this->assertIdentical(drupal_attributes(array('alt' => NULL)), ' alt=""', t('Empty attribute value #2.'));
+
+ // Verify multiple attributes are rendered.
+ $attributes = array(
+ 'id' => 'id-test',
+ 'class' => array('first', 'last'),
+ 'alt' => 'Alternate',
+ );
+ $this->assertIdentical(drupal_attributes($attributes), ' id="id-test" class="first last" alt="Alternate"', t('Multiple attributes.'));
+
+ // Verify empty attributes array is rendered.
+ $this->assertIdentical(drupal_attributes(array()), '', t('Empty attributes array.'));
+ }
+}
diff --git a/modules/user/user.module b/modules/user/user.module
index ac7f6cbff..f3d188791 100644
--- a/modules/user/user.module
+++ b/modules/user/user.module
@@ -1177,10 +1177,10 @@ function template_preprocess_user_picture(&$variables) {
if (isset($filepath)) {
$alt = t("@user's picture", array('@user' => $account->name ? $account->name : variable_get('anonymous', t('Anonymous'))));
if (module_exists('image') && $style = variable_get('user_picture_style', '')) {
- $variables['picture'] = theme('image_style', $style, $filepath, $alt, $alt, NULL, FALSE);
+ $variables['picture'] = theme('image_style', $style, $filepath, $alt, $alt, array(), FALSE);
}
else {
- $variables['picture'] = theme('image', $filepath, $alt, $alt, NULL, FALSE);
+ $variables['picture'] = theme('image', $filepath, $alt, $alt, array(), FALSE);
}
if (!empty($account->uid) && user_access('access user profiles')) {
$attributes = array('attributes' => array('title' => t('View user profile.')), 'html' => TRUE);