it-swarm.com.de

Benutzerdefinierte XML-Attribute werden im HTML-Markup nicht angezeigt

Hier ist die XML für ein bestimmtes Formularfeld:

    <field type="text" name="first-name" id="first-name" label="MOD_LABEL_FIRST_NAME" 
required="required" maxlength="27" color="yellow" />

Mein Problem ist, dass beim Anzeigen des Formulars als HTML die Attribute in irgendeiner Weise gefiltert werden. Beispielsweise wird das Attribut type als Teil des Markups angezeigt, Attribute wie required und color jedoch nicht. (Color ist ein Dummy-Attribut, das ich zu Testzwecken erstellt habe, aber required ist wichtig, da ich das HTML5-erforderliches Verhalten verwenden möchte.)

Hier ist die Markup-Ausgabe für das in der obigen XML-Datei beschriebene Feld:

<label id="first-name-label" for="first-name">First name</label>
<input type="text" name="first-name" id="first-name" maxlength="27"/>

Ich weiß, dass benutzerdefinierte Attribute wie color als Teil des Objekts existieren - hier ist das Ergebnis eines var_dump von $oForm->getField('first-name'):

object(JFormFieldText)#773 (19) {
  ["type":protected]=>
  string(4) "Text"
  ["element":protected]=>
  object(JXMLElement)#772 (1) {
    ["@attributes"]=>
    array(9) {
      ["type"]=>
      string(4) "text"
      ["name"]=>
      string(15) "first-name"
      ["id"]=>
      string(15) "first-name"
      ["label"]=>
      string(30) "MOD_LABEL_FIRST_NAME"
      ["required"]=>
      string(8) "required"
      ["maxlength"]=>
      string(2) "27"
      ["color"]=>
      string(6) "yellow"
    }
  }

Außerdem habe ich versucht, die in der Antwort auf diese Frage beschriebenen Methoden zu befolgen, da sie relevant erschienen, aber in meinem Fall hat es nicht funktioniert, da ich nur Syntaxfehler erhalte:

$oField = $oForm->getField('first-name');
  echo $oField->type; // returns 'Text'
  echo $oField->element->["color"]; // returns syntax error

In diesem Fall wäre es zwar interessant zu wissen, wie auf benutzerdefinierte Attribute zugegriffen wird, aber meine Hauptfrage lautet , warum nur einige Attribute im Markup angezeigt werden.

6
Candlejack

Obwohl die XML-Datei und der gerenderte HTML-Code beide Attribute aufrufen, erfolgt keine direkte Weitergabe von Werten. Daher schaffen es nur einige Attribute in den HTML-Code (und einige zusätzliche Attribute werden hinzugefügt).

All dies basiert auf der Klasse, die Sie hier sehen können: https://github.com/joomla/joomla-cms/blob/staging/libraries/joomla/form/fields/text.php#L16

Sie geben also für jedes Feld einen Typ an, in diesem Fall text. Dies führt dazu, dass die JFormFieldText-Klasse das Rendern behandelt. JForm ruft getInput für die Feldklasse auf, um die HTML-Eingabe tatsächlich zurückzugewinnen. Wenn Sie diesen Code durchsehen, sollte es sehr offensichtlich sein, warum Ihre benutzerdefinierten Attribute nicht durchgereicht werden:

protected function getInput()
{
    // Translate placeholder text
    $hint = $this->translateHint ? JText::_($this->hint) : $this->hint;
    // Initialize some field attributes.
    $size         = !empty($this->size) ? ' size="' . $this->size . '"' : '';
    $maxLength    = !empty($this->maxLength) ? ' maxlength="' . $this->maxLength . '"' : '';
    $class        = !empty($this->class) ? ' class="' . $this->class . '"' : '';
    $readonly     = $this->readonly ? ' readonly' : '';
    $disabled     = $this->disabled ? ' disabled' : '';
    $required     = $this->required ? ' required aria-required="true"' : '';
    $hint         = $hint ? ' placeholder="' . $hint . '"' : '';
    $autocomplete = !$this->autocomplete ? ' autocomplete="off"' : ' autocomplete="' . $this->autocomplete . '"';
    $autocomplete = $autocomplete == ' autocomplete="on"' ? '' : $autocomplete;
    $autofocus    = $this->autofocus ? ' autofocus' : '';
    $spellcheck   = $this->spellcheck ? '' : ' spellcheck="false"';
    $pattern      = !empty($this->pattern) ? ' pattern="' . $this->pattern . '"' : '';
    $inputmode    = !empty($this->inputmode) ? ' inputmode="' . $this->inputmode . '"' : '';
    $dirname      = !empty($this->dirname) ? ' dirname="' . $this->dirname . '"' : '';
    // Initialize JavaScript field attributes.
    $onchange = !empty($this->onchange) ? ' onchange="' . $this->onchange . '"' : '';
    // Including fallback code for HTML5 non supported browsers.
    JHtml::_('jquery.framework');
    JHtml::_('script', 'system/html5fallback.js', false, true);
    $datalist = '';
    $list     = '';
    /* Get the field options for the datalist.
    Note: getSuggestions() is deprecated and will be changed to getOptions() with 4.0. */
    $options  = (array) $this->getSuggestions();
    if ($options)
    {
        $datalist = '<datalist id="' . $this->id . '_datalist">';
        foreach ($options as $option)
        {
            if (!$option->value)
            {
                continue;
            }
            $datalist .= '<option value="' . $option->value . '">' . $option->text . '</option>';
        }
        $datalist .= '</datalist>';
        $list     = ' list="' . $this->id . '_datalist"';
    }
    $html[] = '<input type="text" name="' . $this->name . '" id="' . $this->id . '"' . $dirname . ' value="'
        . htmlspecialchars($this->value, ENT_COMPAT, 'UTF-8') . '"' . $class . $size . $disabled . $readonly . $list
        . $hint . $onchange . $maxLength . $required . $autocomplete . $autofocus . $spellcheck . $inputmode . $pattern . ' />';
    $html[] = $datalist;
    return implode($html);
}

Es gibt viele Attribute, die Sie festlegen können: Größe, Maximallänge, Klasse, Readonly, Deaktiviert, Erforderlich und mehr! Aber wenn es nicht in dieser Klasse definiert ist, wird es nicht in der endgültigen HTML sein.

Wenn das von Ihnen benötigte Attribut nicht vorhanden ist, haben Sie zwei Möglichkeiten: Senden Sie eine Pull-Anfrage an Joomla, um es hinzuzufügen, oder erstellen Sie einen benutzerdefinierten Formularfeldtyp, der das von Ihnen benötigte Attribut wiedergibt.

In den Dokumenten sollte alles vorhanden sein, was Sie zum Erstellen dieses benutzerdefinierten Feldtyps benötigen: https://docs.joomla.org/Creating_a_custom_form_field_type

4
David Fritsch