mirror of
https://github.com/Mibew/handlebars.php-helpers.git
synced 2025-03-22 13:41:27 +03:00
Add "first" and "last" helpers
This commit is contained in:
parent
723b03fd45
commit
f25440e632
50
src/Collection/FirstHelper.php
Normal file
50
src/Collection/FirstHelper.php
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of Handlebars.php Helpers Set
|
||||||
|
*
|
||||||
|
* (c) Dmitriy Simushev <simushevds@gmail.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace JustBlackBird\HandlebarsHelpers\Collection;
|
||||||
|
|
||||||
|
use Handlebars\Context;
|
||||||
|
use Handlebars\Helper as HelperInterface;
|
||||||
|
use Handlebars\Template;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the first item of the collection.
|
||||||
|
*
|
||||||
|
* If the passed in collection is empty boolean false will be returned.
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
* ```handlebars
|
||||||
|
* {{first collection}}
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* - "collection": an array or an instance of \Traversable which first element
|
||||||
|
* should be returned.
|
||||||
|
*
|
||||||
|
* @author Dmitriy Simushev <simushevds@gmail.com>
|
||||||
|
*/
|
||||||
|
class FirstHelper implements HelperInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function execute(Template $template, Context $context, $args, $source)
|
||||||
|
{
|
||||||
|
$parsed_args = $template->parseArguments($args);
|
||||||
|
if (count($parsed_args) != 1) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'"first" helper expects exactly one argument.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$collection = $context->get($parsed_args[0]);
|
||||||
|
|
||||||
|
return reset($collection);
|
||||||
|
}
|
||||||
|
}
|
32
src/Collection/Helpers.php
Normal file
32
src/Collection/Helpers.php
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of Handlebars.php Helpers Set
|
||||||
|
*
|
||||||
|
* (c) Dmitriy Simushev <simushevds@gmail.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace JustBlackBird\HandlebarsHelpers\Collection;
|
||||||
|
|
||||||
|
use Handlebars\Helpers as BaseHelpers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains all collections related helpers.
|
||||||
|
*
|
||||||
|
* @author Dmitriy Simushev <simushevds@gmail.com>
|
||||||
|
*/
|
||||||
|
class Helpers extends BaseHelpers
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
protected function addDefaultHelpers()
|
||||||
|
{
|
||||||
|
parent::addDefaultHelpers();
|
||||||
|
|
||||||
|
$this->add('first', new FirstHelper());
|
||||||
|
$this->add('last', new LastHelper());
|
||||||
|
}
|
||||||
|
}
|
50
src/Collection/LastHelper.php
Normal file
50
src/Collection/LastHelper.php
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of Handlebars.php Helpers Set
|
||||||
|
*
|
||||||
|
* (c) Dmitriy Simushev <simushevds@gmail.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace JustBlackBird\HandlebarsHelpers\Collection;
|
||||||
|
|
||||||
|
use Handlebars\Context;
|
||||||
|
use Handlebars\Helper as HelperInterface;
|
||||||
|
use Handlebars\Template;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the last item of the collection.
|
||||||
|
*
|
||||||
|
* If the passed in collection is empty boolean false will be returned.
|
||||||
|
*
|
||||||
|
* Usage:
|
||||||
|
* ```handlebars
|
||||||
|
* {{last collection}}
|
||||||
|
* ```
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* - "collection": an array or an instance of \Traversable which last element
|
||||||
|
* should be returned.
|
||||||
|
*
|
||||||
|
* @author Dmitriy Simushev <simushevds@gmail.com>
|
||||||
|
*/
|
||||||
|
class LastHelper implements HelperInterface
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function execute(Template $template, Context $context, $args, $source)
|
||||||
|
{
|
||||||
|
$parsed_args = $template->parseArguments($args);
|
||||||
|
if (count($parsed_args) != 1) {
|
||||||
|
throw new \InvalidArgumentException(
|
||||||
|
'"last" helper expects exactly one argument.'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$collection = $context->get($parsed_args[0]);
|
||||||
|
|
||||||
|
return end($collection);
|
||||||
|
}
|
||||||
|
}
|
@ -29,6 +29,10 @@ class Helpers extends BaseHelpers
|
|||||||
// Date helpers
|
// Date helpers
|
||||||
$this->add('formatDate', new Date\FormatDateHelper());
|
$this->add('formatDate', new Date\FormatDateHelper());
|
||||||
|
|
||||||
|
// Collection helpers
|
||||||
|
$this->add('first', new Collection\FirstHelper());
|
||||||
|
$this->add('last', new Collection\LastHelper());
|
||||||
|
|
||||||
// Comparison helpers
|
// Comparison helpers
|
||||||
$this->add('ifAny', new Comparison\IfAnyHelper());
|
$this->add('ifAny', new Comparison\IfAnyHelper());
|
||||||
$this->add('ifEqual', new Comparison\IfEqualHelper());
|
$this->add('ifEqual', new Comparison\IfEqualHelper());
|
||||||
|
88
tests/Collection/FirstHelperTest.php
Normal file
88
tests/Collection/FirstHelperTest.php
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of Handlebars.php Helpers Set
|
||||||
|
*
|
||||||
|
* (c) Dmitriy Simushev <simushevds@gmail.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace JustBlackBird\HandlebarsHelpers\Tests\Collection;
|
||||||
|
|
||||||
|
use JustBlackBird\HandlebarsHelpers\Collection\FirstHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for "first" helper.
|
||||||
|
*
|
||||||
|
* @author Dmitriy Simushev <simushevds@gmail.com>
|
||||||
|
*/
|
||||||
|
class FirstHelperTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Tests that the first item returned.
|
||||||
|
*
|
||||||
|
* @dataProvider collectionsProvider
|
||||||
|
*/
|
||||||
|
public function testFirstItem($collection, $result)
|
||||||
|
{
|
||||||
|
$helpers = new \Handlebars\Helpers(array('first' => new FirstHelper()));
|
||||||
|
$engine = new \Handlebars\Handlebars(array('helpers' => $helpers));
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
$engine->render(
|
||||||
|
'{{first collection}}',
|
||||||
|
array('collection' => $collection)
|
||||||
|
),
|
||||||
|
$result
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A data provider for testFirstItem method.
|
||||||
|
*/
|
||||||
|
public function collectionsProvider()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
// Test arrays with numeric keys
|
||||||
|
array(array('a', 'b', 'c'), 'a'),
|
||||||
|
array(array('z'), 'z'),
|
||||||
|
// Test associative arrays
|
||||||
|
array(array('a' => '10', 'b' => '11', 'c' => '12'), '10'),
|
||||||
|
array(array('f' => '15'), '15'),
|
||||||
|
// Test \Traversable instance
|
||||||
|
array(new \ArrayIterator(array('a', 'b', 'c')), 'a'),
|
||||||
|
array(new \ArrayIterator(array('z')), 'z'),
|
||||||
|
// Test empty collections
|
||||||
|
array(array(), false),
|
||||||
|
array(new \ArrayIterator(array()), false),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that exception is thrown if wrong number of arguments is used.
|
||||||
|
*
|
||||||
|
* @expectedException InvalidArgumentException
|
||||||
|
* @dataProvider wrongArgumentsProvider
|
||||||
|
*/
|
||||||
|
public function testArgumentsCount($template)
|
||||||
|
{
|
||||||
|
$helpers = new \Handlebars\Helpers(array('first' => new FirstHelper()));
|
||||||
|
$engine = new \Handlebars\Handlebars(array('helpers' => $helpers));
|
||||||
|
|
||||||
|
$engine->render($template, array());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A data provider for testArgumentsCount method.
|
||||||
|
*/
|
||||||
|
public function wrongArgumentsProvider()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
// Not enough arguments
|
||||||
|
array('{{first}}'),
|
||||||
|
// Too much arguments
|
||||||
|
array('{{first "Arg" "ANOTHER ARG"}}'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
45
tests/Collection/HelpersTest.php
Normal file
45
tests/Collection/HelpersTest.php
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of Handlebars.php Helpers Set
|
||||||
|
*
|
||||||
|
* (c) Dmitriy Simushev <simushevds@gmail.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace JustBlackBird\HandlebarsHelpers\Tests\Collection;
|
||||||
|
|
||||||
|
use JustBlackBird\HandlebarsHelpers\Collection\Helpers;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for Collection Helpers Set.
|
||||||
|
*
|
||||||
|
* @author Dmitriy Simushev <simushevds@gmail.com>
|
||||||
|
*/
|
||||||
|
class HelpersTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Tests that all helpers in the set exist and have valid classes.
|
||||||
|
*
|
||||||
|
* @dataProvider helpersProvider
|
||||||
|
*/
|
||||||
|
public function testHelper($name, $class)
|
||||||
|
{
|
||||||
|
$helpers = new Helpers();
|
||||||
|
|
||||||
|
$this->assertTrue($helpers->has($name), sprintf('There is no "%s" helper', $name));
|
||||||
|
$this->assertInstanceOf($class, $helpers->{$name});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A data provider for testHelper method.
|
||||||
|
*/
|
||||||
|
public function helpersProvider()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
array('first', '\\JustBlackBird\\HandlebarsHelpers\\Collection\\FirstHelper'),
|
||||||
|
array('last', '\\JustBlackBird\\HandlebarsHelpers\\Collection\\LastHelper'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
88
tests/Collection/LastHelperTest.php
Normal file
88
tests/Collection/LastHelperTest.php
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of Handlebars.php Helpers Set
|
||||||
|
*
|
||||||
|
* (c) Dmitriy Simushev <simushevds@gmail.com>
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace JustBlackBird\HandlebarsHelpers\Tests\Collection;
|
||||||
|
|
||||||
|
use JustBlackBird\HandlebarsHelpers\Collection\LastHelper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test class for "last" helper.
|
||||||
|
*
|
||||||
|
* @author Dmitriy Simushev <simushevds@gmail.com>
|
||||||
|
*/
|
||||||
|
class LastHelperTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Tests that the last item returned.
|
||||||
|
*
|
||||||
|
* @dataProvider collectionsProvider
|
||||||
|
*/
|
||||||
|
public function testLastItem($collection, $result)
|
||||||
|
{
|
||||||
|
$helpers = new \Handlebars\Helpers(array('last' => new LastHelper()));
|
||||||
|
$engine = new \Handlebars\Handlebars(array('helpers' => $helpers));
|
||||||
|
|
||||||
|
$this->assertEquals(
|
||||||
|
$engine->render(
|
||||||
|
'{{last collection}}',
|
||||||
|
array('collection' => $collection)
|
||||||
|
),
|
||||||
|
$result
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A data provider for testLastItem method.
|
||||||
|
*/
|
||||||
|
public function collectionsProvider()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
// Test arrays with numeric keys
|
||||||
|
array(array('a', 'b', 'c'), 'c'),
|
||||||
|
array(array('z'), 'z'),
|
||||||
|
// Test associative arrays
|
||||||
|
array(array('a' => '10', 'b' => '11', 'c' => '12'), '12'),
|
||||||
|
array(array('f' => '15'), '15'),
|
||||||
|
// Test \Traversable instance
|
||||||
|
array(new \ArrayIterator(array('a', 'b', 'c')), 'c'),
|
||||||
|
array(new \ArrayIterator(array('z')), 'z'),
|
||||||
|
// Test empty collections
|
||||||
|
array(array(), false),
|
||||||
|
array(new \ArrayIterator(array()), false),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests that exception is thrown if wrong number of arguments is used.
|
||||||
|
*
|
||||||
|
* @expectedException InvalidArgumentException
|
||||||
|
* @dataProvider wrongArgumentsProvider
|
||||||
|
*/
|
||||||
|
public function testArgumentsCount($template)
|
||||||
|
{
|
||||||
|
$helpers = new \Handlebars\Helpers(array('last' => new LastHelper()));
|
||||||
|
$engine = new \Handlebars\Handlebars(array('helpers' => $helpers));
|
||||||
|
|
||||||
|
$engine->render($template, array());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A data provider for testArgumentsCount method.
|
||||||
|
*/
|
||||||
|
public function wrongArgumentsProvider()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
// Not enough arguments
|
||||||
|
array('{{last}}'),
|
||||||
|
// Too much arguments
|
||||||
|
array('{{last "Arg" "ANOTHER ARG"}}'),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -41,6 +41,10 @@ class HelpersTest extends \PHPUnit_Framework_TestCase
|
|||||||
// Date helpers
|
// Date helpers
|
||||||
array('formatDate', '\\JustBlackBird\\HandlebarsHelpers\\Date\\FormatDateHelper'),
|
array('formatDate', '\\JustBlackBird\\HandlebarsHelpers\\Date\\FormatDateHelper'),
|
||||||
|
|
||||||
|
// Collection helpers
|
||||||
|
array('first', '\\JustBlackBird\\HandlebarsHelpers\\Collection\\FirstHelper'),
|
||||||
|
array('last', '\\JustBlackBird\\HandlebarsHelpers\\Collection\\LastHelper'),
|
||||||
|
|
||||||
// Comparison helpers
|
// Comparison helpers
|
||||||
array('ifAny', '\\JustBlackBird\\HandlebarsHelpers\\Comparison\\IfAnyHelper'),
|
array('ifAny', '\\JustBlackBird\\HandlebarsHelpers\\Comparison\\IfAnyHelper'),
|
||||||
array('ifEqual', '\\JustBlackBird\\HandlebarsHelpers\\Comparison\\IfEqualHelper'),
|
array('ifEqual', '\\JustBlackBird\\HandlebarsHelpers\\Comparison\\IfEqualHelper'),
|
||||||
|
Loading…
Reference in New Issue
Block a user