added a batch filter
authorFabien Potencier <fabien.potencier@gmail.com>
Thu, 21 Feb 2013 06:38:58 +0000 (07:38 +0100)
committerFabien Potencier <fabien.potencier@gmail.com>
Thu, 21 Feb 2013 06:38:58 +0000 (07:38 +0100)
CHANGELOG
doc/filters/batch.test [new file with mode: 0644]
doc/filters/index.rst
lib/Twig/Extension/Core.php
test/Twig/Tests/Fixtures/filters/batch.test [new file with mode: 0644]

index 087f470..5cd3a65 100644 (file)
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,6 @@
 * 1.12.3 (2013-XX-XX)
 
- * n/a
+ * added a batch filter
 
 * 1.12.2 (2013-02-09)
 
diff --git a/doc/filters/batch.test b/doc/filters/batch.test
new file mode 100644 (file)
index 0000000..4366b57
--- /dev/null
@@ -0,0 +1,45 @@
+``batch``
+=========
+
+.. versionadded:: 1.12.3
+    The batch filter was added in Twig 1.12.3.
+
+The ``batch`` filter "batches" items by returning a list of lists with the
+given number of items. If you provide a second parameter, it is used to fill
+missing items:
+
+.. code-block:: jinja
+
+    {% set items = ['a', 'b', 'c', 'd', 'e', 'f', 'g'] %}
+
+    <table>
+    {% for row in items|batch(3, 'No item') %}
+      <tr>
+      {% for column in row %}
+        <td>{{ column }}</td>
+      {% endfor %}
+      </tr>
+    {% endfor %}
+    </table>
+
+The above example will be rendered as:
+
+.. code-block:: jinja
+
+    <table>
+      <tr>
+          <td>a</td>
+          <td>b</td>
+          <td>c</td>
+        </tr>
+      <tr>
+          <td>d</td>
+          <td>e</td>
+          <td>f</td>
+        </tr>
+      <tr>
+          <td>g</td>
+          <td>No item</td>
+          <td>No item</td>
+        </tr>
+    </table>
index 888693e..39b1d27 100644 (file)
@@ -33,3 +33,4 @@ Filters
     first
     last
     trim
+    batch
index 6a2e142..a856b59 100644 (file)
@@ -152,6 +152,7 @@ class Twig_Extension_Core extends Twig_Extension
             new Twig_SimpleFilter('split', 'twig_split_filter'),
             new Twig_SimpleFilter('sort', 'twig_sort_filter'),
             new Twig_SimpleFilter('merge', 'twig_array_merge'),
+            new Twig_SimpleFilter('batch', 'twig_array_batch'),
 
             // string/array filters
             new Twig_SimpleFilter('reverse', 'twig_reverse_filter', array('needs_environment' => true)),
@@ -1307,3 +1308,30 @@ function twig_constant($constant, $object = null)
 
     return constant($constant);
 }
+
+/**
+ * Batches item.
+ *
+ * @param array   $items An array of items
+ * @param integer $size  The size of the batch
+ * @param string  $fill  A string to fill missing items
+ *
+ * @return array
+ */
+function twig_array_batch($items, $size, $fill = null)
+{
+    if ($items instanceof Traversable) {
+        $items = iterator_to_array($items, false);
+    }
+
+    $result = array_chunk($items, $size, true);
+
+    if (null !== $fill) {
+        $last = count($result) - 1;
+        while (count($result[$last]) < $size) {
+            $result[$last][] = $fill;
+        }
+    }
+
+    return $result;
+}
diff --git a/test/Twig/Tests/Fixtures/filters/batch.test b/test/Twig/Tests/Fixtures/filters/batch.test
new file mode 100644 (file)
index 0000000..af996f2
--- /dev/null
@@ -0,0 +1,37 @@
+--TEST--
+"batch" filter
+--TEMPLATE--
+<table>
+{% for row in items|batch(3, '') %}
+  <tr>
+  {% for column in row %}
+    <td>{{ column }}</td>
+  {% endfor %}
+  </tr>
+{% endfor %}
+</table>
+--DATA--
+return array('items' => array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'))
+--EXPECT--
+<table>
+  <tr>
+      <td>a</td>
+      <td>b</td>
+      <td>c</td>
+    </tr>
+  <tr>
+      <td>d</td>
+      <td>e</td>
+      <td>f</td>
+    </tr>
+  <tr>
+      <td>g</td>
+      <td>h</td>
+      <td>i</td>
+    </tr>
+  <tr>
+      <td>j</td>
+      <td></td>
+      <td></td>
+    </tr>
+</table>