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(