Issue #2325517 by lauriii, Alienpruts, Tom Verhaeghe, joelpittet, rteijeiro | Cottser: Add methods for adding/removing attributes (not classes) on Attribute objects.

8.0.x
Alex Pott 2014-11-09 21:23:46 -08:00
parent 44f8f7872a
commit 80c7322768
4 changed files with 120 additions and 7 deletions

View File

@ -160,6 +160,47 @@ class Attribute implements \ArrayAccess, \IteratorAggregate {
return $this;
}
/**
* Sets values for an attribute key.
*
* @param string $attribute
* Name of the attribute.
* @param string|array $value
* Value(s) to set for the given attribute key.
*
* @return $this
*/
public function setAttribute($attribute, $value) {
$this->offsetSet($attribute, $value);
return $this;
}
/**
* Removes an attribute from an Attribute object.
*
* @param string|array ...
* Attributes to remove from the attribute array.
*
* @return $this
*/
public function removeAttribute() {
$args = func_get_args();
foreach ($args as $arg) {
// Support arrays or multiple arguments.
if (is_array($arg)) {
foreach ($arg as $value) {
unset($this->storage[$value]);
}
}
else {
unset($this->storage[$arg]);
}
}
return $this;
}
/**
* Removes argument values from array of existing CSS classes.
*

View File

@ -86,13 +86,6 @@ class AttributeArray extends AttributeValueBase implements \ArrayAccess, \Iterat
return new \ArrayIterator($this->value);
}
/**
* Returns the whole array.
*/
public function value() {
return $this->value;
}
/**
* Exchange the array for another one.
*

View File

@ -61,6 +61,13 @@ abstract class AttributeValueBase {
}
}
/**
* Returns the raw value.
*/
public function value() {
return $this->value;
}
/**
* Implements the magic __toString() method.
*/

View File

@ -25,6 +25,11 @@ class AttributeTest extends UnitTestCase {
$attribute = new Attribute(array('class' => array('example-class')));
$this->assertTrue(isset($attribute['class']));
$this->assertEquals(new AttributeArray('class', array('example-class')), $attribute['class']);
// Test adding boolean attributes through the constructor.
$attribute = new Attribute(['selected' => TRUE, 'checked' => FALSE]);
$this->assertTrue($attribute['selected']->value());
$this->assertFalse($attribute['checked']->value());
}
/**
@ -57,6 +62,73 @@ class AttributeTest extends UnitTestCase {
$this->assertFalse(isset($attribute['class']));
}
/**
* Tests setting attributes.
* @covers ::setAttribute()
*/
public function testSetAttribute() {
$attribute = new Attribute();
// Test adding various attributes.
$attributes = ['alt', 'id', 'src', 'title', 'value'];
foreach ($attributes as $key) {
foreach (['kitten', ''] as $value) {
$attribute = new Attribute();
$attribute->setAttribute($key, $value);
$this->assertEquals($value, $attribute[$key]);
}
}
// Test adding array to class.
$attribute = new Attribute();
$attribute->setAttribute('class', ['kitten', 'cat']);
$this->assertArrayEquals(['kitten', 'cat'], $attribute['class']->value());
// Test adding boolean attributes.
$attribute = new Attribute();
$attribute['checked'] = TRUE;
$this->assertTrue($attribute['checked']->value());
}
/**
* Tests removing attributes.
* @covers ::removeAttribute()
*/
public function testRemoveAttribute() {
$attributes = [
'alt' => 'Alternative text',
'id' => 'bunny',
'src' => 'zebra',
'style' => 'color: pink;',
'title' => 'kitten',
'value' => 'ostrich',
'checked' => TRUE,
];
$attribute = new Attribute($attributes);
// Single value.
$attribute->removeAttribute('alt');
$this->assertEmpty($attribute['alt']);
// Multiple values.
$attribute->removeAttribute('id', 'src');
$this->assertEmpty($attribute['id']);
$this->assertEmpty($attribute['src']);
// Single value in array.
$attribute->removeAttribute(['style']);
$this->assertEmpty($attribute['style']);
// Boolean value.
$attribute->removeAttribute('checked');
$this->assertEmpty($attribute['checked']);
// Multiple values in array.
$attribute->removeAttribute(['title', 'value']);
$this->assertEmpty((string) $attribute);
}
/**
* Tests adding class attributes with the AttributeArray helper method.
* @covers ::addClass()