silverstripe-framework/src/Forms/ReadonlyField.php
2022-04-14 13:12:59 +12:00

113 lines
2.6 KiB
PHP

<?php
namespace SilverStripe\Forms;
/**
* Read-only field to display a non-editable value with a label.
* Consider using an {@link LabelField} if you just need a label-less
* value display.
*/
class ReadonlyField extends FormField
{
protected $readonly = true;
/**
* Include a hidden field in the HTML for the readonly field
* @var boolean
*/
protected $includeHiddenField = false;
protected $schemaDataType = FormField::SCHEMA_DATA_TYPE_TEXT;
/**
* If true, a hidden field will be included in the HTML for the readonly field.
*
* This can be useful if you need to pass the data through on the form submission, as
* long as it's okay than an attacker could change the data before it's submitted.
*
* This is disabled by default as it can introduce security holes if the data is not
* allowed to be modified by the user.
*
* @param boolean $includeHiddenField
* @return $this
*/
public function setIncludeHiddenField($includeHiddenField)
{
$this->includeHiddenField = $includeHiddenField;
return $this;
}
/**
* @return bool
*/
public function getIncludeHiddenField()
{
return $this->includeHiddenField;
}
public function performReadonlyTransformation()
{
return clone $this;
}
public function Type()
{
return 'readonly';
}
public function castingHelper($field)
{
// Get dynamic cast for 'Value' field
if (strcasecmp($field ?? '', 'Value') === 0) {
return $this->getValueCast();
}
// Fall back to default casting
return parent::castingHelper($field);
}
public function getSchemaStateDefaults()
{
$state = parent::getSchemaStateDefaults();
$state['value'] = $this->dataValue();
return $state;
}
/**
* @return mixed|string
*/
public function Value()
{
// Get raw value
$value = $this->dataValue();
if ($value) {
return $value;
}
// "none" text
$label = _t('SilverStripe\\Forms\\FormField.NONE', 'none');
return "<i>('{$label}')</i>";
}
/**
* Get custom cating helper for Value() field
*
* @return string
*/
public function getValueCast()
{
// Casting class for 'none' text
$value = $this->dataValue();
if (empty($value)) {
return 'HTMLFragment';
}
// Use default casting
$casting = $this->config()->get('casting');
return $casting['Value'];
}
}