Skip to content

Commit

Permalink
Make Partial proxy to view render function
Browse files Browse the repository at this point in the history
  • Loading branch information
bakura10 committed Nov 13, 2012
1 parent 27f46ce commit e0825a0
Show file tree
Hide file tree
Showing 5 changed files with 44 additions and 148 deletions.
86 changes: 5 additions & 81 deletions src/Helper/Partial.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

namespace Zend\View\Helper;

use Traversable;
use Zend\View\Exception;

/**
Expand All @@ -20,98 +21,21 @@
*/
class Partial extends AbstractHelper
{
/**
* Variable to which object will be assigned
* @var string
*/
protected $objectKey;

/**
* Renders a template fragment within a variable scope distinct from the
* calling View object.
*
* If no arguments are passed, returns the helper instance.
*
* If the $model is an array, it is passed to the view object's assign()
* method.
*
* If the $model is an object, it first checks to see if the object
* implements a 'toArray' method; if so, it passes the result of that
* method to to the view object's assign() method. Otherwise, the result of
* get_object_vars() is passed.
* calling View object. It proxies to view's render function
*
* @param string $name Name of view script
* @param array $model Variables to populate in the view
* @param array $values Variables to populate in the view
* @return string|Partial
* @throws Exception\RuntimeException
*/
public function __invoke($name = null, $model = null)
public function __invoke($name = null, $values = null)
{
if (0 == func_num_args()) {
return $this;
}

$view = $this->cloneView();
if (isset($this->partialCounter)) {
$view->partialCounter = $this->partialCounter;
}

if (!empty($model)) {
if (is_array($model)) {
$view->vars()->assign($model);
} elseif (is_object($model)) {
if (null !== ($objectKey = $this->getObjectKey())) {
$view->vars()->offsetSet($objectKey, $model);
} elseif (method_exists($model, 'toArray')) {
$view->vars()->assign($model->toArray());
} else {
$view->vars()->assign(get_object_vars($model));
}
}
}

return $view->render($name);
}

/**
* Clone the current View
*
* @return \Zend\View\Renderer\RendererInterface
*/
public function cloneView()
{
$view = clone $this->view;
$view->setVars(array());
return $view;
}

/**
* Set object key
*
* @param string $key
* @return Partial
*/
public function setObjectKey($key)
{
if (null === $key) {
$this->objectKey = null;
} else {
$this->objectKey = (string) $key;
}

return $this;
}

/**
* Retrieve object key
*
* The objectKey is the variable to which an object in the iterator will be
* assigned.
*
* @return null|string
*/
public function getObjectKey()
{
return $this->objectKey;
return $this->getView()->render($name, $values);
}
}
43 changes: 29 additions & 14 deletions src/Helper/PartialLoop.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@

namespace Zend\View\Helper;

use Iterator;
use Traversable;
use Zend\Stdlib\ArrayUtils;
use Zend\View\Exception;

/**
Expand All @@ -22,9 +24,9 @@
*/
class PartialLoop extends Partial
{

/**
* Marker to where the pointer is at in the loop
*
* @var integer
*/
protected $partialCounter = 0;
Expand All @@ -36,40 +38,53 @@ class PartialLoop extends Partial
* If no arguments are provided, returns object instance.
*
* @param string $name Name of view script
* @param array $model Variables to populate in the view
* @param array $values Variables to populate in the view
* @return string
* @throws Exception\InvalidArgumentException
*/
public function __invoke($name = null, $model = null)
public function __invoke($name = null, $values = null)
{
if (0 == func_num_args()) {
return $this;
}

if (!is_array($model)
&& (!$model instanceof Traversable)
&& (is_object($model) && !method_exists($model, 'toArray'))
if (!is_array($values)
&& (!$values instanceof Traversable)
&& (is_object($values) && !method_exists($values, 'toArray'))
) {
throw new Exception\InvalidArgumentException('PartialLoop helper requires iterable data');
}

if (is_object($model)
&& (!$model instanceof Traversable)
&& method_exists($model, 'toArray')
if (is_object($values)
&& (!$values instanceof Traversable)
&& method_exists($values, 'toArray')
) {
$model = $model->toArray();
$values = $values->toArray();
}

if ($values instanceof Iterator) {
$values = ArrayUtils::iteratorToArray($values);
}

$content = '';
// reset the counter if it's called again
$this->partialCounter = 0;
foreach ($model as $item) {
// increment the counter variable
$this->partialCounter++;
$content = '';

foreach ($values as $item) {
$this->partialCounter++;
$content .= parent::__invoke($name, $item);
}

return $content;
}

/**
* Get the partial counter
*
* @return int
*/
public function getPartialCounter()
{
return $this->partialCounter;
}
}
2 changes: 1 addition & 1 deletion src/Renderer/PhpRenderer.php
Original file line number Diff line number Diff line change
Expand Up @@ -401,7 +401,7 @@ public function getFilterChain()
*/
public function render($nameOrModel, $values = null)
{
if ($nameOrModel instanceof Model) {
if ($nameOrModel instanceof Model) {
$model = $nameOrModel;
$nameOrModel = $model->getTemplate();
if (empty($nameOrModel)) {
Expand Down
32 changes: 9 additions & 23 deletions test/Helper/PartialLoopTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ public function testShouldAllowIteratingOverObjectsImplementingToArray()
* @group ZF-3350
* @group ZF-3352
*/
public function testShouldNotCastToArrayIfObjectIsTraversable()
/*public function testShouldNotCastToArrayIfObjectIsTraversable()
{
$data = array(
new IteratorWithToArrayTestContainer(array('message' => 'foo')),
Expand All @@ -221,14 +221,13 @@ public function testShouldNotCastToArrayIfObjectIsTraversable()
$view = new View();
$view->resolver()->addPath($this->basePath . '/application/views/scripts');
$this->helper->setView($view);
$this->helper->setObjectKey('obj');
$result = $this->helper->__invoke('partialLoopObject.phtml', $o);
foreach ($data as $item) {
$string = 'This is an iteration: ' . $item->message;
$this->assertContains($string, $result, $result);
}
}
}*/

/**
* @group ZF-3083
Expand All @@ -245,7 +244,7 @@ public function testEmptyArrayPassedToPartialLoopShouldNotThrowException()
/**
* @group ZF-2737
*/
public function testPartialLoopIncramentsPartialCounter()
public function testPartialLoopIncrementsPartialCounter()
{
$data = array(
array('message' => 'foo'),
Expand All @@ -258,15 +257,8 @@ public function testPartialLoopIncramentsPartialCounter()
$view->resolver()->addPath($this->basePath . '/application/views/scripts');
$this->helper->setView($view);

$result = $this->helper->__invoke('partialLoopCouter.phtml', $data);
foreach ($data as $key => $item) {
$string = sprintf(
'This is an iteration: %s, pointer at %d',
$item['message'],
$key + 1
);
$this->assertContains($string, $result, $result);
}
$this->helper->__invoke('partialLoopCouter.phtml', $data);
$this->assertEquals(4, $this->helper->getPartialCounter());
}

/**
Expand All @@ -285,17 +277,11 @@ public function testPartialLoopPartialCounterResets()
$view->resolver()->addPath($this->basePath . '/application/views/scripts');
$this->helper->setView($view);

$result = $this->helper->__invoke('partialLoopCouter.phtml', $data);
foreach ($data as $key=>$item) {
$string = 'This is an iteration: ' . $item['message'] . ', pointer at ' . ($key+1);
$this->assertContains($string, $result);
}
$this->helper->__invoke('partialLoopCouter.phtml', $data);
$this->assertEquals(4, $this->helper->getPartialCounter());

$result = $this->helper->__invoke('partialLoopCouter.phtml', $data);
foreach ($data as $key=>$item) {
$string = 'This is an iteration: ' . $item['message'] . ', pointer at ' . ($key+1);
$this->assertContains($string, $result);
}
$this->helper->__invoke('partialLoopCouter.phtml', $data);
$this->assertEquals(4, $this->helper->getPartialCounter());
}
}

Expand Down
29 changes: 0 additions & 29 deletions test/Helper/PartialTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -94,34 +94,6 @@ public function testSetViewSetsViewProperty()
$this->assertSame($view, $this->helper->getView());
}

/**
* @return void
*/
public function testCloneViewReturnsDifferentViewInstance()
{
$view = new View();
$this->helper->setView($view);
$clone = $this->helper->cloneView();
$this->assertNotSame($view, $clone);
$this->assertTrue($clone instanceof View);
}

/**
* @return void
*/
public function testCloneViewClearsViewVariables()
{
$view = new View();
$view->foo = 'bar';
$this->helper->setView($view);

$clone = $this->helper->cloneView();
$clonedVars = $clone->vars();

$this->assertEquals(0, count($clonedVars));
$this->assertNull($clone->vars()->foo);
}

public function testObjectModelWithPublicPropertiesSetsViewVariables()
{
$model = new \stdClass();
Expand Down Expand Up @@ -156,7 +128,6 @@ public function testObjectModelWithToArraySetsViewVariables()

public function testObjectModelSetInObjectKeyWhenKeyPresent()
{
$this->helper->setObjectKey('foo');
$model = new \stdClass();
$model->footest = 'bar';
$model->bartest = 'baz';
Expand Down

0 comments on commit e0825a0

Please sign in to comment.