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[] = '
' . ($encode ? static::encode($item) : $item) . '';
+ }
+ }
+ 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 = <<
+1
+abc
+<>
+
+EOD;
+ $this->assertEqualsWithoutLE($expected, Html::ul($data));
+ $expected = <<
+1
+abc
+<>
+
+EOD;
+ $this->assertEqualsWithoutLE($expected, Html::ul($data, array(
+ 'class' => 'test',
+ 'item' => function($index, $item) {
+ return "$item";
+ }
+ )));
+ }
+
+ public function testOl()
+ {
+ $data = array(
+ 1, 'abc', '<>',
+ );
+ $expected = <<
+1
+abc
+<>
+
+EOD;
+ $this->assertEqualsWithoutLE($expected, Html::ol($data));
+ $expected = <<
+1
+abc
+<>
+
+EOD;
+ $this->assertEqualsWithoutLE($expected, Html::ol($data, array(
+ 'class' => 'test',
+ 'item' => function($index, $item) {
+ return "$item";
+ }
+ )));
+ }
+
public function testRenderOptions()
{
$data = array(