Commit d5bd9853 by Qiang Xue

Added Html::ol() and Html::ul()

parent 3eccd850
...@@ -9,6 +9,7 @@ namespace yii\helpers\base; ...@@ -9,6 +9,7 @@ namespace yii\helpers\base;
use Yii; use Yii;
use yii\base\InvalidParamException; use yii\base\InvalidParamException;
use yii\helpers\ArrayHelper;
use yii\web\Request; use yii\web\Request;
use yii\base\Model; use yii\base\Model;
...@@ -837,6 +838,70 @@ class Html ...@@ -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. * Generates a label tag for the given model attribute.
* The label text is the label associated with the attribute, obtained via [[Model::getAttributeLabel()]]. * The label text is the label associated with the attribute, obtained via [[Model::getAttributeLabel()]].
* @param Model $model the model object * @param Model $model the model object
......
...@@ -366,6 +366,62 @@ EOD; ...@@ -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() public function testRenderOptions()
{ {
$data = array( $data = array(
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment