mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
97f22cbaa5
The API documentation for FormAction is currently broken: http://api.silverstripe.org/3/FormAction.html This is because there are unescaped tags in the class description. This fix changes the tag in the description to be escaped.
187 lines
3.9 KiB
PHP
187 lines
3.9 KiB
PHP
<?php
|
|
/**
|
|
* The action buttons are <input type="submit"> as well as <button> tags.
|
|
*
|
|
* Upon clicking the button below will redirect the user to doAction under the current controller.
|
|
*
|
|
* <code>
|
|
* new FormAction (
|
|
* // doAction has to be a defined controller member
|
|
* $action = "doAction",
|
|
* $title = "Submit button"
|
|
* )
|
|
* </code>
|
|
*
|
|
* @package forms
|
|
* @subpackage actions
|
|
*/
|
|
class FormAction extends FormField {
|
|
|
|
/**
|
|
* Action name, normally prefixed with 'action_'
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $action;
|
|
|
|
/**
|
|
* Enables the use of <button> instead of <input>
|
|
* in {@link Field()} - for more customizeable styling.
|
|
*
|
|
* @var boolean
|
|
*/
|
|
public $useButtonTag = false;
|
|
|
|
/**
|
|
* Literal button content, used when useButtonTag is true.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $buttonContent = null;
|
|
|
|
/**
|
|
* Create a new action button.
|
|
*
|
|
* @param string $action The method to call when the button is clicked
|
|
* @param string $title The label on the button. This should be plain text, not escaped as HTML.
|
|
* @param Form form The parent form, auto-set when the field is placed inside a form
|
|
*/
|
|
public function __construct($action, $title = "", $form = null) {
|
|
$this->action = "action_$action";
|
|
$this->setForm($form);
|
|
|
|
parent::__construct($this->action, $title);
|
|
}
|
|
|
|
/**
|
|
* Get the action name
|
|
*
|
|
* @return string
|
|
*/
|
|
public function actionName() {
|
|
return substr($this->name, 7);
|
|
}
|
|
|
|
/**
|
|
* Set the full action name, including action_
|
|
* This provides an opportunity to replace it with something else
|
|
*
|
|
* @param string $fullAction
|
|
* @return $this
|
|
*/
|
|
public function setFullAction($fullAction) {
|
|
$this->action = $fullAction;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @param array $properties
|
|
* @return HTMLText
|
|
*/
|
|
public function Field($properties = array()) {
|
|
$properties = array_merge(
|
|
$properties,
|
|
array(
|
|
'Name' => $this->action,
|
|
'Title' => ($this->description && !$this->useButtonTag) ? $this->description : $this->Title(),
|
|
'UseButtonTag' => $this->useButtonTag
|
|
)
|
|
);
|
|
|
|
return parent::Field($properties);
|
|
}
|
|
|
|
/**
|
|
* @param array $properties
|
|
* @return HTMLText
|
|
*/
|
|
public function FieldHolder($properties = array()) {
|
|
return $this->Field($properties);
|
|
}
|
|
|
|
public function Type() {
|
|
return 'action';
|
|
}
|
|
|
|
public function Title() {
|
|
$title = parent::Title();
|
|
|
|
// Remove this method override in 4.0
|
|
$decoded = Convert::xml2raw($title);
|
|
if($title && $decoded !== $title) {
|
|
Deprecation::notice(
|
|
'4.0',
|
|
'The FormAction title field should not be html encoded. Use buttonContent to set custom html instead'
|
|
);
|
|
return $decoded;
|
|
}
|
|
|
|
return $title;
|
|
}
|
|
|
|
public function getAttributes() {
|
|
$type = (isset($this->attributes['src'])) ? 'image' : 'submit';
|
|
|
|
return array_merge(
|
|
parent::getAttributes(),
|
|
array(
|
|
'disabled' => ($this->isReadonly() || $this->isDisabled()),
|
|
'value' => $this->Title(),
|
|
'type' => $type,
|
|
'title' => ($this->useButtonTag) ? $this->description : null,
|
|
)
|
|
);
|
|
}
|
|
|
|
/**
|
|
* Add content inside a button field.
|
|
*
|
|
* @param string $content
|
|
* @return $this
|
|
*/
|
|
public function setButtonContent($content) {
|
|
$this->buttonContent = (string) $content;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Gets the content inside the button field
|
|
*
|
|
* @return string
|
|
*/
|
|
public function getButtonContent() {
|
|
return $this->buttonContent;
|
|
}
|
|
|
|
/**
|
|
* Enable or disable the rendering of this action as a <button />
|
|
*
|
|
* @param boolean
|
|
* @return $this
|
|
*/
|
|
public function setUseButtonTag($bool) {
|
|
$this->useButtonTag = $bool;
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Determine if this action is rendered as a <button />
|
|
*
|
|
* @return boolean
|
|
*/
|
|
public function getUseButtonTag() {
|
|
return $this->useButtonTag;
|
|
}
|
|
|
|
/**
|
|
* Does not transform to readonly by purpose.
|
|
* Globally disabled buttons would break the CMS.
|
|
*/
|
|
public function performReadonlyTransformation() {
|
|
$clone = clone $this;
|
|
$clone->setReadonly(true);
|
|
return $clone;
|
|
}
|
|
|
|
}
|