web-dev-qa-db-ja.com

HTMLマークアップにカスタムXML属性が表示されない

次に、特定のフォームフィールドのXMLを示します。

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

私の問題は、フォームをHTMLとして表示するときに、属性が何らかの方法でフィルター処理されていることです。たとえば、属性typeはマークアップの一部として表示されますが、requiredcolorなどの属性は表示されません。 (Colorはテスト目的で作成したダミー属性ですが、_ HTML5に必要な動作 を使用するため、requiredは重要です。)

上記のXMLで説明されている特定のフィールドのマークアップ出力は次のとおりです。

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

私はcolorのようなカスタム属性がオブジェクトの一部として存在することを知っています-これは$oForm->getField('first-name')のvar_dumpの結果です:

_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"
    }
  }
_

さらに、関連があるように見える この質問の回答に記載されている方法 を試してみましたが、構文エラーが発生するだけなので、私の場合はうまくいきませんでした:

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

この場合、カスタム属性にアクセス/操作する方法を知ることは興味深いことですが、私の主な質問はなぜマークアップに表示されるのは一部の属性だけなのかです

6
Candlejack

XMLファイルとレンダリングされたHTMLはどちらも属性と呼びますが、値の直接パススルーはありません。したがって、一部の属性のみがHTMLに適用されます(さらにいくつかの属性が追加されます)。

これはすべて、ここで確認できるクラスに基づいています: https://github.com/joomla/joomla-cms/blob/staging/libraries/joomla/form/fields/text.php#L16

そのため、すべてのフィールドに対して、タイプ(この場合はtext)を指定します。これにより、JFormFieldTextクラスがレンダリングを処理します。 JFormはフィールドクラスでgetInputを呼び出して、実際に入力HTMLを取得します。このコードを一瞥すると、カスタム属性が渡されない理由は非常に明白です。

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

設定できる属性はたくさんあります:サイズ、最大長、クラス、読み取り専用、無効、必須などです!ただし、そのクラスで定義されていない場合、最終的なHTMLには含まれません。

必要な属性がない場合は、Joomlaに対してプルリクエストを送信して追加するか、必要な属性をレンダリングするカスタムフォームフィールドタイプを作成します。

ドキュメントには、そのカスタムフィールドタイプを作成するために必要なものがすべて含まれているはずです。 https://docs.joomla.org/Creating_a_custom_form_field_type

4
David Fritsch