Back to AccessiblemediaField class

Method setup

public bool
setup
(\SimpleXMLElement $element, mixed $value, mixed $group = null)
Method to attach a Form object to the field.
Parameters
  • \SimpleXMLElement $element The SimpleXMLElement object representing the <field /> tag for the form field object.
  • mixed $value The form field value to validate.
  • string $group The field name group control value.
Returns
  • bool True on success.
Since
  • 4.0.0

Method setup - Source code

/**
 * Method to attach a Form object to the field.
 *
 * @param   \SimpleXMLElement  $element  The SimpleXMLElement object representing the <field /> tag for the form field object.
 * @param   mixed              $value    The form field value to validate.
 * @param   string             $group    The field name group control value.
 *
 * @return  boolean  True on success.
 *
 * @since   4.0.0
 */
public function setup(\SimpleXMLElement $element, $value, $group = null)
{
    /**
     * When you have subforms which are not repeatable (i.e. a subform custom field with the
     * repeat attribute set to 0) you get an array here since the data comes from decoding the
     * JSON into an associative array, including the media subfield's data.
     *
     * However, this method expects an object or a string, not an array. Typecasting the array
     * to an object solves the data format discrepancy.
     */
    $value = is_array($value) ? (object) $value : $value;
    /**
     * If the value is not a string, it is
     * most likely within a custom field of type subform
     * and the value is a stdClass with properties
     * imagefile and alt_text. So it is fine.
     */
    if (\is_string($value)) {
        json_decode($value);
        // Check if value is a valid JSON string.
        if ($value !== '' && json_last_error() !== JSON_ERROR_NONE) {
            /**
             * If the value is not empty and is not a valid JSON string,
             * it is most likely a custom field created in Joomla 3 and
             * the value is a string that contains the file name.
             */
            if (is_file(JPATH_ROOT . '/' . $value)) {
                $value = '{"imagefile":"' . $value . '","alt_text":""}';
            } else {
                $value = '';
            }
        }
    } elseif (!is_object($value) || !property_exists($value, 'imagefile') || !property_exists($value, 'alt_text')) {
        return false;
    }
    if (!parent::setup($element, $value, $group)) {
        return false;
    }
    $this->directory = (string) $this->element['directory'];
    $this->preview = (string) $this->element['preview'];
    $this->previewHeight = isset($this->element['preview_height']) ? (int) $this->element['preview_height'] : 200;
    $this->previewWidth = isset($this->element['preview_width']) ? (int) $this->element['preview_width'] : 200;
    $xml = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<form>
\t<fieldset
\t\tname="accessiblemedia"
\t\tlabel="JLIB_FORM_FIELD_PARAM_ACCESSIBLEMEDIA_LABEL"
\t>
\t\t<field
\t\t\tname="imagefile"
\t\t\ttype="media"
\t\t\tlabel="JLIB_FORM_FIELD_PARAM_ACCESSIBLEMEDIA_PARAMS_IMAGEFILE_LABEL"
\t\t\tdirectory="{$this->directory}"
\t\t\tpreview="{$this->preview}"
\t\t\tpreview_width="{$this->previewWidth}"
\t\t\tpreview_height="{$this->previewHeight}"
\t\t/>

\t\t<field
\t\t\tname="alt_text"
\t\t\ttype="text"
\t\t\tlabel="JLIB_FORM_FIELD_PARAM_ACCESSIBLEMEDIA_PARAMS_ALT_TEXT_LABEL"
\t\t/>

\t\t<field
\t\t\tname="alt_empty"
\t\t\ttype="checkbox"
\t\t\tlabel="JLIB_FORM_FIELD_PARAM_ACCESSIBLEMEDIA_PARAMS_ALT_EMPTY_LABEL"
\t\t\tdescription="JLIB_FORM_FIELD_PARAM_ACCESSIBLEMEDIA_PARAMS_ALT_EMPTY_DESC"
\t\t/>
\t</fieldset>
</form>
XML;
    $this->formsource = $xml;
    $this->layout = 'joomla.form.field.media.accessiblemedia';
    return true;
}