web-dev-qa-db-fra.com

Attributs XML personnalisés non affichés dans le balisage HTML

Voici le code XML pour un champ de formulaire particulier:

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

Mon problème est que lors de l'affichage du formulaire au format HTML, les attributs sont filtrés d'une manière ou d'une autre. Par exemple, l'attribut type est affiché dans le cadre du balisage mais les attributs tels que required et color ne le sont pas. (Color est un attribut factice que j'ai créé à des fins de test, mais required est important car je souhaite utiliser le comportement HTML5 requis .)

Voici la sortie de balisage pour le champ spécifique décrit dans le XML ci-dessus:

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

Je connais des attributs personnalisés tels que color existent en tant que partie de l'objet. Voici le résultat d'un var_dump de $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"
    }
  }

En outre, j'ai essayé de suivre les méthodes décrites dans la réponse à cette question car elles semblaient pertinentes, mais cela n'a pas fonctionné dans mon cas, car je viens de recevoir des erreurs de syntaxe:

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

Alors qu'il serait intéressant de savoir comment accéder/manipuler des attributs personnalisés dans ce cas, ma question principale est pourquoi seuls certains attributs sont-ils affichés dans le balisage?

6
Candlejack

Bien que le fichier XML et le code HTML affiché les appellent tous deux attributs, il n'y a pas de transmission directe des valeurs. Par conséquent, seuls certains attributs parviennent au HTML (et des attributs supplémentaires sont ajoutés).

Tout cela est basé sur la classe que vous pouvez voir ici: https://github.com/joomla/joomla-cms/blob/staging/libraries/joomla/form/fields/text.php#L16

Donc, pour chaque champ, vous spécifiez un type, dans ce cas text. Cela conduit la classe JFormFieldText à gérer le rendu. JForm appellera getInput sur la classe de champ pour récupérer le code HTML en entrée. En parcourant ce code, vous comprendrez pourquoi vos attributs personnalisés ne sont pas transmis:

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);
}

Vous pouvez définir un grand nombre d'attributs: taille, longueur maximale, classe, lecture seule, désactivé, obligatoire, etc. Mais si ce n'est pas défini dans cette classe, ce ne sera pas dans le HTML final.

Si l'attribut dont vous avez besoin n'est pas là, vous avez deux options: soumettre une demande d'extraction à Joomla pour l'ajouter ou créer un type de champ de formulaire personnalisé qui restitue l'attribut dont vous avez besoin.

Les documents doivent contenir tout ce dont vous avez besoin pour créer ce type de champ personnalisé: https://docs.joomla.org/Creating_a_custom_form_field_type

4
David Fritsch