web-dev-qa-db-ja.com

カスタムフィールドラジオリストをbtn-groupとしてスタイルする方法

ラジオリストで、btnグループとして表示する必要があるカスタムフィールドを作成しようとしています。標準のtype="radio"をXMLで使用すると期待どおりに機能しますが(rating2)、カスタムフィールドとしてレンダリングされると(rating1)、定期的にフォーマットされたラジオリストのみを表示します。

2つの間で異なるか欠落しているクラス名がいくつかあることがわかりますが、XMLでclass="btn-group"を指定することで対処できると想定して、それらを指定する方法または場所を特定できません。

誰かがこれを行うことに成功しましたか?もしそうなら、このコードで何が欠けているか間違っていますか?

enter image description here

フォームXML

<field name="rating1"
    type="ContentRating"
    class="btn-group"
    label="Rating 1" />

<field name="rating2"
    type="radio"
    class="btn-group"
    label="Rating 2" >
    <option value="Y">TV-Y</option>
    <option value="Y7">TV-Y7</option>
    <option value="G">TV-G</option>
    <option value="PG">TV-PG</option>
    <option value="14">TV-14</option>
    <option value="MA">TV-MA</option>
</field>

models/fields/contentrating.php

class JFormFieldContentRating extends JFormField {
    protected $type = 'ContentRating';
    protected function getInput() {
        $options = array(
            JHtml::_('select.option', 'Y', 'TV-Y'),
            JHtml::_('select.option', 'Y7', 'TV-Y7'),
            JHtml::_('select.option', 'G', 'TV-G'),
            JHtml::_('select.option', 'PG', 'TV-PG'),
            JHtml::_('select.option', '14', 'TV-14'),
            JHtml::_('select.option', 'MA', 'TV-MA')
        );
    // Some of the variations tried - none work
        $html = JHtml::_('select.radiolist', $options, $this->name, null, 'value', 'text', $this->value, $this->id);
        $html = JHtml::_('select.radiolist', $options, $this->name, array('class'=>''), 'value', 'text', $this->value, $this->id);
        $html = JHtml::_('select.radiolist', $options, $this->name, array('class'=>'btn'), 'value', 'text', $this->value, $this->id);
        $html = JHtml::_('select.radiolist', $options, $this->name, "class='btn-group'", 'value', 'text', $this->value, $this->id);
        return $html;
    }
}
3
GDP

JHtml radiolist関数を見て、それはカスタムクラスをサポートしません。実際のコアファイルを介してradioクラスを手動で追加します。

ここで私が行ったことは、コア無線フィールドのコピーを取り、いくつかのことを取り除いて、必要に応じて修正しました。お役に立てれば:

class JFormFieldContentRating extends JFormField {

    protected $type = 'ContentRating';

    protected function getInput() {

        $options = array(
            JHtml::_('select.option', 'Y', 'TV-Y'),
            JHtml::_('select.option', 'Y7', 'TV-Y7'),
            JHtml::_('select.option', 'G', 'TV-G'),
            JHtml::_('select.option', 'PG', 'TV-PG'),
            JHtml::_('select.option', '14', 'TV-14'),
            JHtml::_('select.option', 'MA', 'TV-MA')
        );

        $html = array();

        $class = !empty($this->class) ? ' class="radio ' . $this->class . '"' : ' class="radio"';

        $html[] = '<fieldset id="' . $this->id . '"' . $class. ' >';

        foreach ($options as $i => $option)
        {
            $checked = ((string) $option->value == (string) $this->value) ? ' checked="checked"' : '';
            $class = !empty($option->class) ? ' class="' . $option->class . '"' : '';

            $onclick = !empty($option->onclick) ? ' onclick="' . $option->onclick . '"' : '';
            $onchange = !empty($option->onchange) ? ' onchange="' . $option->onchange . '"' : '';

            $html[] = '<input type="radio" id="' . $this->id . $i . '" name="' . $this->name . '" value="'
                . htmlspecialchars($option->value, ENT_COMPAT, 'UTF-8') . '"' . $checked . $class . $onclick
                . $onchange . ' />';

            $html[] = '<label for="' . $this->id . $i . '"' . $class . ' >'
                . JText::alt($option->text, preg_replace('/[^a-zA-Z0-9_\-]/', '_', $this->fieldname)) . '</label>';

        }

        $html[] = '</fieldset>';

        return implode($html);
    }
}

テスト済みおよび動作中

お役に立てれば

5
Lodder