summaryrefslogtreecommitdiff
path: root/lib/phptal/PHPTAL/Php/Attribute/TAL/Repeat.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/phptal/PHPTAL/Php/Attribute/TAL/Repeat.php')
-rw-r--r--lib/phptal/PHPTAL/Php/Attribute/TAL/Repeat.php99
1 files changed, 99 insertions, 0 deletions
diff --git a/lib/phptal/PHPTAL/Php/Attribute/TAL/Repeat.php b/lib/phptal/PHPTAL/Php/Attribute/TAL/Repeat.php
new file mode 100644
index 0000000..d0e4c2d
--- /dev/null
+++ b/lib/phptal/PHPTAL/Php/Attribute/TAL/Repeat.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * PHPTAL templating engine
+ *
+ * PHP Version 5
+ *
+ * @category HTML
+ * @package PHPTAL
+ * @author Laurent Bedubourg <lbedubourg@motion-twin.com>
+ * @author Kornel LesiƄski <kornel@aardvarkmedia.co.uk>
+ * @license http://www.gnu.org/licenses/lgpl.html GNU Lesser General Public License
+ * @version SVN: $Id$
+ * @link http://phptal.org/
+ */
+
+/**
+ * TAL Specifications 1.4
+ *
+ * argument ::= variable_name expression
+ * variable_name ::= Name
+ *
+ * Example:
+ *
+ * <p tal:repeat="txt python:'one', 'two', 'three'">
+ * <span tal:replace="txt" />
+ * </p>
+ * <table>
+ * <tr tal:repeat="item here/cart">
+ * <td tal:content="repeat/item/index">1</td>
+ * <td tal:content="item/description">Widget</td>
+ * <td tal:content="item/price">$1.50</td>
+ * </tr>
+ * </table>
+ *
+ * The following information is available from an Iterator:
+ *
+ * * index - repetition number, starting from zero.
+ * * number - repetition number, starting from one.
+ * * even - true for even-indexed repetitions (0, 2, 4, ...).
+ * * odd - true for odd-indexed repetitions (1, 3, 5, ...).
+ * * start - true for the starting repetition (index 0).
+ * * end - true for the ending, or final, repetition.
+ * * length - length of the sequence, which will be the total number of repetitions.
+ *
+ * * letter - count reps with lower-case letters: "a" - "z", "aa" - "az", "ba" - "bz", ..., "za" - "zz", "aaa" - "aaz", and so forth.
+ * * Letter - upper-case version of letter.
+ * * roman - count reps with lower-case roman numerals: "i", "ii", "iii", "iv", "v", "vi" ...
+ * * Roman - upper-case version of roman numerals.
+ * * first - true for the first item in a group - see note below
+ * * lasst - true for the last item in a group - see note below
+ *
+ * Note: first and last are intended for use with sorted sequences. They try to
+ * divide the sequence into group of items with the same value. If you provide
+ * a path, then the value obtained by following that path from a sequence item
+ * is used for grouping, otherwise the value of the item is used. You can
+ * provide the path by appending it to the path from the repeat variable,
+ * as in "repeat/item/first/color".
+ *
+ * PHPTAL: index, number, even, etc... will be stored in the
+ * $ctx->repeat->'item' object. Thus $ctx->repeat->item->odd
+ *
+ *
+ *
+ *
+ * @package PHPTAL
+ * @subpackage Php.attribute.tal
+ * @author Laurent Bedubourg <lbedubourg@motion-twin.com>
+ */
+class PHPTAL_Php_Attribute_TAL_Repeat extends PHPTAL_Php_Attribute
+{
+ private $var;
+ public function before(PHPTAL_Php_CodeWriter $codewriter)
+ {
+ $this->var = $codewriter->createTempVariable();
+
+ // alias to repeats handler to avoid calling extra getters on each variable access
+ $codewriter->doSetVar($this->var, '$ctx->repeat');
+
+ list($varName, $expression) = $this->parseSetExpression($this->expression);
+ $code = $codewriter->evaluateExpression($expression);
+
+ // instantiate controller using expression
+ $codewriter->doSetVar( $this->var.'->'.$varName, 'new PHPTAL_RepeatController('.$code.')'."\n" );
+
+ $codewriter->pushContext();
+
+ // Lets loop the iterator with a foreach construct
+ $codewriter->doForeach('$ctx->'.$varName, $this->var.'->'.$varName);
+ }
+
+ public function after(PHPTAL_Php_CodeWriter $codewriter)
+ {
+ $codewriter->doEnd('foreach');
+ $codewriter->popContext();
+
+ $codewriter->recycleTempVariable($this->var);
+ }
+}
+