From 6443fecebc99a9bfa7bc98983ffc337fb5473ff2 Mon Sep 17 00:00:00 2001 From: Trismegiste Date: Sat, 11 May 2013 01:17:22 +0200 Subject: [PATCH 1/5] PSR-0 with tests --- Composite/{Composite.php => Form.php} | 28 +-------------------------- Composite/FormElement.php | 8 ++++++++ Composite/InputElement.php | 11 +++++++++++ Composite/TextElement.php | 11 +++++++++++ Tests/Composite/FormTest.php | 25 ++++++++++++++++++++++++ 5 files changed, 56 insertions(+), 27 deletions(-) rename Composite/{Composite.php => Form.php} (69%) create mode 100644 Composite/FormElement.php create mode 100644 Composite/InputElement.php create mode 100644 Composite/TextElement.php create mode 100644 Tests/Composite/FormTest.php diff --git a/Composite/Composite.php b/Composite/Form.php similarity index 69% rename from Composite/Composite.php rename to Composite/Form.php index 4236d44..c3a8f46 100644 --- a/Composite/Composite.php +++ b/Composite/Form.php @@ -1,6 +1,6 @@ _elements[] = $element; } } - -abstract class FormElement -{ - abstract public function render(); -} - -class TextElement extends FormElement -{ - public function render() - { - return 'this is a text element'; - } -} - -class InputElement extends FormElement -{ - public function render() - { - return ''; - } -} - -$form = new Form(); -$form->addElement(new TextElement()); -$form->addElement(new InputElement()); -echo $form->render(); \ No newline at end of file diff --git a/Composite/FormElement.php b/Composite/FormElement.php new file mode 100644 index 0000000..8c56ac7 --- /dev/null +++ b/Composite/FormElement.php @@ -0,0 +1,8 @@ +'; + } +} diff --git a/Composite/TextElement.php b/Composite/TextElement.php new file mode 100644 index 0000000..bf5d8cd --- /dev/null +++ b/Composite/TextElement.php @@ -0,0 +1,11 @@ +addElement(new Composite\TextElement()); + $form->addElement(new Composite\InputElement()); + echo $form->render(); + } + +} \ No newline at end of file From f76b8b1ab352f08515255204faddfc69b43e2bb6 Mon Sep 17 00:00:00 2001 From: Trismegiste Date: Sat, 11 May 2013 01:22:18 +0200 Subject: [PATCH 2/5] you MUST inherit from the component contract. If not, this is no longer a composite pattern --- Composite/Form.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Composite/Form.php b/Composite/Form.php index c3a8f46..18ad54b 100644 --- a/Composite/Form.php +++ b/Composite/Form.php @@ -13,8 +13,10 @@ namespace DesignPatterns\Composite; * subsequently runs trough all its child elements and calls render() on them * - Zend_Config: a tree of configuration options, each one is a Zend_Config object * + * The composite node MUST extend the component contract. This is mandatory for building + * a tree of component. */ -class Form +class Form extends FormElement { protected $_elements; From 007a2d61711c334887b3eae65c9f0b5a087e3bff Mon Sep 17 00:00:00 2001 From: Trismegiste Date: Sat, 11 May 2013 01:24:40 +0200 Subject: [PATCH 3/5] changing interface to improve rendering --- Composite/Form.php | 2 +- Composite/FormElement.php | 2 +- Composite/InputElement.php | 2 +- Composite/TextElement.php | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Composite/Form.php b/Composite/Form.php index 18ad54b..e2ebc60 100644 --- a/Composite/Form.php +++ b/Composite/Form.php @@ -28,7 +28,7 @@ class Form extends FormElement * * @return string */ - public function render() + public function render($indent = 0) { $formCode = ''; foreach ($this->_elements as $element) { diff --git a/Composite/FormElement.php b/Composite/FormElement.php index 8c56ac7..3e3de93 100644 --- a/Composite/FormElement.php +++ b/Composite/FormElement.php @@ -4,5 +4,5 @@ namespace DesignPatterns\Composite; abstract class FormElement { - abstract public function render(); + abstract public function render($indent = 0); } diff --git a/Composite/InputElement.php b/Composite/InputElement.php index 0ed7022..d042e72 100644 --- a/Composite/InputElement.php +++ b/Composite/InputElement.php @@ -4,7 +4,7 @@ namespace DesignPatterns\Composite; class InputElement extends FormElement { - public function render() + public function render($indent = 0) { return ''; } diff --git a/Composite/TextElement.php b/Composite/TextElement.php index bf5d8cd..9e076e8 100644 --- a/Composite/TextElement.php +++ b/Composite/TextElement.php @@ -4,7 +4,7 @@ namespace DesignPatterns\Composite; class TextElement extends FormElement { - public function render() + public function render($indent = 0) { return 'this is a text element'; } From e70395c0a3d446b219b2c1b5ead7f876bc469633 Mon Sep 17 00:00:00 2001 From: Trismegiste Date: Sat, 11 May 2013 01:36:57 +0200 Subject: [PATCH 4/5] improving the render to show the tree with indentations --- Composite/Form.php | 2 +- Composite/InputElement.php | 2 +- Composite/TextElement.php | 2 +- Tests/Composite/FormTest.php | 5 +++++ 4 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Composite/Form.php b/Composite/Form.php index e2ebc60..0cc16e1 100644 --- a/Composite/Form.php +++ b/Composite/Form.php @@ -32,7 +32,7 @@ class Form extends FormElement { $formCode = ''; foreach ($this->_elements as $element) { - $formCode .= $element->render(); + $formCode .= $element->render($indent + 1) . PHP_EOL; } return $formCode; diff --git a/Composite/InputElement.php b/Composite/InputElement.php index d042e72..786df45 100644 --- a/Composite/InputElement.php +++ b/Composite/InputElement.php @@ -6,6 +6,6 @@ class InputElement extends FormElement { public function render($indent = 0) { - return ''; + return str_repeat(' ', $indent) . ''; } } diff --git a/Composite/TextElement.php b/Composite/TextElement.php index 9e076e8..c8214ca 100644 --- a/Composite/TextElement.php +++ b/Composite/TextElement.php @@ -6,6 +6,6 @@ class TextElement extends FormElement { public function render($indent = 0) { - return 'this is a text element'; + return str_repeat(' ', $indent) . 'this is a text element'; } } diff --git a/Tests/Composite/FormTest.php b/Tests/Composite/FormTest.php index 85d56d5..2e10a8f 100644 --- a/Tests/Composite/FormTest.php +++ b/Tests/Composite/FormTest.php @@ -19,6 +19,11 @@ class FormTest extends \PHPUnit_Framework_TestCase $form = new Composite\Form(); $form->addElement(new Composite\TextElement()); $form->addElement(new Composite\InputElement()); + $embed = new Composite\Form(); + $embed->addElement(new Composite\TextElement()); + $embed->addElement(new Composite\InputElement()); + $form->addElement($embed); // here we have a tree ! + echo $form->render(); } From 42dd2383c182d5777829f5fdb170c90799c6bbd7 Mon Sep 17 00:00:00 2001 From: Trismegiste Date: Sat, 11 May 2013 01:46:13 +0200 Subject: [PATCH 5/5] test for rendering with embedded form --- Tests/Composite/FormTest.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/Composite/FormTest.php b/Tests/Composite/FormTest.php index 2e10a8f..1c7a428 100644 --- a/Tests/Composite/FormTest.php +++ b/Tests/Composite/FormTest.php @@ -22,9 +22,9 @@ class FormTest extends \PHPUnit_Framework_TestCase $embed = new Composite\Form(); $embed->addElement(new Composite\TextElement()); $embed->addElement(new Composite\InputElement()); - $form->addElement($embed); // here we have a tree ! - - echo $form->render(); + $form->addElement($embed); // here we have a embedded form (like SF2 does) + + $this->assertRegExp('#^\s{4}#m', $form->render()); } } \ No newline at end of file