silverstripe-framework/src/Forms/FormTemplateHelper.php

78 lines
2.0 KiB
PHP

<?php
namespace SilverStripe\Forms;
use SilverStripe\Core\Convert;
use ReflectionClass;
use SilverStripe\Core\Injector\Injectable;
/**
* A helper class for managing {@link Form} and {@link FormField} HTML template
* output.
*
* This primarily exists to maintain backwards compatibility between Form and
* FormField template changes since developers may rely on specific HTML output
* in their applications. Any core changes to templates (such as changing ID's)
* may have the potential to silently prevent websites from working.
*
* To provide a form with a custom FormTemplateHelper use the following snippet:
*
* <code>
* $form->setTemplateHelper('ClassName');
* </code>
*
* Globally, the FormTemplateHelper can be set via the {@link Injector} API.
*/
class FormTemplateHelper
{
use Injectable;
/**
* @param Form $form
*
* @return string
*/
public function generateFormID($form)
{
if ($id = $form->getHTMLID()) {
return Convert::raw2htmlid($id);
}
$reflection = new ReflectionClass($form);
$shortName = str_replace(['.', '/'], '', $form->getName() ?? '');
return Convert::raw2htmlid($reflection->getShortName() . '_' . $shortName);
}
/**
* @param FormField $field
*
* @return string
*/
public function generateFieldHolderID($field)
{
return $this->generateFieldID($field) . '_Holder';
}
/**
* Generate the field ID value
*
* @param FormField $field
* @return string
*/
public function generateFieldID($field)
{
// Don't include '.'s in IDs, they confused JavaScript
$name = str_replace('.', '_', $field->getName() ?? '');
if ($form = $field->getForm()) {
return sprintf(
"%s_%s",
$this->generateFormID($form),
Convert::raw2htmlid($name)
);
}
return Convert::raw2htmlid($name);
}
}