2007-07-19 12:40:28 +02:00
|
|
|
<?php
|
2016-08-19 00:51:35 +02:00
|
|
|
|
|
|
|
namespace SilverStripe\Forms;
|
|
|
|
|
2017-05-17 07:40:13 +02:00
|
|
|
use BadMethodCallException;
|
2016-08-19 00:51:35 +02:00
|
|
|
use SilverStripe\Core\ClassInfo;
|
2017-05-17 07:40:13 +02:00
|
|
|
use SilverStripe\Core\Config\Configurable;
|
|
|
|
use SilverStripe\Core\Extensible;
|
|
|
|
use SilverStripe\Core\Injector\Injectable;
|
2016-08-19 00:51:35 +02:00
|
|
|
|
2007-07-19 12:40:28 +02:00
|
|
|
/**
|
|
|
|
* This class represents "transformations" of a form - such as making it printable or making it readonly.
|
|
|
|
* The idea is that sometimes you will want to make your own such transformations, and you shouldn't have
|
|
|
|
* to edit the underlying code to support this.
|
2014-08-15 08:53:05 +02:00
|
|
|
*
|
2007-07-19 12:40:28 +02:00
|
|
|
* The first step in creating a transformation is subclassing FormTransformation. After that, you have two
|
|
|
|
* ways of defining specific functionality:
|
|
|
|
* - Define performMyTransformation() methods on each applicable FormField() object.
|
|
|
|
* - Define transformFieldType($field) methods on your subclass of FormTransformation.
|
2014-08-15 08:53:05 +02:00
|
|
|
*
|
2007-07-19 12:40:28 +02:00
|
|
|
* To actually perform the transformation, call $form->transform(new MyTransformation());
|
|
|
|
*/
|
2017-05-17 07:40:13 +02:00
|
|
|
class FormTransformation
|
2016-11-29 00:31:16 +01:00
|
|
|
{
|
2017-05-17 07:40:13 +02:00
|
|
|
use Configurable;
|
|
|
|
use Injectable;
|
|
|
|
use Extensible;
|
|
|
|
|
|
|
|
public function __construct()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2016-11-29 00:31:16 +01:00
|
|
|
public function transform(FormField $field)
|
|
|
|
{
|
|
|
|
// Look for a performXXTransformation() method on the field itself.
|
|
|
|
// performReadonlyTransformation() is a pretty commonly applied method.
|
|
|
|
// Otherwise, look for a transformXXXField() method on this object.
|
|
|
|
// This is more commonly done in custom transformations
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-11-29 00:31:16 +01:00
|
|
|
// We iterate through each array simultaneously, looking at [0] of both, then [1] of both.
|
|
|
|
// This provides a more natural failover scheme.
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-11-29 00:31:16 +01:00
|
|
|
$transNames = array_reverse(array_map(
|
|
|
|
function ($name) {
|
|
|
|
return ClassInfo::shortName($name);
|
|
|
|
},
|
2017-05-17 07:40:13 +02:00
|
|
|
array_values(ClassInfo::ancestry($this))
|
2016-11-29 00:31:16 +01:00
|
|
|
));
|
|
|
|
$fieldClasses = array_reverse(array_map(
|
|
|
|
function ($name) {
|
|
|
|
return ClassInfo::shortName($name);
|
|
|
|
},
|
2017-05-17 07:40:13 +02:00
|
|
|
array_values(ClassInfo::ancestry($field))
|
2016-11-29 00:31:16 +01:00
|
|
|
));
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-11-29 00:31:16 +01:00
|
|
|
$len = max(sizeof($transNames), sizeof($fieldClasses));
|
|
|
|
for ($i=0; $i<$len; $i++) {
|
|
|
|
// This is lets fieldClasses be longer than transNames
|
|
|
|
if (!empty($transNames[$i])) {
|
|
|
|
$funcName = 'perform' . $transNames[$i];
|
|
|
|
if ($field->hasMethod($funcName)) {
|
|
|
|
//echo "<li>$field->class used $funcName";
|
|
|
|
return $field->$funcName($this);
|
|
|
|
}
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2016-11-29 00:31:16 +01:00
|
|
|
// And this one does the reverse.
|
|
|
|
if (!empty($fieldClasses[$i])) {
|
|
|
|
$funcName = 'transform' . $fieldClasses[$i];
|
|
|
|
if ($this->hasMethod($funcName)) {
|
|
|
|
//echo "<li>$field->class used $funcName";
|
|
|
|
return $this->$funcName($field);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2014-08-15 08:53:05 +02:00
|
|
|
|
2017-05-17 07:40:13 +02:00
|
|
|
$class = static::class;
|
|
|
|
$fieldClass = get_class($field);
|
|
|
|
throw new BadMethodCallException("FormTransformation:: Can't perform '{$class}' on '{$fieldClass}'");
|
2016-11-29 00:31:16 +01:00
|
|
|
}
|
2007-07-19 12:40:28 +02:00
|
|
|
}
|