Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for nested presenters #10

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 34 additions & 2 deletions src/Robbo/Presenter/Presenter.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
<?php namespace Robbo\Presenter;

use ArrayAccess;
use IteratorAggregate;

abstract class Presenter implements \ArrayAccess {

/**
Expand Down Expand Up @@ -106,7 +109,9 @@ public function __get($var)
return $this->$method();
}

return is_array($this->object) ? $this->object[$var] : $this->object->$var;
$value = is_array($this->object) ? $this->object[$var] : $this->object->$var;

return static::makePresentable($value);
}

/**
Expand All @@ -120,9 +125,36 @@ public function __call($method, $arguments)
{
if (is_object($this->object))
{
return call_user_func_array(array($this->object, $method), $arguments);
$value = call_user_func_array(array($this->object, $method), $arguments);

return static::makePresentable($value);
}

throw new \BadMethodCallException("Method {$method} does not exist.");
}

/**
* If this variable implements Robbo\Presenter\PresentableInterface then turn it into a presenter.
*
* @param mixed $value
* @return mixed $value
*/
public static function makePresentable($value)
{
if ($value instanceof PresentableInterface)
{
return $value->getPresenter();
}

if (is_array($value) or ($value instanceof IteratorAggregate and $value instanceof ArrayAccess))
{
foreach ($value as $k => $v)
{
$value[$k] = static::makePresentable($v);
}
}

return $value;
}

}
32 changes: 4 additions & 28 deletions src/Robbo/Presenter/View/Environment.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
<?php namespace Robbo\Presenter\View;

use ArrayAccess;
use IteratorAggregate;
use Robbo\Presenter\Presenter;
use Robbo\Presenter\PresentableInterface;
use Illuminate\View\Environment as BaseEnvironment;

Expand All @@ -21,7 +20,7 @@ public function make($view, $data = array(), $mergeData = array())

$data = array_merge($mergeData, $this->parseData($data));

return new View($this, $this->getEngineFromPath($path), $view, $path, $this->makePresentable($data));
return new View($this, $this->getEngineFromPath($path), $view, $path, Presenter::makePresentable($data));
}

/**
Expand All @@ -35,33 +34,10 @@ public function share($key, $value = null)
{
if ( ! is_array($key))
{
return parent::share($key, $this->makePresentable($value));
return parent::share($key, Presenter::makePresentable($value));
}

return parent::share($this->makePresentable($key));
return parent::share(Presenter::makePresentable($key));
}

/**
* If this variable implements Robbo\Presenter\PresentableInterface then turn it into a presenter.
*
* @param mixed $value
* @return mixed $value
*/
public function makePresentable($value)
{
if ($value instanceof PresentableInterface)
{
return $value->getPresenter();
}

if (is_array($value) or ($value instanceof IteratorAggregate and $value instanceof ArrayAccess))
{
foreach ($value as $k => $v)
{
$value[$k] = $this->makePresentable($v);
}
}

return $value;
}
}
3 changes: 2 additions & 1 deletion src/Robbo/Presenter/View/View.php
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
<?php namespace Robbo\Presenter\View;

use Robbo\Presenter\Presenter;
use Illuminate\View\View as BaseView;

class View extends BaseView {
Expand All @@ -13,6 +14,6 @@ class View extends BaseView {
*/
public function with($key, $value = null)
{
return parent::with($key, $this->environment->makePresentable($value));
return parent::with($key, Presenter::makePresentable($value));
}
}
42 changes: 33 additions & 9 deletions tests/ViewEnvironmentTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@ public function tearDown()

public function testPresentableToPresenter()
{
$presenter = $this->getEnvironment()->makePresentable(new PresentableStub);
$presenter = Presenter::makePresentable(new PresentableStub);

$this->assertTrue($presenter instanceof Presenter);
$this->assertInstanceOf('Robbo\Presenter\Presenter', $presenter);
}

public function testPresentablesToPresenters()
Expand All @@ -33,13 +33,15 @@ public function testPresentablesToPresenters()
))
);

$to = $this->getEnvironment()->makePresentable($from);
$to = Presenter::makePresentable($from);

$this->assertSame($from['string'], $to['string']);
$this->assertSame($from['array'], $to['array']);
$this->assertTrue($to['presentable'] instanceof Presenter);
$this->assertTrue($to['recurseMe'][0]['presentable'] instanceof Presenter);
$this->assertTrue($to['collection']['presentable'] instanceof Presenter);
$this->assertInstanceOf('Robbo\Presenter\Presenter', $to['presentable']);
$this->assertInstanceOf('Robbo\Presenter\Presenter', $to['presentable']->presentableObject);
$this->assertInstanceOf('Robbo\Presenter\Presenter', $to['presentable']->getPresentableObject());
$this->assertInstanceOf('Robbo\Presenter\Presenter', $to['recurseMe'][0]['presentable']);
$this->assertInstanceOf('Robbo\Presenter\Presenter', $to['collection']['presentable']);
}

public function testMakeView()
Expand All @@ -57,10 +59,12 @@ public function testMakeView()

$view = $env->make('test', $data);

$this->assertTrue($view instanceof View);
$this->assertInstanceOf('Robbo\Presenter\View\View', $view);
$this->assertSame($view['meh'], $data['meh']);
$this->assertTrue($view['presentable'] instanceof Presenter);
$this->assertTrue($view['collection']['presentable'] instanceof Presenter);
$this->assertInstanceOf('Robbo\Presenter\Presenter', $view['presentable']);
$this->assertInstanceOf('Robbo\Presenter\Presenter', $view['presentable']->presentableObject);
$this->assertInstanceOf('Robbo\Presenter\Presenter', $view['presentable']->getPresentableObject());
$this->assertInstanceOf('Robbo\Presenter\Presenter', $view['collection']['presentable']);
}

protected function getEnvironment()
Expand All @@ -85,6 +89,26 @@ protected function getEngineFromPath($path)

class PresentableStub implements PresentableInterface {

public $presentableObject;

public function __construct()
{
$this->presentableObject = new SecondPresentableStub;
}

public function getPresentableObject()
{
return $this->presentableObject;
}

public function getPresenter()
{
return new EnvPresenterStub($this);
}
}

class SecondPresentableStub implements PresentableInterface {

public function getPresenter()
{
return new EnvPresenterStub($this);
Expand Down