Skip to content

Commit

Permalink
Don't use cloning in Collection
Browse files Browse the repository at this point in the history
  • Loading branch information
TAINCER committed Feb 27, 2023
1 parent b9968ed commit 7bb3344
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 43 deletions.
49 changes: 34 additions & 15 deletions src/FormElement/Collection.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
namespace ipl\Html\FormElement;

use ipl\Html\Attributes;
use ipl\Html\Contract\FormElement;

class Collection extends FieldsetElement
{
Expand All @@ -12,11 +11,19 @@ class Collection extends FieldsetElement
/** @var callable */
protected $onAssembleGroup;

/** @var FormElement */
protected $addElement;
/** @var array */
protected $addElement = [
'type' => null,
'name' => null,
'options' => null
];

/** @var FormElement */
protected $removeElement;
/** @var array */
protected $removeElement = [
'type' => null,
'name' => null,
'options' => null
];

/** @var string[] */
protected $defaultAttributes = [
Expand All @@ -34,25 +41,29 @@ public function onAssembleGroup(callable $callback): void
}

/**
* @param FormElement $element
* @param string $typeOrElement
* @param string|null $name
* @param null $options
*
* @return $this
*/
public function setAddElement(FormELement $element): self
public function setAddElement(string $typeOrElement, string $name = null, $options = null): self
{
$this->addElement = clone $element;
$this->addElement = ['type' => $typeOrElement, 'name' => $name, 'options' => $options];

return $this;
}

/**
* @param FormElement $element
* @param string $typeOrElement
* @param string|null $name
* @param null $options
*
* @return $this
*/
public function setRemoveElement(FormElement $element): self
public function setRemoveElement(string $typeOrElement, string $name = null, $options = null): self
{
$this->removeElement = clone $element;
$this->removeElement = ['type' => $typeOrElement, 'name' => $name, 'options' => $options];

return $this;
}
Expand All @@ -79,13 +90,13 @@ protected function assemble()

$valid = true;
foreach ($values as $key => $items) {
if ($this->removeElement !== null && isset($items[0][$this->removeElement->getName()])) {
if ($this->removeElement !== null && isset($items[0][$this->removeElement['name']])) {
continue;
}

$group = $this->addGroup($key);

if (empty($group->getValue($this->addElement->getName()))) {
if (empty($group->getValue($this->addElement['name']))) {
$valid = false;
}
}
Expand All @@ -107,8 +118,16 @@ protected function addGroup($key): FieldsetElement
->registerElement($group)
->assembleGroup(
$group,
$this->addElement ? clone $this->addElement : null,
$this->removeElement ? clone $this->removeElement : null
$this->addElement['type'] ? $this->createElement(
$this->addElement['type'],
$this->addElement['name'],
$this->addElement['options']
) : null,
$this->removeElement['type'] ? $this->createElement(
$this->removeElement['type'],
$this->removeElement['name'],
$this->removeElement['options']
) : null
)
->addHtml($group);

Expand Down
56 changes: 28 additions & 28 deletions tests/CollectionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,12 +81,12 @@ public function testAddTrigger()
{
$collection = new Collection('testCollection');
$collection
->setAddElement(new SelectElement('add_element', [
->setAddElement('select', 'add_element', [
'required' => false,
'label' => 'Add Trigger',
'options' => [null => 'Please choose', 'first' => 'First Option'],
'class' => 'autosubmit'
]))
])
->onAssembleGroup(function ($group, $addElement, $removeElement) {
$group
->addElement($addElement)
Expand Down Expand Up @@ -118,9 +118,9 @@ public function testRemoveTrigger()
{
$collection = new Collection('testCollection');
$collection
->setRemoveElement(new SubmitButtonElement('remove_trigger', [
->setRemoveElement('submitButton', 'remove_trigger', [
'label' => 'Remove Trigger',
]))
])
->onAssembleGroup(function ($group, $addElement, $removeElement) {
$group->addElement('input', 'test_input', [
'label' => 'Test Input'
Expand Down Expand Up @@ -148,16 +148,16 @@ public function testRemoveTrigger()
public function testFullCollection()
{
$collection = (new Collection('testCollection'))
->setAddElement(new SelectElement('add_element', [
->setAddElement('select', 'add_element', [
'required' => false,
'label' => 'Add Trigger',
'options' => [null => 'Please choose', 'first' => 'First Option'],
'class' => 'autosubmit'
]))
->setRemoveElement(new SubmitButtonElement('remove_trigger', [
])
->setRemoveElement('submitButton', 'remove_trigger', [
'label' => 'Remove Trigger',
'value' => 'Remove Trigger'
]));
]);

$collection->onAssembleGroup(function ($group, $addElement, $removeElement) {
$group->addElement($addElement);
Expand Down Expand Up @@ -196,11 +196,11 @@ public function testFullCollection()
public function testMultipleCollections()
{
$collection = (new Collection('testCollection'))
->setAddElement(new SelectElement('add_element', [
->setAddElement('select', 'add_element', [
'required' => false,
'label' => 'Add Trigger',
'options' => [null => 'Please choose', 'first' => 'First Option']
]));
]);

$collection->onAssembleGroup(function ($group, $addElement, $removeElement) {
$group->addElement($addElement);
Expand Down Expand Up @@ -249,20 +249,15 @@ public function testMultipleCollections()

public function testPopulatingCollection(): void
{
$addElement = new SelectElement('test_select1', [
'options' => [
'key1' => 'value1',
'key2' => 'value2'
]
]);
$testElement3 = clone $addElement;
$testElement3->setName('test_select3');
$testElement3->getAttributes()->set('options', ['key5' => 'value5', 'key6' => 'value6']);

$collection = (new Collection('testCollection'))
->setAddElement($addElement);
->setAddElement('select', 'test_select1', [
'options' => [
'key1' => 'value1',
'key2' => 'value2'
]
]);

$collection->onAssembleGroup(function ($group, $addElement) use ($testElement3) {
$collection->onAssembleGroup(function ($group, $addElement) {
$group->addElement(new InputElement('test_input'));
$group->addElement($addElement);
$group->addElement(new SelectElement('test_select2', [
Expand All @@ -271,7 +266,12 @@ public function testPopulatingCollection(): void
'key4' => 'value4'
]
]));
$group->addElement($testElement3);
$group->addElement('select', 'test_select3', [
'options' => [
'key5' => 'value5',
'key6' => 'value6'
]
]);
});

$this->form
Expand Down Expand Up @@ -315,10 +315,10 @@ public function testPopulatingCollection(): void

public function testCollidingElementNames(): void
{
$addElement = new SelectElement('add_element', ['options' => ['key1' => 'value1', 'key2' => 'value2']]);

$firstCollection = (new Collection('first_collection'))->setAddElement(clone $addElement);
$secondCollection = (new Collection('second_collection')) ->setAddElement(clone $addElement);
$firstCollection = (new Collection('first_collection'))
->setAddElement('select', 'add_element', ['options' => ['key1' => 'value1', 'key2' => 'value2']]);
$secondCollection = (new Collection('second_collection'))
->setAddElement('select', 'add_element', ['options' => ['key1' => 'value1', 'key2' => 'value2']]);

$firstCollection->onAssembleGroup(function ($group, $addElement) {
$group->addElement($addElement);
Expand All @@ -335,7 +335,7 @@ public function testCollidingElementNames(): void
->addHtml($secondCollection)
->addElement(new SubmitButtonElement('add_element'))
->populate([
'first_collection' => [
'first_collection' => [
[
'add_element' => 'key1'
]
Expand Down

0 comments on commit 7bb3344

Please sign in to comment.