From d5bd9853ea993ca7b58220d34e8b239c38e6a48a Mon Sep 17 00:00:00 2001
From: Qiang Xue <qiang.xue@gmail.com>
Date: Tue, 25 Jun 2013 13:53:20 -0400
Subject: [PATCH] Added Html::ol() and Html::ul()

---
 framework/yii/helpers/base/Html.php       | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 tests/unit/framework/helpers/HtmlTest.php | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 121 insertions(+)

diff --git a/framework/yii/helpers/base/Html.php b/framework/yii/helpers/base/Html.php
index 043fc42..ee8910d 100644
--- a/framework/yii/helpers/base/Html.php
+++ b/framework/yii/helpers/base/Html.php
@@ -9,6 +9,7 @@ namespace yii\helpers\base;
 
 use Yii;
 use yii\base\InvalidParamException;
+use yii\helpers\ArrayHelper;
 use yii\web\Request;
 use yii\base\Model;
 
@@ -837,6 +838,70 @@ class Html
 	}
 
 	/**
+	 * Generates an unordered list.
+	 * @param array|\Traversable $items the items for generating the list. Each item generates a single list item.
+	 * Note that items will be automatically HTML encoded if `$options['encode']` is not set or true.
+	 * @param array $options options (name => config) for the radio button list. The following options are supported:
+	 *
+	 * - encode: boolean, whether to HTML-encode the items. Defaults to true.
+	 * - item: callable, a callback that is used to generate each individual list item.
+	 *   The signature of this callback must be:
+	 *
+	 * ~~~
+	 * function ($index, $item)
+	 * ~~~
+	 *
+	 * where $index is the array key corresponding to `$item` in `$items`. The callback should return
+	 * the whole list item tag.
+	 *
+	 * @return string the generated unordered list. An empty string is returned if `$items` is empty.
+	 */
+	public static function ul($items, $options = array())
+	{
+		if (empty($items)) {
+			return '';
+		}
+		$tag = isset($options['tag']) ? $options['tag'] : 'ul';
+		$encode = !isset($options['encode']) || $options['encode'];
+		$formatter = isset($options['item']) ? $options['item'] : null;
+		unset($options['tag'], $options['encode'], $options['item']);
+		$results = array();
+		foreach ($items as $index => $item) {
+			if ($formatter !== null) {
+				$results[] = call_user_func($formatter, $index, $item);
+			} else {
+				$results[] = '<li>' . ($encode ? static::encode($item) : $item) . '</li>';
+			}
+		}
+		return static::tag($tag, "\n" . implode("\n", $results) . "\n", $options);
+	}
+
+	/**
+	 * Generates an ordered list.
+	 * @param array|\Traversable $items the items for generating the list. Each item generates a single list item.
+	 * Note that items will be automatically HTML encoded if `$options['encode']` is not set or true.
+	 * @param array $options options (name => config) for the radio button list. The following options are supported:
+	 *
+	 * - encode: boolean, whether to HTML-encode the items. Defaults to true.
+	 * - item: callable, a callback that is used to generate each individual list item.
+	 *   The signature of this callback must be:
+	 *
+	 * ~~~
+	 * function ($index, $item)
+	 * ~~~
+	 *
+	 * where $index is the array key corresponding to `$item` in `$items`. The callback should return
+	 * the whole list item tag.
+	 *
+	 * @return string the generated ordered list. An empty string is returned if `$items` is empty.
+	 */
+	public static function ol($items, $options = array())
+	{
+		$options['tag'] = 'ol';
+		return static::ul($items, $options);
+	}
+
+	/**
 	 * Generates a label tag for the given model attribute.
 	 * The label text is the label associated with the attribute, obtained via [[Model::getAttributeLabel()]].
 	 * @param Model $model the model object
diff --git a/tests/unit/framework/helpers/HtmlTest.php b/tests/unit/framework/helpers/HtmlTest.php
index 14f7fc3..93eb68c 100644
--- a/tests/unit/framework/helpers/HtmlTest.php
+++ b/tests/unit/framework/helpers/HtmlTest.php
@@ -366,6 +366,62 @@ EOD;
 		)));
 	}
 
+	public function testUl()
+	{
+		$data = array(
+			1, 'abc', '<>',
+		);
+		$expected = <<<EOD
+<ul>
+<li>1</li>
+<li>abc</li>
+<li>&lt;&gt;</li>
+</ul>
+EOD;
+		$this->assertEqualsWithoutLE($expected, Html::ul($data));
+		$expected = <<<EOD
+<ul class="test">
+<li class="item-0">1</li>
+<li class="item-1">abc</li>
+<li class="item-2"><></li>
+</ul>
+EOD;
+		$this->assertEqualsWithoutLE($expected, Html::ul($data, array(
+			'class' => 'test',
+			'item' => function($index, $item) {
+				return "<li class=\"item-$index\">$item</li>";
+			}
+		)));
+	}
+
+	public function testOl()
+	{
+		$data = array(
+			1, 'abc', '<>',
+		);
+		$expected = <<<EOD
+<ol>
+<li>1</li>
+<li>abc</li>
+<li>&lt;&gt;</li>
+</ol>
+EOD;
+		$this->assertEqualsWithoutLE($expected, Html::ol($data));
+		$expected = <<<EOD
+<ol class="test">
+<li class="item-0">1</li>
+<li class="item-1">abc</li>
+<li class="item-2"><></li>
+</ol>
+EOD;
+		$this->assertEqualsWithoutLE($expected, Html::ol($data, array(
+			'class' => 'test',
+			'item' => function($index, $item) {
+				return "<li class=\"item-$index\">$item</li>";
+			}
+		)));
+	}
+
 	public function testRenderOptions()
 	{
 		$data = array(
--
libgit2 0.27.1