mirror of
https://github.com/yiisoft/yii2.git
synced 2025-11-16 14:29:30 +08:00
1129 lines
43 KiB
PHP
1129 lines
43 KiB
PHP
<?php
|
|
/**
|
|
* @link http://www.yiiframework.com/
|
|
* @copyright Copyright (c) 2008 Yii Software LLC
|
|
* @license http://www.yiiframework.com/license/
|
|
*/
|
|
|
|
namespace yii\util;
|
|
|
|
use Yii;
|
|
|
|
/**
|
|
* @author Qiang Xue <qiang.xue@gmail.com>
|
|
* @since 2.0
|
|
*/
|
|
class Html
|
|
{
|
|
/**
|
|
* @var boolean whether to close void (empty) elements. Defaults to true.
|
|
* @see voidElements
|
|
*/
|
|
public static $closeVoidElements = true;
|
|
/**
|
|
* @var array list of void elements (element name => 1)
|
|
* @see http://www.w3.org/TR/html-markup/syntax.html#void-element
|
|
*/
|
|
public static $voidElements = array(
|
|
'area' => 1,
|
|
'base' => 1,
|
|
'br' => 1,
|
|
'col' => 1,
|
|
'command' => 1,
|
|
'embed' => 1,
|
|
'hr' => 1,
|
|
'img' => 1,
|
|
'input' => 1,
|
|
'keygen' => 1,
|
|
'link' => 1,
|
|
'meta' => 1,
|
|
'param' => 1,
|
|
'source' => 1,
|
|
'track' => 1,
|
|
'wbr' => 1,
|
|
);
|
|
/**
|
|
* @var boolean whether to render special attributes value. Defaults to true. Can be set to false for HTML5.
|
|
*/
|
|
public static $renderSpecialAttributesValue = true;
|
|
|
|
|
|
/**
|
|
* Encodes special characters into HTML entities.
|
|
* The [[yii\base\Application::charset|application charset]] will be used for encoding.
|
|
* @param string $content the content to be encoded
|
|
* @return string the encoded content
|
|
* @see decode
|
|
* @see http://www.php.net/manual/en/function.htmlspecialchars.php
|
|
*/
|
|
public static function encode($content)
|
|
{
|
|
return htmlspecialchars($content, ENT_QUOTES, Yii::$app->charset);
|
|
}
|
|
|
|
/**
|
|
* Decodes special HTML entities back to the corresponding characters.
|
|
* This is the opposite of [[encode()]].
|
|
* @param string $content the content to be decoded
|
|
* @return string the decoded content
|
|
* @see encode
|
|
* @see http://www.php.net/manual/en/function.htmlspecialchars-decode.php
|
|
*/
|
|
public static function decode($content)
|
|
{
|
|
return htmlspecialchars_decode($content, ENT_QUOTES);
|
|
}
|
|
|
|
/**
|
|
* Generates a complete HTML tag.
|
|
* @param string $name the tag name
|
|
* @param string $content the content to be enclosed between the start and end tags. It will not be HTML-encoded.
|
|
* @param array $attributes the element attributes. The values will be HTML-encoded using [[encode()]].
|
|
* Attributes whose value is null will be ignored and not put in the tag returned.
|
|
* @return string the generated HTML tag
|
|
* @see beginTag
|
|
* @see endTag
|
|
*/
|
|
public static function tag($name, $content = '', $attributes = array())
|
|
{
|
|
$html = '<' . $name . static::renderAttributes($attributes);
|
|
if (isset(static::$voidElements[strtolower($name)])) {
|
|
return $html . (static::$closeVoidElements ? ' />' : '>');
|
|
} else {
|
|
return $html . ">$content</$name>";
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Generates a start tag.
|
|
* @param string $name the tag name
|
|
* @param array $attributes the element attributes. The values will be HTML-encoded using [[encode()]].
|
|
* Attributes whose value is null will be ignored and not put in the tag returned.
|
|
* @return string the generated start tag
|
|
* @see endTag
|
|
* @see tag
|
|
*/
|
|
public static function beginTag($name, $attributes = array())
|
|
{
|
|
return '<' . $name . static::renderAttributes($attributes) . '>';
|
|
}
|
|
|
|
/**
|
|
* Generates an end tag.
|
|
* @param string $name the tag name
|
|
* @return string the generated end tag
|
|
* @see beginTag
|
|
* @see tag
|
|
*/
|
|
public static function endTag($name)
|
|
{
|
|
return !static::$closeVoidElements && isset(static::$voidElements[strtolower($name)]) ? '' : "</$name>";
|
|
}
|
|
|
|
/**
|
|
* Encloses the given content within a CDATA tag.
|
|
* @param string $content the content to be enclosed within the CDATA tag
|
|
* @return string the CDATA tag with the enclosed content.
|
|
*/
|
|
public static function cdata($content)
|
|
{
|
|
return '<![CDATA[' . $content . ']]>';
|
|
}
|
|
|
|
/**
|
|
* Generates a style tag.
|
|
* @param string $content the style content
|
|
* @param array $attributes the attributes of the style tag. The values will be HTML-encoded using [[encode()]].
|
|
* Attributes whose value is null will be ignored and not put in the tag returned.
|
|
* If the attributes does not contain "type", a default one with value "text/css" will be used.
|
|
* @return string the generated style tag
|
|
*/
|
|
public static function style($content, $attributes = array())
|
|
{
|
|
if (!isset($attributes['type'])) {
|
|
$attributes['type'] = 'text/css';
|
|
}
|
|
return static::beginTag('style', $attributes)
|
|
. "\n/*<![CDATA[*/\n{$content}\n/*]]>*/\n"
|
|
. static::endTag('style');
|
|
}
|
|
|
|
/**
|
|
* Generates a script tag.
|
|
* @param string $content the script content
|
|
* @param array $attributes the attributes of the script tag. The values will be HTML-encoded using [[encode()]].
|
|
* Attributes whose value is null will be ignored and not put in the tag returned.
|
|
* If the attributes does not contain "type", a default one with value "text/javascript" will be used.
|
|
* @return string the generated script tag
|
|
*/
|
|
public static function script($content, $attributes = array())
|
|
{
|
|
if (!isset($attributes['type'])) {
|
|
$attributes['type'] = 'text/javascript';
|
|
}
|
|
return static::beginTag('script', $attributes)
|
|
. "\n/*<![CDATA[*/\n{$content}\n/*]]>*/\n"
|
|
. static::endTag('script');
|
|
}
|
|
|
|
/**
|
|
* Registers a 'refresh' meta tag.
|
|
* This method can be invoked anywhere in a view. It will register a 'refresh'
|
|
* meta tag with {@link CClientScript} so that the page can be refreshed in
|
|
* the specified seconds.
|
|
* @param integer $seconds the number of seconds to wait before refreshing the page
|
|
* @param string $url the URL to which the page should be redirected to. If empty, it means the current page.
|
|
* @since 1.1.1
|
|
*/
|
|
public static function refresh($seconds, $url = '')
|
|
{
|
|
$content = "$seconds";
|
|
if ($url !== '') {
|
|
$content .= ';' . static::normalizeUrl($url);
|
|
}
|
|
Yii::app()->clientScript->registerMetaTag($content, null, 'refresh');
|
|
}
|
|
|
|
/**
|
|
* Links to the specified CSS file.
|
|
* @param string $url the CSS URL
|
|
* @param string $media the media that this CSS should apply to.
|
|
* @return string the CSS link.
|
|
*/
|
|
public static function cssFile($url, $media = '')
|
|
{
|
|
return CHtml::linkTag('stylesheet', 'text/css', $url, $media !== '' ? $media : null);
|
|
}
|
|
|
|
/**
|
|
* Encloses the given JavaScript within a script tag.
|
|
* @param string $text the JavaScript to be enclosed
|
|
* @return string the enclosed JavaScript
|
|
*/
|
|
public static function script($text)
|
|
{
|
|
return "<script type=\"text/javascript\">\n/*<![CDATA[*/\n{$text}\n/*]]>*/\n</script>";
|
|
}
|
|
|
|
/**
|
|
* Includes a JavaScript file.
|
|
* @param string $url URL for the JavaScript file
|
|
* @return string the JavaScript file tag
|
|
*/
|
|
public static function scriptFile($url)
|
|
{
|
|
return '<script type="text/javascript" src="' . static::encode($url) . '"></script>';
|
|
}
|
|
|
|
/**
|
|
* Generates an opening form tag.
|
|
* This is a shortcut to {@link beginForm}.
|
|
* @param mixed $action the form action URL (see {@link normalizeUrl} for details about this parameter.)
|
|
* @param string $method form method (e.g. post, get)
|
|
* @param array $htmlOptions additional HTML attributes (see {@link tag}).
|
|
* @return string the generated form tag.
|
|
*/
|
|
public static function form($action = '', $method = 'post', $htmlOptions = array())
|
|
{
|
|
return static::beginForm($action, $method, $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates an opening form tag.
|
|
* Note, only the open tag is generated. A close tag should be placed manually
|
|
* at the end of the form.
|
|
* @param mixed $action the form action URL (see {@link normalizeUrl} for details about this parameter.)
|
|
* @param string $method form method (e.g. post, get)
|
|
* @param array $htmlOptions additional HTML attributes (see {@link tag}).
|
|
* @return string the generated form tag.
|
|
* @see endForm
|
|
*/
|
|
public static function beginForm($action = '', $method = 'post', $htmlOptions = array())
|
|
{
|
|
$htmlOptions['action'] = $url = static::normalizeUrl($action);
|
|
$htmlOptions['method'] = $method;
|
|
$form = static::tag('form', $htmlOptions, false, false);
|
|
$hiddens = array();
|
|
if (!strcasecmp($method, 'get') && ($pos = strpos($url, '?')) !== false) {
|
|
foreach (explode('&', substr($url, $pos + 1)) as $pair) {
|
|
if (($pos = strpos($pair, '=')) !== false) {
|
|
$hiddens[] = static::hiddenField(urldecode(substr($pair, 0, $pos)), urldecode(substr($pair, $pos + 1)), array('id' => false));
|
|
} else {
|
|
$hiddens[] = static::hiddenField(urldecode($pair), '', array('id' => false));
|
|
}
|
|
}
|
|
}
|
|
$request = Yii::app()->request;
|
|
if ($request->enableCsrfValidation && !strcasecmp($method, 'post')) {
|
|
$hiddens[] = static::hiddenField($request->csrfTokenName, $request->getCsrfToken(), array('id' => false));
|
|
}
|
|
if ($hiddens !== array()) {
|
|
$form .= "\n" . static::tag('div', array('style' => 'display:none'), implode("\n", $hiddens));
|
|
}
|
|
return $form;
|
|
}
|
|
|
|
/**
|
|
* Generates a closing form tag.
|
|
* @return string the generated tag
|
|
* @see beginForm
|
|
*/
|
|
public static function endForm()
|
|
{
|
|
return '</form>';
|
|
}
|
|
|
|
/**
|
|
* Generates a hyperlink tag.
|
|
* @param string $text link body. It will NOT be HTML-encoded. Therefore you can pass in HTML code such as an image tag.
|
|
* @param mixed $url a URL or an action route that can be used to create a URL.
|
|
* See {@link normalizeUrl} for more details about how to specify this parameter.
|
|
* @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special
|
|
* attributes are also recognized (see {@link clientChange} and {@link tag} for more details.)
|
|
* @return string the generated hyperlink
|
|
* @see normalizeUrl
|
|
* @see clientChange
|
|
*/
|
|
public static function link($text, $url = '#', $htmlOptions = array())
|
|
{
|
|
if ($url !== '') {
|
|
$htmlOptions['href'] = static::normalizeUrl($url);
|
|
}
|
|
static::clientChange('click', $htmlOptions);
|
|
return static::tag('a', $htmlOptions, $text);
|
|
}
|
|
|
|
/**
|
|
* Generates a mailto link.
|
|
* @param string $text link body. It will NOT be HTML-encoded. Therefore you can pass in HTML code such as an image tag.
|
|
* @param string $email email address. If this is empty, the first parameter (link body) will be treated as the email address.
|
|
* @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special
|
|
* attributes are also recognized (see {@link clientChange} and {@link tag} for more details.)
|
|
* @return string the generated mailto link
|
|
* @see clientChange
|
|
*/
|
|
public static function mailto($text, $email = '', $htmlOptions = array())
|
|
{
|
|
if ($email === '') {
|
|
$email = $text;
|
|
}
|
|
return static::link($text, 'mailto:' . $email, $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates an image tag.
|
|
* @param string $src the image URL
|
|
* @param string $alt the alternative text display
|
|
* @param array $htmlOptions additional HTML attributes (see {@link tag}).
|
|
* @return string the generated image tag
|
|
*/
|
|
public static function image($src, $alt = '', $htmlOptions = array())
|
|
{
|
|
$htmlOptions['src'] = $src;
|
|
$htmlOptions['alt'] = $alt;
|
|
return static::tag('img', $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates a button.
|
|
* @param string $label the button label
|
|
* @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special
|
|
* attributes are also recognized (see {@link clientChange} and {@link tag} for more details.)
|
|
* @return string the generated button tag
|
|
* @see clientChange
|
|
*/
|
|
public static function button($name, $label = 'button', $htmlOptions = array())
|
|
{
|
|
if (!isset($htmlOptions['name'])) {
|
|
if (!array_key_exists('name', $htmlOptions)) {
|
|
$htmlOptions['name'] = static::ID_PREFIX . static::$count++;
|
|
}
|
|
}
|
|
if (!isset($htmlOptions['type'])) {
|
|
$htmlOptions['type'] = 'button';
|
|
}
|
|
if (!isset($htmlOptions['value'])) {
|
|
$htmlOptions['value'] = $label;
|
|
}
|
|
static::clientChange('click', $htmlOptions);
|
|
return static::tag('input', $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates a button using HTML button tag.
|
|
* This method is similar to {@link button} except that it generates a 'button'
|
|
* tag instead of 'input' tag.
|
|
* @param string $label the button label. Note that this value will be directly inserted in the button element
|
|
* without being HTML-encoded.
|
|
* @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special
|
|
* attributes are also recognized (see {@link clientChange} and {@link tag} for more details.)
|
|
* @return string the generated button tag
|
|
* @see clientChange
|
|
*/
|
|
public static function htmlButton($label = 'button', $htmlOptions = array())
|
|
{
|
|
if (!isset($htmlOptions['name'])) {
|
|
$htmlOptions['name'] = static::ID_PREFIX . static::$count++;
|
|
}
|
|
if (!isset($htmlOptions['type'])) {
|
|
$htmlOptions['type'] = 'button';
|
|
}
|
|
static::clientChange('click', $htmlOptions);
|
|
return static::tag('button', $htmlOptions, $label);
|
|
}
|
|
|
|
/**
|
|
* Generates a submit button.
|
|
* @param string $label the button label
|
|
* @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special
|
|
* attributes are also recognized (see {@link clientChange} and {@link tag} for more details.)
|
|
* @return string the generated button tag
|
|
* @see clientChange
|
|
*/
|
|
public static function submitButton($label = 'submit', $htmlOptions = array())
|
|
{
|
|
$htmlOptions['type'] = 'submit';
|
|
return static::button($label, $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates a reset button.
|
|
* @param string $label the button label
|
|
* @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special
|
|
* attributes are also recognized (see {@link clientChange} and {@link tag} for more details.)
|
|
* @return string the generated button tag
|
|
* @see clientChange
|
|
*/
|
|
public static function resetButton($label = 'reset', $htmlOptions = array())
|
|
{
|
|
$htmlOptions['type'] = 'reset';
|
|
return static::button($label, $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates an image submit button.
|
|
* @param string $src the image URL
|
|
* @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special
|
|
* attributes are also recognized (see {@link clientChange} and {@link tag} for more details.)
|
|
* @return string the generated button tag
|
|
* @see clientChange
|
|
*/
|
|
public static function imageButton($src, $htmlOptions = array())
|
|
{
|
|
$htmlOptions['src'] = $src;
|
|
$htmlOptions['type'] = 'image';
|
|
return static::button('submit', $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates a link submit button.
|
|
* @param string $label the button label
|
|
* @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special
|
|
* attributes are also recognized (see {@link clientChange} and {@link tag} for more details.)
|
|
* @return string the generated button tag
|
|
* @see clientChange
|
|
*/
|
|
public static function linkButton($label = 'submit', $htmlOptions = array())
|
|
{
|
|
if (!isset($htmlOptions['submit'])) {
|
|
$htmlOptions['submit'] = isset($htmlOptions['href']) ? $htmlOptions['href'] : '';
|
|
}
|
|
return static::link($label, '#', $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates a label tag.
|
|
* @param string $label label text. Note, you should HTML-encode the text if needed.
|
|
* @param string $for the ID of the HTML element that this label is associated with.
|
|
* If this is false, the 'for' attribute for the label tag will not be rendered.
|
|
* @param array $htmlOptions additional HTML attributes.
|
|
* The following HTML option is recognized:
|
|
* <ul>
|
|
* <li>required: if this is set and is true, the label will be styled
|
|
* with CSS class 'required' (customizable with CHtml::$requiredCss),
|
|
* and be decorated with {@link CHtml::beforeRequiredLabel} and
|
|
* {@link CHtml::afterRequiredLabel}.</li>
|
|
* </ul>
|
|
* @return string the generated label tag
|
|
*/
|
|
public static function label($label, $for, $htmlOptions = array())
|
|
{
|
|
if ($for === false) {
|
|
unset($htmlOptions['for']);
|
|
} else {
|
|
$htmlOptions['for'] = $for;
|
|
}
|
|
if (isset($htmlOptions['required'])) {
|
|
if ($htmlOptions['required']) {
|
|
if (isset($htmlOptions['class'])) {
|
|
$htmlOptions['class'] .= ' ' . static::$requiredCss;
|
|
} else {
|
|
$htmlOptions['class'] = static::$requiredCss;
|
|
}
|
|
$label = static::$beforeRequiredLabel . $label . static::$afterRequiredLabel;
|
|
}
|
|
unset($htmlOptions['required']);
|
|
}
|
|
return static::tag('label', $htmlOptions, $label);
|
|
}
|
|
|
|
/**
|
|
* Generates a text field input.
|
|
* @param string $name the input name
|
|
* @param string $value the input value
|
|
* @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special
|
|
* attributes are also recognized (see {@link clientChange} and {@link tag} for more details.)
|
|
* @return string the generated input field
|
|
* @see clientChange
|
|
* @see inputField
|
|
*/
|
|
public static function textField($name, $value = '', $htmlOptions = array())
|
|
{
|
|
static::clientChange('change', $htmlOptions);
|
|
return static::inputField('text', $name, $value, $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates a hidden input.
|
|
* @param string $name the input name
|
|
* @param string $value the input value
|
|
* @param array $htmlOptions additional HTML attributes (see {@link tag}).
|
|
* @return string the generated input field
|
|
* @see inputField
|
|
*/
|
|
public static function hiddenField($name, $value = '', $htmlOptions = array())
|
|
{
|
|
return static::inputField('hidden', $name, $value, $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates a password field input.
|
|
* @param string $name the input name
|
|
* @param string $value the input value
|
|
* @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special
|
|
* attributes are also recognized (see {@link clientChange} and {@link tag} for more details.)
|
|
* @return string the generated input field
|
|
* @see clientChange
|
|
* @see inputField
|
|
*/
|
|
public static function passwordField($name, $value = '', $htmlOptions = array())
|
|
{
|
|
static::clientChange('change', $htmlOptions);
|
|
return static::inputField('password', $name, $value, $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates a file input.
|
|
* Note, you have to set the enclosing form's 'enctype' attribute to be 'multipart/form-data'.
|
|
* After the form is submitted, the uploaded file information can be obtained via $_FILES[$name] (see
|
|
* PHP documentation).
|
|
* @param string $name the input name
|
|
* @param string $value the input value
|
|
* @param array $htmlOptions additional HTML attributes (see {@link tag}).
|
|
* @return string the generated input field
|
|
* @see inputField
|
|
*/
|
|
public static function fileField($name, $value = '', $htmlOptions = array())
|
|
{
|
|
return static::inputField('file', $name, $value, $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates a text area input.
|
|
* @param string $name the input name
|
|
* @param string $value the input value
|
|
* @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special
|
|
* attributes are also recognized (see {@link clientChange} and {@link tag} for more details.)
|
|
* @return string the generated text area
|
|
* @see clientChange
|
|
* @see inputField
|
|
*/
|
|
public static function textArea($name, $value = '', $htmlOptions = array())
|
|
{
|
|
$htmlOptions['name'] = $name;
|
|
if (!isset($htmlOptions['id'])) {
|
|
$htmlOptions['id'] = static::getIdByName($name);
|
|
} elseif ($htmlOptions['id'] === false) {
|
|
unset($htmlOptions['id']);
|
|
}
|
|
static::clientChange('change', $htmlOptions);
|
|
return static::tag('textarea', $htmlOptions, isset($htmlOptions['encode']) && !$htmlOptions['encode'] ? $value : static::encode($value));
|
|
}
|
|
|
|
/**
|
|
* Generates a radio button.
|
|
* @param string $name the input name
|
|
* @param boolean $checked whether the radio button is checked
|
|
* @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special
|
|
* attributes are also recognized (see {@link clientChange} and {@link tag} for more details.)
|
|
* Since version 1.1.2, a special option named 'uncheckValue' is available that can be used to specify
|
|
* the value returned when the radio button is not checked. When set, a hidden field is rendered so that
|
|
* when the radio button is not checked, we can still obtain the posted uncheck value.
|
|
* If 'uncheckValue' is not set or set to NULL, the hidden field will not be rendered.
|
|
* @return string the generated radio button
|
|
* @see clientChange
|
|
* @see inputField
|
|
*/
|
|
public static function radioButton($name, $checked = false, $htmlOptions = array())
|
|
{
|
|
if ($checked) {
|
|
$htmlOptions['checked'] = 'checked';
|
|
} else {
|
|
unset($htmlOptions['checked']);
|
|
}
|
|
$value = isset($htmlOptions['value']) ? $htmlOptions['value'] : 1;
|
|
static::clientChange('click', $htmlOptions);
|
|
|
|
if (array_key_exists('uncheckValue', $htmlOptions)) {
|
|
$uncheck = $htmlOptions['uncheckValue'];
|
|
unset($htmlOptions['uncheckValue']);
|
|
} else {
|
|
$uncheck = null;
|
|
}
|
|
|
|
if ($uncheck !== null) {
|
|
// add a hidden field so that if the radio button is not selected, it still submits a value
|
|
if (isset($htmlOptions['id']) && $htmlOptions['id'] !== false) {
|
|
$uncheckOptions = array('id' => static::ID_PREFIX . $htmlOptions['id']);
|
|
} else {
|
|
$uncheckOptions = array('id' => false);
|
|
}
|
|
$hidden = static::hiddenField($name, $uncheck, $uncheckOptions);
|
|
} else {
|
|
$hidden = '';
|
|
}
|
|
|
|
// add a hidden field so that if the radio button is not selected, it still submits a value
|
|
return $hidden . static::inputField('radio', $name, $value, $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates a check box.
|
|
* @param string $name the input name
|
|
* @param boolean $checked whether the check box is checked
|
|
* @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special
|
|
* attributes are also recognized (see {@link clientChange} and {@link tag} for more details.)
|
|
* Since version 1.1.2, a special option named 'uncheckValue' is available that can be used to specify
|
|
* the value returned when the checkbox is not checked. When set, a hidden field is rendered so that
|
|
* when the checkbox is not checked, we can still obtain the posted uncheck value.
|
|
* If 'uncheckValue' is not set or set to NULL, the hidden field will not be rendered.
|
|
* @return string the generated check box
|
|
* @see clientChange
|
|
* @see inputField
|
|
*/
|
|
public static function checkBox($name, $checked = false, $htmlOptions = array())
|
|
{
|
|
if ($checked) {
|
|
$htmlOptions['checked'] = 'checked';
|
|
} else {
|
|
unset($htmlOptions['checked']);
|
|
}
|
|
$value = isset($htmlOptions['value']) ? $htmlOptions['value'] : 1;
|
|
static::clientChange('click', $htmlOptions);
|
|
|
|
if (array_key_exists('uncheckValue', $htmlOptions)) {
|
|
$uncheck = $htmlOptions['uncheckValue'];
|
|
unset($htmlOptions['uncheckValue']);
|
|
} else {
|
|
$uncheck = null;
|
|
}
|
|
|
|
if ($uncheck !== null) {
|
|
// add a hidden field so that if the check box is not checked, it still submits a value
|
|
if (isset($htmlOptions['id']) && $htmlOptions['id'] !== false) {
|
|
$uncheckOptions = array('id' => static::ID_PREFIX . $htmlOptions['id']);
|
|
} else {
|
|
$uncheckOptions = array('id' => false);
|
|
}
|
|
$hidden = static::hiddenField($name, $uncheck, $uncheckOptions);
|
|
} else {
|
|
$hidden = '';
|
|
}
|
|
|
|
// add a hidden field so that if the check box is not checked, it still submits a value
|
|
return $hidden . static::inputField('checkbox', $name, $value, $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates a drop down list.
|
|
* @param string $name the input name
|
|
* @param string $select the selected value
|
|
* @param array $data data for generating the list options (value=>display).
|
|
* You may use {@link listData} to generate this data.
|
|
* Please refer to {@link listOptions} on how this data is used to generate the list options.
|
|
* Note, the values and labels will be automatically HTML-encoded by this method.
|
|
* @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special
|
|
* attributes are recognized. See {@link clientChange} and {@link tag} for more details.
|
|
* In addition, the following options are also supported specifically for dropdown list:
|
|
* <ul>
|
|
* <li>encode: boolean, specifies whether to encode the values. Defaults to true.</li>
|
|
* <li>prompt: string, specifies the prompt text shown as the first list option. Its value is empty. Note, the prompt text will NOT be HTML-encoded.</li>
|
|
* <li>empty: string, specifies the text corresponding to empty selection. Its value is empty.
|
|
* The 'empty' option can also be an array of value-label pairs.
|
|
* Each pair will be used to render a list option at the beginning. Note, the text label will NOT be HTML-encoded.</li>
|
|
* <li>options: array, specifies additional attributes for each OPTION tag.
|
|
* The array keys must be the option values, and the array values are the extra
|
|
* OPTION tag attributes in the name-value pairs. For example,
|
|
* <pre>
|
|
* array(
|
|
* 'value1'=>array('disabled'=>true, 'label'=>'value 1'),
|
|
* 'value2'=>array('label'=>'value 2'),
|
|
* );
|
|
* </pre>
|
|
* </li>
|
|
* </ul>
|
|
* Since 1.1.13, a special option named 'unselectValue' is available. It can be used to set the value
|
|
* that will be returned when no option is selected in multiple mode. When set, a hidden field is
|
|
* rendered so that if no option is selected in multiple mode, we can still obtain the posted
|
|
* unselect value. If 'unselectValue' is not set or set to NULL, the hidden field will not be rendered.
|
|
* @return string the generated drop down list
|
|
* @see clientChange
|
|
* @see inputField
|
|
* @see listData
|
|
*/
|
|
public static function dropDownList($name, $select, $data, $htmlOptions = array())
|
|
{
|
|
$htmlOptions['name'] = $name;
|
|
|
|
if (!isset($htmlOptions['id'])) {
|
|
$htmlOptions['id'] = static::getIdByName($name);
|
|
} elseif ($htmlOptions['id'] === false) {
|
|
unset($htmlOptions['id']);
|
|
}
|
|
|
|
static::clientChange('change', $htmlOptions);
|
|
$options = "\n" . static::listOptions($select, $data, $htmlOptions);
|
|
$hidden = '';
|
|
|
|
if (isset($htmlOptions['multiple'])) {
|
|
if (substr($htmlOptions['name'], -2) !== '[]') {
|
|
$htmlOptions['name'] .= '[]';
|
|
}
|
|
|
|
if (isset($htmlOptions['unselectValue'])) {
|
|
$hiddenOptions = isset($htmlOptions['id']) ? array('id' => static::ID_PREFIX . $htmlOptions['id']) : array('id' => false);
|
|
$hidden = static::hiddenField(substr($htmlOptions['name'], 0, -2), $htmlOptions['unselectValue'], $hiddenOptions);
|
|
unset($htmlOptions['unselectValue']);
|
|
}
|
|
}
|
|
// add a hidden field so that if the option is not selected, it still submits a value
|
|
return $hidden . static::tag('select', $htmlOptions, $options);
|
|
}
|
|
|
|
/**
|
|
* Generates a list box.
|
|
* @param string $name the input name
|
|
* @param mixed $select the selected value(s). This can be either a string for single selection or an array for multiple selections.
|
|
* @param array $data data for generating the list options (value=>display)
|
|
* You may use {@link listData} to generate this data.
|
|
* Please refer to {@link listOptions} on how this data is used to generate the list options.
|
|
* Note, the values and labels will be automatically HTML-encoded by this method.
|
|
* @param array $htmlOptions additional HTML attributes. Besides normal HTML attributes, a few special
|
|
* attributes are also recognized. See {@link clientChange} and {@link tag} for more details.
|
|
* In addition, the following options are also supported specifically for list box:
|
|
* <ul>
|
|
* <li>encode: boolean, specifies whether to encode the values. Defaults to true.</li>
|
|
* <li>prompt: string, specifies the prompt text shown as the first list option. Its value is empty. Note, the prompt text will NOT be HTML-encoded.</li>
|
|
* <li>empty: string, specifies the text corresponding to empty selection. Its value is empty.
|
|
* The 'empty' option can also be an array of value-label pairs.
|
|
* Each pair will be used to render a list option at the beginning. Note, the text label will NOT be HTML-encoded.</li>
|
|
* <li>options: array, specifies additional attributes for each OPTION tag.
|
|
* The array keys must be the option values, and the array values are the extra
|
|
* OPTION tag attributes in the name-value pairs. For example,
|
|
* <pre>
|
|
* array(
|
|
* 'value1'=>array('disabled'=>true, 'label'=>'value 1'),
|
|
* 'value2'=>array('label'=>'value 2'),
|
|
* );
|
|
* </pre>
|
|
* </li>
|
|
* </ul>
|
|
* @return string the generated list box
|
|
* @see clientChange
|
|
* @see inputField
|
|
* @see listData
|
|
*/
|
|
public static function listBox($name, $select, $data, $htmlOptions = array())
|
|
{
|
|
if (!isset($htmlOptions['size'])) {
|
|
$htmlOptions['size'] = 4;
|
|
}
|
|
if (isset($htmlOptions['multiple'])) {
|
|
if (substr($name, -2) !== '[]') {
|
|
$name .= '[]';
|
|
}
|
|
}
|
|
return static::dropDownList($name, $select, $data, $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates a check box list.
|
|
* A check box list allows multiple selection, like {@link listBox}.
|
|
* As a result, the corresponding POST value is an array.
|
|
* @param string $name name of the check box list. You can use this name to retrieve
|
|
* the selected value(s) once the form is submitted.
|
|
* @param mixed $select selection of the check boxes. This can be either a string
|
|
* for single selection or an array for multiple selections.
|
|
* @param array $data value-label pairs used to generate the check box list.
|
|
* Note, the values will be automatically HTML-encoded, while the labels will not.
|
|
* @param array $htmlOptions additional HTML options. The options will be applied to
|
|
* each checkbox input. The following special options are recognized:
|
|
* <ul>
|
|
* <li>template: string, specifies how each checkbox is rendered. Defaults
|
|
* to "{input} {label}", where "{input}" will be replaced by the generated
|
|
* check box input tag while "{label}" be replaced by the corresponding check box label.</li>
|
|
* <li>separator: string, specifies the string that separates the generated check boxes.</li>
|
|
* <li>checkAll: string, specifies the label for the "check all" checkbox.
|
|
* If this option is specified, a 'check all' checkbox will be displayed. Clicking on
|
|
* this checkbox will cause all checkboxes checked or unchecked.</li>
|
|
* <li>checkAllLast: boolean, specifies whether the 'check all' checkbox should be
|
|
* displayed at the end of the checkbox list. If this option is not set (default)
|
|
* or is false, the 'check all' checkbox will be displayed at the beginning of
|
|
* the checkbox list.</li>
|
|
* <li>labelOptions: array, specifies the additional HTML attributes to be rendered
|
|
* for every label tag in the list.</li>
|
|
* <li>container: string, specifies the checkboxes enclosing tag. Defaults to 'span'.
|
|
* If the value is an empty string, no enclosing tag will be generated</li>
|
|
* <li>baseID: string, specifies the base ID prefix to be used for checkboxes in the list.
|
|
* This option is available since version 1.1.13.</li>
|
|
* </ul>
|
|
* @return string the generated check box list
|
|
*/
|
|
public static function checkBoxList($name, $select, $data, $htmlOptions = array())
|
|
{
|
|
$template = isset($htmlOptions['template']) ? $htmlOptions['template'] : '{input} {label}';
|
|
$separator = isset($htmlOptions['separator']) ? $htmlOptions['separator'] : "<br/>\n";
|
|
$container = isset($htmlOptions['container']) ? $htmlOptions['container'] : 'span';
|
|
unset($htmlOptions['template'], $htmlOptions['separator'], $htmlOptions['container']);
|
|
|
|
if (substr($name, -2) !== '[]') {
|
|
$name .= '[]';
|
|
}
|
|
|
|
if (isset($htmlOptions['checkAll'])) {
|
|
$checkAllLabel = $htmlOptions['checkAll'];
|
|
$checkAllLast = isset($htmlOptions['checkAllLast']) && $htmlOptions['checkAllLast'];
|
|
}
|
|
unset($htmlOptions['checkAll'], $htmlOptions['checkAllLast']);
|
|
|
|
$labelOptions = isset($htmlOptions['labelOptions']) ? $htmlOptions['labelOptions'] : array();
|
|
unset($htmlOptions['labelOptions']);
|
|
|
|
$items = array();
|
|
$baseID = isset($htmlOptions['baseID']) ? $htmlOptions['baseID'] : static::getIdByName($name);
|
|
unset($htmlOptions['baseID']);
|
|
$id = 0;
|
|
$checkAll = true;
|
|
|
|
foreach ($data as $value => $label) {
|
|
$checked = !is_array($select) && !strcmp($value, $select) || is_array($select) && in_array($value, $select);
|
|
$checkAll = $checkAll && $checked;
|
|
$htmlOptions['value'] = $value;
|
|
$htmlOptions['id'] = $baseID . '_' . $id++;
|
|
$option = static::checkBox($name, $checked, $htmlOptions);
|
|
$label = static::label($label, $htmlOptions['id'], $labelOptions);
|
|
$items[] = strtr($template, array('{input}' => $option, '{label}' => $label));
|
|
}
|
|
|
|
if (isset($checkAllLabel)) {
|
|
$htmlOptions['value'] = 1;
|
|
$htmlOptions['id'] = $id = $baseID . '_all';
|
|
$option = static::checkBox($id, $checkAll, $htmlOptions);
|
|
$label = static::label($checkAllLabel, $id, $labelOptions);
|
|
$item = strtr($template, array('{input}' => $option, '{label}' => $label));
|
|
if ($checkAllLast) {
|
|
$items[] = $item;
|
|
} else {
|
|
array_unshift($items, $item);
|
|
}
|
|
$name = strtr($name, array('[' => '\\[', ']' => '\\]'));
|
|
$js = <<<EOD
|
|
jQuery('#$id').click(function() {
|
|
jQuery("input[name='$name']").prop('checked', this.checked);
|
|
});
|
|
jQuery("input[name='$name']").click(function() {
|
|
jQuery('#$id').prop('checked', !jQuery("input[name='$name']:not(:checked)").length);
|
|
});
|
|
jQuery('#$id').prop('checked', !jQuery("input[name='$name']:not(:checked)").length);
|
|
EOD;
|
|
$cs = Yii::app()->getClientScript();
|
|
$cs->registerCoreScript('jquery');
|
|
$cs->registerScript($id, $js);
|
|
}
|
|
|
|
if (empty($container)) {
|
|
return implode($separator, $items);
|
|
} else {
|
|
return static::tag($container, array('id' => $baseID), implode($separator, $items));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Generates a radio button list.
|
|
* A radio button list is like a {@link checkBoxList check box list}, except that
|
|
* it only allows single selection.
|
|
* @param string $name name of the radio button list. You can use this name to retrieve
|
|
* the selected value(s) once the form is submitted.
|
|
* @param string $select selection of the radio buttons.
|
|
* @param array $data value-label pairs used to generate the radio button list.
|
|
* Note, the values will be automatically HTML-encoded, while the labels will not.
|
|
* @param array $htmlOptions additional HTML options. The options will be applied to
|
|
* each radio button input. The following special options are recognized:
|
|
* <ul>
|
|
* <li>template: string, specifies how each radio button is rendered. Defaults
|
|
* to "{input} {label}", where "{input}" will be replaced by the generated
|
|
* radio button input tag while "{label}" will be replaced by the corresponding radio button label.</li>
|
|
* <li>separator: string, specifies the string that separates the generated radio buttons. Defaults to new line (<br/>).</li>
|
|
* <li>labelOptions: array, specifies the additional HTML attributes to be rendered
|
|
* for every label tag in the list.</li>
|
|
* <li>container: string, specifies the radio buttons enclosing tag. Defaults to 'span'.
|
|
* If the value is an empty string, no enclosing tag will be generated</li>
|
|
* <li>baseID: string, specifies the base ID prefix to be used for radio buttons in the list.
|
|
* This option is available since version 1.1.13.</li>
|
|
* </ul>
|
|
* @return string the generated radio button list
|
|
*/
|
|
public static function radioButtonList($name, $select, $data, $htmlOptions = array())
|
|
{
|
|
$template = isset($htmlOptions['template']) ? $htmlOptions['template'] : '{input} {label}';
|
|
$separator = isset($htmlOptions['separator']) ? $htmlOptions['separator'] : "<br/>\n";
|
|
$container = isset($htmlOptions['container']) ? $htmlOptions['container'] : 'span';
|
|
unset($htmlOptions['template'], $htmlOptions['separator'], $htmlOptions['container']);
|
|
|
|
$labelOptions = isset($htmlOptions['labelOptions']) ? $htmlOptions['labelOptions'] : array();
|
|
unset($htmlOptions['labelOptions']);
|
|
|
|
$items = array();
|
|
$baseID = isset($htmlOptions['baseID']) ? $htmlOptions['baseID'] : static::getIdByName($name);
|
|
unset($htmlOptions['baseID']);
|
|
$id = 0;
|
|
foreach ($data as $value => $label) {
|
|
$checked = !strcmp($value, $select);
|
|
$htmlOptions['value'] = $value;
|
|
$htmlOptions['id'] = $baseID . '_' . $id++;
|
|
$option = static::radioButton($name, $checked, $htmlOptions);
|
|
$label = static::label($label, $htmlOptions['id'], $labelOptions);
|
|
$items[] = strtr($template, array('{input}' => $option, '{label}' => $label));
|
|
}
|
|
if (empty($container)) {
|
|
return implode($separator, $items);
|
|
} else {
|
|
return static::tag($container, array('id' => $baseID), implode($separator, $items));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Normalizes the input parameter to be a valid URL.
|
|
*
|
|
* If the input parameter is an empty string, the currently requested URL will be returned.
|
|
*
|
|
* If the input parameter is a non-empty string, it is treated as a valid URL and will
|
|
* be returned without any change.
|
|
*
|
|
* If the input parameter is an array, it is treated as a controller route and a list of
|
|
* GET parameters, and the {@link CController::createUrl} method will be invoked to
|
|
* create a URL. In this case, the first array element refers to the controller route,
|
|
* and the rest key-value pairs refer to the additional GET parameters for the URL.
|
|
* For example, <code>array('post/list', 'page'=>3)</code> may be used to generate the URL
|
|
* <code>/index.php?r=post/list&page=3</code>.
|
|
*
|
|
* @param mixed $url the parameter to be used to generate a valid URL
|
|
* @return string the normalized URL
|
|
*/
|
|
public static function normalizeUrl($url)
|
|
{
|
|
if (is_array($url)) {
|
|
if (isset($url[0])) {
|
|
if (($c = Yii::app()->getController()) !== null) {
|
|
$url = $c->createUrl($url[0], array_splice($url, 1));
|
|
} else {
|
|
$url = Yii::app()->createUrl($url[0], array_splice($url, 1));
|
|
}
|
|
} else {
|
|
$url = '';
|
|
}
|
|
}
|
|
return $url === '' ? Yii::app()->getRequest()->getUrl() : $url;
|
|
}
|
|
|
|
/**
|
|
* Generates an input HTML tag.
|
|
* This method generates an input HTML tag based on the given input name and value.
|
|
* @param string $type the input type (e.g. 'text', 'radio')
|
|
* @param string $name the input name
|
|
* @param string $value the input value
|
|
* @param array $htmlOptions additional HTML attributes for the HTML tag (see {@link tag}).
|
|
* @return string the generated input tag
|
|
*/
|
|
protected static function inputField($type, $name, $value, $htmlOptions)
|
|
{
|
|
$htmlOptions['type'] = $type;
|
|
$htmlOptions['value'] = $value;
|
|
$htmlOptions['name'] = $name;
|
|
if (!isset($htmlOptions['id'])) {
|
|
$htmlOptions['id'] = static::getIdByName($name);
|
|
} elseif ($htmlOptions['id'] === false) {
|
|
unset($htmlOptions['id']);
|
|
}
|
|
return static::tag('input', $htmlOptions);
|
|
}
|
|
|
|
/**
|
|
* Generates the list options.
|
|
* @param mixed $selection the selected value(s). This can be either a string for single selection or an array for multiple selections.
|
|
* @param array $listData the option data (see {@link listData})
|
|
* @param array $htmlOptions additional HTML attributes. The following two special attributes are recognized:
|
|
* <ul>
|
|
* <li>encode: boolean, specifies whether to encode the values. Defaults to true.</li>
|
|
* <li>prompt: string, specifies the prompt text shown as the first list option. Its value is empty. Note, the prompt text will NOT be HTML-encoded.</li>
|
|
* <li>empty: string, specifies the text corresponding to empty selection. Its value is empty.
|
|
* The 'empty' option can also be an array of value-label pairs.
|
|
* Each pair will be used to render a list option at the beginning. Note, the text label will NOT be HTML-encoded.</li>
|
|
* <li>options: array, specifies additional attributes for each OPTION tag.
|
|
* The array keys must be the option values, and the array values are the extra
|
|
* OPTION tag attributes in the name-value pairs. For example,
|
|
* <pre>
|
|
* array(
|
|
* 'value1'=>array('disabled'=>true, 'label'=>'value 1'),
|
|
* 'value2'=>array('label'=>'value 2'),
|
|
* );
|
|
* </pre>
|
|
* </li>
|
|
* <li>key: string, specifies the name of key attribute of the selection object(s).
|
|
* This is used when the selection is represented in terms of objects. In this case,
|
|
* the property named by the key option of the objects will be treated as the actual selection value.
|
|
* This option defaults to 'primaryKey', meaning using the 'primaryKey' property value of the objects in the selection.
|
|
* This option has been available since version 1.1.3.</li>
|
|
* </ul>
|
|
* @return string the generated list options
|
|
*/
|
|
public static function listOptions($selection, $listData, &$htmlOptions)
|
|
{
|
|
$raw = isset($htmlOptions['encode']) && !$htmlOptions['encode'];
|
|
$content = '';
|
|
if (isset($htmlOptions['prompt'])) {
|
|
$content .= '<option value="">' . strtr($htmlOptions['prompt'], array('<' => '<', '>' => '>')) . "</option>\n";
|
|
unset($htmlOptions['prompt']);
|
|
}
|
|
if (isset($htmlOptions['empty'])) {
|
|
if (!is_array($htmlOptions['empty'])) {
|
|
$htmlOptions['empty'] = array('' => $htmlOptions['empty']);
|
|
}
|
|
foreach ($htmlOptions['empty'] as $value => $label) {
|
|
$content .= '<option value="' . static::encode($value) . '">' . strtr($label, array('<' => '<', '>' => '>')) . "</option>\n";
|
|
}
|
|
unset($htmlOptions['empty']);
|
|
}
|
|
|
|
if (isset($htmlOptions['options'])) {
|
|
$options = $htmlOptions['options'];
|
|
unset($htmlOptions['options']);
|
|
} else {
|
|
$options = array();
|
|
}
|
|
|
|
$key = isset($htmlOptions['key']) ? $htmlOptions['key'] : 'primaryKey';
|
|
if (is_array($selection)) {
|
|
foreach ($selection as $i => $item) {
|
|
if (is_object($item)) {
|
|
$selection[$i] = $item->$key;
|
|
}
|
|
}
|
|
} elseif (is_object($selection)) {
|
|
$selection = $selection->$key;
|
|
}
|
|
|
|
foreach ($listData as $key => $value) {
|
|
if (is_array($value)) {
|
|
$content .= '<optgroup label="' . ($raw ? $key : static::encode($key)) . "\">\n";
|
|
$dummy = array('options' => $options);
|
|
if (isset($htmlOptions['encode'])) {
|
|
$dummy['encode'] = $htmlOptions['encode'];
|
|
}
|
|
$content .= static::listOptions($selection, $value, $dummy);
|
|
$content .= '</optgroup>' . "\n";
|
|
} else {
|
|
$attributes = array('value' => (string)$key, 'encode' => !$raw);
|
|
if (!is_array($selection) && !strcmp($key, $selection) || is_array($selection) && in_array($key, $selection)) {
|
|
$attributes['selected'] = 'selected';
|
|
}
|
|
if (isset($options[$key])) {
|
|
$attributes = array_merge($attributes, $options[$key]);
|
|
}
|
|
$content .= static::tag('option', $attributes, $raw ? (string)$value : static::encode((string)$value)) . "\n";
|
|
}
|
|
}
|
|
|
|
unset($htmlOptions['key']);
|
|
|
|
return $content;
|
|
}
|
|
|
|
/**
|
|
* Renders the HTML tag attributes.
|
|
* Since version 1.1.5, attributes whose value is null will not be rendered.
|
|
* Special attributes, such as 'checked', 'disabled', 'readonly', will be rendered
|
|
* properly based on their corresponding boolean value.
|
|
* @param array $attributes attributes to be rendered
|
|
* @return string the rendering result
|
|
*/
|
|
public static function renderAttributes($attributes)
|
|
{
|
|
static $specialAttributes = array(
|
|
'async' => 1,
|
|
'autofocus' => 1,
|
|
'autoplay' => 1,
|
|
'checked' => 1,
|
|
'controls' => 1,
|
|
'declare' => 1,
|
|
'default' => 1,
|
|
'defer' => 1,
|
|
'disabled' => 1,
|
|
'formnovalidate' => 1,
|
|
'hidden' => 1,
|
|
'ismap' => 1,
|
|
'loop' => 1,
|
|
'multiple' => 1,
|
|
'muted' => 1,
|
|
'nohref' => 1,
|
|
'noresize' => 1,
|
|
'novalidate' => 1,
|
|
'open' => 1,
|
|
'readonly' => 1,
|
|
'required' => 1,
|
|
'reversed' => 1,
|
|
'scoped' => 1,
|
|
'seamless' => 1,
|
|
'selected' => 1,
|
|
'typemustmatch' => 1,
|
|
);
|
|
|
|
if ($attributes === array()) {
|
|
return '';
|
|
}
|
|
|
|
$html = '';
|
|
if (isset($attributes['encode'])) {
|
|
$raw = !$attributes['encode'];
|
|
unset($attributes['encode']);
|
|
} else {
|
|
$raw = false;
|
|
}
|
|
|
|
foreach ($attributes as $name => $value) {
|
|
if (isset($specialAttributes[$name])) {
|
|
if ($value) {
|
|
$html .= ' ' . $name;
|
|
if (static::$renderSpecialAttributesValue) {
|
|
$html .= '="' . $name . '"';
|
|
}
|
|
}
|
|
} elseif ($value !== null) {
|
|
$html .= ' ' . $name . '="' . ($raw ? $value : static::encode($value)) . '"';
|
|
}
|
|
}
|
|
|
|
return $html;
|
|
}
|
|
}
|