mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
ee5b4fd8d3
Introducing <Tabs> component based on react-bootstrap Better support for nested fields in FormBuilder Tweaks to get FormBuilder working with frameworktest BasicFieldsPage fields Added exception in FormBuilder when Component is defined but not found Added check in SingleSelectField for empty value before adding one in Added temporary workaround for CompositeFields with no name (another story to address the actual problem) Added asset_preview_height for File image preview, matches the defined CSS max-height Added documentation to DBFile::PreviewLink() method
169 lines
3.8 KiB
PHP
169 lines
3.8 KiB
PHP
<?php
|
|
|
|
namespace SilverStripe\Forms;
|
|
|
|
use InvalidArgumentException;
|
|
|
|
/**
|
|
* Lets you include a nested group of fields inside a template.
|
|
* This control gives you more flexibility over form layout.
|
|
*
|
|
* Note: the child fields within a field group aren't rendered using FieldHolder(). Instead,
|
|
* SmallFieldHolder() is called, which just prefixes $Field with a <label> tag, if the Title is set.
|
|
*
|
|
* <b>Usage</b>
|
|
*
|
|
* <code>
|
|
* FieldGroup::create(
|
|
* FieldGroup::create(
|
|
* HeaderField::create('FieldGroup 1'),
|
|
* TextField::create('Firstname')
|
|
* ),
|
|
* FieldGroup::create(
|
|
* HeaderField::create('FieldGroup 2'),
|
|
* TextField::create('Surname')
|
|
* )
|
|
* )
|
|
* </code>
|
|
*
|
|
* <b>Adding to existing FieldGroup instances</b>
|
|
*
|
|
* <code>
|
|
* function getCMSFields() {
|
|
* $fields = parent::getCMSFields();
|
|
*
|
|
* $fields->addFieldToTab(
|
|
* 'Root.Main',
|
|
* FieldGroup::create(
|
|
* TimeField::create("StartTime","What's the start time?"),
|
|
* TimeField::create("EndTime","What's the end time?")
|
|
* ),
|
|
* 'Content'
|
|
* );
|
|
*
|
|
* return $fields;
|
|
*
|
|
* }
|
|
* </code>
|
|
*
|
|
* <b>Setting a title to a FieldGroup</b>
|
|
*
|
|
* <code>
|
|
* $fields->addFieldToTab("Root.Main",
|
|
* FieldGroup::create(
|
|
* TimeField::create('StartTime','What's the start time?'),
|
|
* TimeField::create('EndTime', 'What's the end time?')
|
|
* )->setTitle('Time')
|
|
* );
|
|
* </code>
|
|
*/
|
|
class FieldGroup extends CompositeField {
|
|
|
|
protected $zebra;
|
|
|
|
/**
|
|
* Create a new field group.
|
|
*
|
|
* Accepts any number of arguments.
|
|
*
|
|
* @param mixed $titleOrField Either the field title, list of fields, or first field
|
|
* @param mixed ...$otherFields Subsequent fields or field list (if passing in title to $titleOrField)
|
|
*/
|
|
public function __construct($titleOrField = null, $otherFields = null) {
|
|
$title = null;
|
|
if(is_array($titleOrField) || $titleOrField instanceof FieldList) {
|
|
$fields = $titleOrField;
|
|
|
|
// This would be discarded otherwise
|
|
if($otherFields) {
|
|
throw new InvalidArgumentException(
|
|
'$otherFields is not accepted if passing in field list to $titleOrField'
|
|
);
|
|
}
|
|
|
|
} else if(is_array($otherFields) || $otherFields instanceof FieldList) {
|
|
$title = $titleOrField;
|
|
$fields = $otherFields;
|
|
|
|
} else {
|
|
$fields = func_get_args();
|
|
if(!is_object(reset($fields))) {
|
|
$title = array_shift($fields);
|
|
}
|
|
}
|
|
|
|
parent::__construct($fields);
|
|
|
|
if($title) {
|
|
$this->setTitle($title);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Returns the name (ID) for the element.
|
|
* In some cases the FieldGroup doesn't have a title, but we still want
|
|
* the ID / name to be set. This code, generates the ID from the nested children
|
|
*
|
|
* TODO this is temporary, and should be removed when FormTemplateHelper is updated to handle ID
|
|
* for CompositeFields with no name
|
|
*/
|
|
public function getName(){
|
|
if($this->name) {
|
|
return $this->name;
|
|
}
|
|
|
|
if(!$this->title) {
|
|
return parent::getName();
|
|
}
|
|
|
|
return preg_replace("/[^a-zA-Z0-9]+/", "", $this->title);
|
|
}
|
|
|
|
/**
|
|
* Set an odd/even class
|
|
*
|
|
* @param string $zebra one of odd or even.
|
|
* @return $this
|
|
*/
|
|
public function setZebra($zebra) {
|
|
if($zebra == 'odd' || $zebra == 'even') $this->zebra = $zebra;
|
|
else user_error("setZebra passed '$zebra'. It should be passed 'odd' or 'even'", E_USER_WARNING);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getZebra() {
|
|
return $this->zebra;
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function Message() {
|
|
$fs = array();
|
|
$this->collateDataFields($fs);
|
|
|
|
foreach($fs as $subfield) {
|
|
if($m = $subfield->Message()) $message[] = rtrim($m, ".");
|
|
}
|
|
|
|
return (isset($message)) ? implode(", ", $message) . "." : "";
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function MessageType() {
|
|
$fs = array();
|
|
$this->collateDataFields($fs);
|
|
|
|
foreach($fs as $subfield) {
|
|
if($m = $subfield->MessageType()) $MessageType[] = $m;
|
|
}
|
|
|
|
return (isset($MessageType)) ? implode(". ", $MessageType) : "";
|
|
}
|
|
}
|