当前位置: 首页 > 知识库问答 >
问题:

如何只渲染一次字段集和图例标记(对于3个单选按钮输出)

宋望
2023-03-14

我有一个配置php-file,其中我设置了一个具有3个单选按钮属性的数组。在无线电类中,我有一个名为“渲染”的方法,该方法应该输出单选按钮。单选按钮应放置在一个html字段集标签中。问题是,我得到了每个单选按钮的字段集和图例标签。但是我希望单选按钮html" target="_blank">嵌入1个字段集和1个图例中。我卡住了。

这是阵列配置:

<?php
 $formConf = [
'kraken' => [
    'type' => 'radio',
    'id' => 'kraken',
    'name' => 'monster',
    'label' => 'Kraken',
    'radio' => 'checked'
],

'sasquatch' => [
    'type' => 'radio',
    'id' => 'sasquatch',
    'name' => 'monster',
    'label' => 'Sasquatch',
    'radio' => ''
],

'mothman' => [
    'type' => 'radio',
    'id' => 'mothman',
    'name' => 'monster',
    'label' => 'Mothman',
    'radio' => ''
]];

这是广播课:

class Radio extends Input {

protected $radio = ''; 
protected $legend = 'Choose your favorite monster';

public function __construct(array $opts)
{
    parent::__construct($opts);

    $this->type = 'radio';

    if (!isset($opts['radio']) || $opts['radio'] === '' || $opts['radio'] == null)  {
        $this->radio = '';
        }
    elseif (isset($opts['radio'])) {
        $this->radio = $opts['radio'];    
    } 
}

该方法应生成html标记:

public function render() : string
{        
    $out = '';
    $out .= '<fieldset>';
    $out .= '<legend>Choose your monster</legend>';
    $out .= '<input type="' . $this->type . '"';
    $out .= $this->renderRadioChecked();
    $out .= '<label for="' . $this->id . '"' . '>';
    $out .= $this->label . '</label>';
    $out .= '<br/>';
    $out .= '</fieldset>';

    return $out;        
}

protected function renderRadioChecked() 
{
    $out = '';
    if ($this->radio == '') {
    $out .= 'id="' . $this->id . '"' . 'name="' . $this->name . '"' . '>';
        } else {
            $out .= 'id="' . $this->id . '"' . 'name="' . $this->name . '"' . ' checked' . '>';
        }
        return $out;
    }

预期结果应是:

<fieldset>
<legend>Choose your favorite monster</legend>

<input type="radio" id="kraken" name="monster">
<label for="kraken">Kraken</label><br/>

<input type="radio" id="sasquatch" name="monster" checked>
<label for="sasquatch">Sasquatch</label><br/>

<input type="radio" id="mothman" name="monster">
<label for="mothman">Mothman</label>
</fieldset>

这里可以看到带有单选按钮的完整版本:https://developer.mozilla.org/en-US/docs/Web/HTML/Element/fieldset

注意:我在索引页面上已经有了一个表单标签和其他html标签。这就是为什么我只能生成这里给出的字段集。

共有1个答案

左丘烨烁
2023-03-14

我会删除字段集html,因为它不是单选按钮元素。我可能会考虑上一堂形体课,然后把收音机插入其中。因此,要获得多个单选按钮,在删除字段集html后,循环单选按钮类,或者您可以允许单选按钮类一次创建多个单选按钮:

class Radio extends Input
{
    protected $data;

    public function __construct(array $opts)
    {
        parent::__construct($opts);
        # The type is irrelevant since this class is a radio, the type is already known.
        # I would just assign the array to a storage variable
        if(empty($opts)) {
            $this->data = false;
        }
        else {
            # I would make sure the array is going to be consistent
            $this->data = (isset($opts['radio']))? [$opts] : $opts;
        } 
    }

    public function render() : string
    {
        # May as well stop here if empty
        if(empty($this->data))
            return false;
        # Loop your data array
        foreach($this->data as $radio) {
            # Build the input
            $out[] = '<input type="radio" '.$this->createAttrElem($radio).' />';
            # I would check to see if the label is set (you never know)
            if(!empty($radio['label']))
                $out[] = '<label for="'.$radio['id'].'">'.$radio['label'].'</label>';
        }
        # Send back the string
        return implode(PHP_EOL, $out);
    }

    protected function createAttrElem($radio) 
    {
        # See if all these attributes are set first
        if(!empty($radio['id']))
            $attr[] = 'id="'.$radio['id'].'"';
        if(!empty($radio['name']))
            $attr[] = 'name="'.$radio['name'].'"';
        if(!empty($radio['checked']))
            $attr[] = 'checked';
        # Return a string
        return (isset($attr))? implode(' ', $attr) : '';
    }
    /**
     *    @description    I might maybe make this method just run the render method.
     *                    Saves on having to write it out.
     */
    public  function __toString()
    {
        return $this->render();
    }
}

form类可能看起来像:

class Form
{
    protected   $layout,
                $type;
    /**
     *    @description    I would allow the form class to be flexible but set default to "form"
     */
    public  function    __construct($type = 'form')
    {
        $this->type     = $type;
    }
    /**
     *    @description    Create the open tag
     */
    public function open(array $attr)
    {
        $open[] = '<'.$this->type;
        foreach($attr as $key => $value) {
            $open[] = $key.'="'.$value.'"';
        }
        $this->layout[] = implode(' ', $open).'>';
        return $this;
    }
    /**
     *    @description    Here you would add the children of the parent element
     */
    public function addChild($Object)
    {
        $this->layout[] = $Object->render();
        return $this;
    }
    /**
     *    @description    Close the element
     */
    public function close()
    {
        $this->layout[] = '</'.$this->type.'>';
        return $this;
    }
    /**
     *    @description    Create a string of the layout
     */
    public function render()
    {
        return implode(PHP_EOL, $this->layout);
    }
    /**
     *    @description    Shortcut the render process
     **/
    public  function __toString()
    {
        return $this->render();
    }
}

然后要充分利用它:

$formConf = [
    'kraken' => [
        'type' => 'radio',
        'id' => 'kraken',
        'name' => 'monster',
        'label' => 'Kraken',
        'radio' => 'checked'
    ],

    'sasquatch' => [
        'type' => 'radio',
        'id' => 'sasquatch',
        'name' => 'monster',
        'label' => 'Sasquatch',
        'radio' => ''
    ],

    'mothman' => [
        'type' => 'radio',
        'id' => 'mothman',
        'name' => 'monster',
        'label' => 'Mothman',
        'radio' => ''
    ]
];

$Fieldset   =   new Form('fieldset');

echo $Fieldset->open(['name' => 'test'])
    ->addChild(new Radio($formConf))
    ->close();

这将输出:

<fieldset name="test">
<input type="radio" id="kraken" name="monster" />
<label for="kraken">Kraken</label>
<input type="radio" id="sasquatch" name="monster" />
<label for="sasquatch">Sasquatch</label>
<input type="radio" id="mothman" name="monster" />
<label for="mothman">Mothman</label>
</fieldset>
 类似资料:
  • 问题内容: 这是django模板的一部分,它应该做的是打印出几个单选按钮,对应于分配给按钮的答案。但是我不知道为什么我可以检查多个单选按钮,这让我很困惑。它应该只允许我检查一个单选按钮,但是我以某种方式拥有它,但是我却丢失了它。有什么帮助吗?谢谢。 问题答案: 只需给他们起相同的名字:

  • 目前,我有3个单选按钮,我试图放置在我的2个输入字段旁边使用引导。我想把它们放在我的输入字段的同一行,但是它一直与这些输入字段的标签对齐。 有人知道我怎样才能把路线撞倒吗? 我的html: 这是我的https://embed.plnkr.co/YIFin0fUchhSyZHiWUO6/

  • 问题内容: 单击按钮后,我将尝试呈现一个段落。 这是我的代码。 在这里,我试图在单击按钮时呈现“你好朋友”。但是没有用。 问题答案: 这不是正确的方法,因为它是一个事件处理程序,它将不呈现元素,您需要的是“元素的条件呈现”。 有关详细信息,请参阅“文档”。 条件渲染 。 脚步: 1-使用具有初始值的状态变量。 2-点击按钮将值更新为。 3-使用该状态值进行条件渲染。 工作代码:

  • 我有一个单选按钮和一个文本字段。我希望文本字段是必需的,只有当单选按钮是勾选。 因此,只有选择createNewCollection时,collectionName才是必需的。

  • 问题内容: 我有一个单选按钮,用于设置或基于交易类型的值 演示可以在这里找到 问题是当我单击任意一个单选按钮时,的值不会改变 我的JavaScript代码是 请让我知道我在做什么错。 另外,除非没有其他选择,否则我不想使用或用于此目的。 问题答案: 您在单选按钮的顶部贴了一个大标签,以防止输入到您的单选按钮。该html应该显示为: 然后它可以工作,当然,它可能看起来不像您想要的那样。

  • 所以我找到了一段代码,当你从下拉菜单中选择标记时,它让你过滤标记,如果我从下拉菜单中取出单选按钮,然后单击它们,这段代码实际上起作用,但是如果我把它们放回一个下拉菜单中,它不会过滤标记,它只是保持原样。我希望它们的工作方式是这样的--如果我从下拉列表中选择Ryga,则只显示将其作为标记的标记[4]。 null null