1
0
www.mikescher.com/framework/web/form/CFormButtonElement.php

139 lines
4.4 KiB
PHP

<?php
/**
* CFormButtonElement class file.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.yiiframework.com/
* @copyright 2008-2013 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/
/**
* CFormButtonElement represents a form button element.
*
* CFormButtonElement can represent the following types of button based on {@link type} property:
* <ul>
* <li>htmlButton: a normal button generated using {@link CHtml::htmlButton}</li>
* <li>htmlReset a reset button generated using {@link CHtml::htmlButton}</li>
* <li>htmlSubmit: a submit button generated using {@link CHtml::htmlButton}</li>
* <li>submit: a submit button generated using {@link CHtml::submitButton}</li>
* <li>button: a normal button generated using {@link CHtml::button}</li>
* <li>image: an image button generated using {@link CHtml::imageButton}</li>
* <li>reset: a reset button generated using {@link CHtml::resetButton}</li>
* <li>link: a link button generated using {@link CHtml::linkButton}</li>
* </ul>
* The {@link type} property can also be a class name or a path alias to the class. In this case,
* the button is generated using a widget of the specified class. Note, the widget must
* have a property called "name".
*
* Because CFormElement is an ancestor class of CFormButtonElement, a value assigned to a non-existing property will be
* stored in {@link attributes} which will be passed as HTML attribute values to the {@link CHtml} method
* generating the button or initial values of the widget properties.
*
* @property string $on Scenario names separated by commas. Defaults to null.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @package system.web.form
* @since 1.1
*/
class CFormButtonElement extends CFormElement
{
/**
* @var array Core button types (alias=>CHtml method name)
*/
public static $coreTypes=array(
'htmlButton'=>'htmlButton',
'htmlSubmit'=>'htmlButton',
'htmlReset'=>'htmlButton',
'button'=>'button',
'submit'=>'submitButton',
'reset'=>'resetButton',
'image'=>'imageButton',
'link'=>'linkButton',
);
/**
* @var string the type of this button. This can be a class name, a path alias of a class name,
* or a button type alias (submit, button, image, reset, link, htmlButton, htmlSubmit, htmlReset).
*/
public $type;
/**
* @var string name of this button
*/
public $name;
/**
* @var string the label of this button. This property is ignored when a widget is used to generate the button.
*/
public $label;
private $_on;
/**
* Returns a value indicating under which scenarios this button is visible.
* If the value is empty, it means the button is visible under all scenarios.
* Otherwise, only when the model is in the scenario whose name can be found in
* this value, will the button be visible. See {@link CModel::scenario} for more
* information about model scenarios.
* @return string scenario names separated by commas. Defaults to null.
*/
public function getOn()
{
return $this->_on;
}
/**
* @param string $value scenario names separated by commas.
*/
public function setOn($value)
{
$this->_on=preg_split('/[\s,]+/',$value,-1,PREG_SPLIT_NO_EMPTY);
}
/**
* Returns this button.
* @return string the rendering result
*/
public function render()
{
$attributes=$this->attributes;
if(isset(self::$coreTypes[$this->type]))
{
$method=self::$coreTypes[$this->type];
if($method==='linkButton')
{
if(!isset($attributes['params'][$this->name]))
$attributes['params'][$this->name]=1;
}
elseif($method==='htmlButton')
{
$attributes['type']=$this->type==='htmlSubmit' ? 'submit' : ($this->type==='htmlReset' ? 'reset' : 'button');
$attributes['name']=$this->name;
}
else
$attributes['name']=$this->name;
if($method==='imageButton')
return CHtml::imageButton(isset($attributes['src']) ? $attributes['src'] : '',$attributes);
else
return CHtml::$method($this->label,$attributes);
}
else
{
$attributes['name']=$this->name;
ob_start();
$this->getParent()->getOwner()->widget($this->type, $attributes);
return ob_get_clean();
}
}
/**
* Evaluates the visibility of this element.
* This method will check the {@link on} property to see if
* the model is in a scenario that should have this string displayed.
* @return boolean whether this element is visible.
*/
protected function evaluateVisible()
{
return empty($this->_on) || in_array($this->getParent()->getModel()->getScenario(),$this->_on);
}
}