type = $type;
$this->fieldHtml = $fieldHtml;
$this->field = $fieldHtml->getField();
$this->fieldtype = $fieldHtml->getFieldType();
$this->subType = $subType;
$this->control = VisformsHtmlControl::getInstance($this->fieldHtml, $this->type);
}
public static function getInstance($type, $fieldHtml, $subType = 'horizontal') {
if (empty($type)) {
$type = 'visforms';
}
$classname = get_called_class() . ucfirst($type);
if (!class_exists($classname)) {
// try to register it
JLoader::register($classname, dirname(__FILE__) . '/html/layout/' . $type . '.php');
if (!class_exists($classname)) {
// return a default class?
return false;
}
}
//delegate to the appropriate subclass
return new $classname($type, $fieldHtml, $subType);
}
abstract public function prepareHtml();
abstract protected function setFieldControlHtml();
protected function setFieldValidateArray() {
$this->field = $this->fieldHtml->setFieldValidateArray($this->field);
// only a view field types (at the moment the date type) have individual Validations, attach those rules
if (method_exists($this->fieldHtml, 'setFieldCustomValidateArray')) {
$this->field = $this->fieldHtml->setFieldCustomValidateArray($this->field);
}
}
protected function removeUnsupportedShowLabel() {
if (method_exists($this->fieldHtml, 'removeUnsupportedShowLabel')) {
$this->field = $this->fieldHtml->removeUnsupportedShowLabel($this->field);
}
}
protected function setFieldCustomErrorMessageArray() {
// validation rules are stored in xml-definition-fields with name that ends on _validate_rulename (i.e. _validate_minlength).
// each form field is represented by a fieldset in xml-definition file
if (isset($this->field->customerror) && $this->field->customerror != "") {
// replace all occurences of @ in custom error messages , because Joomla email cloaking will break javascript
$this->field->customerror = str_replace(array('@'), array('@'), $this->field->customerror);
foreach ($this->field as $name => $value) {
$attributes = array("maxlength", "min", "max", "required");
$types = array("email", "url", "date", "number");
if (!is_array($value)) {
if ($value) {
if (str_contains($name, 'customvalidation')) {
$this->field->customErrorMsgArray["customvalidation"] = $this->field->customerror;
}
if (str_contains($name, 'phonevalidation')) {
$this->field->customErrorMsgArray["phonevalidation"] = $this->field->customerror;
}
if (str_contains($name, 'validate')) {
$name = str_replace('validate_', "", $name);
$this->field->customErrorMsgArray[$name] = $this->field->customerror;
}
if (str_contains($name, 'attribute_')) {
$name = str_replace('attribute_', "", $name);
if (in_array($name, $attributes)) {
$this->field->customErrorMsgArray[$name] = $this->field->customerror;
}
}
$name = $this->field->typefield;
if (in_array($name, $types)) {
$this->field->customErrorMsgArray[$name] = $this->field->customerror;
}
}
}
}
}
}
protected function setErrorId() {
$this->field->errorId = $this->fieldHtml->getErrorId($this->field);
}
protected function setFieldAttributeArray() {
$this->field->attributeArray = $this->fieldHtml->getFieldAttributeArray();
}
protected function makeFieldUneditable() {
if (isset($this->field->isForbidden) && ($this->field->isForbidden == true)) {
// no double muting
if (isset($this->field->{'attribute_data-readonly'})) {
unset($this->field->{'attribute_data-readonly'});
}
// a view field types need custom care
if (method_exists($this->fieldHtml, 'makeFieldUneditable')) {
$this->field = $this->fieldHtml->makeFieldUneditable($this->field);
}
else {
//set a readonly attribute
$this->field->attribute_readonly = 'readonly';
}
}
}
protected function setToolTip() {
// override when a non bootstrap tooltip is necessary, i.e. uikit layouts
// add Attributes necessary to display a bootstrap tootip
if (method_exists($this->fieldHtml, 'setToolTip')) {
$this->field = $this->fieldHtml->setToolTip($this->field);
}
else {
if (!empty($this->field->custominfo)) {
$this->field->attribute_title = htmlspecialchars($this->field->custominfo, ENT_COMPAT, 'UTF-8');
$this->field->attribute_class .= ' visToolTip';
$this->field->{'attribute_data-bs-toggle'} = 'tooltip';
HTMLHelper::_('visforms.visformsTooltip');
}
}
}
// ToDo seems not to be used anywhere
protected function setCustomErrorDivLayout () {
$this->field->customErrorDivLayout = $this->fieldHtml->getCustomErrorDivLayout($this->field);
}
}