仅在几个单选按钮中的一个上动态写入“选中”属性

问题描述 投票:0回答:5

减少或简化以下检查适用输入字段的 php 函数的好方法是什么?

  <?php

  $options = get_option( 'navbar_style', '' );
  
  $right = $left = $fade = '';

  if( isset( $options['style'] ) ) {
    if( $options['style'] == 'right' ) {
      $right = ' checked="checked"';
    }
    if( $options['style'] == 'left' ) {
      $left = ' checked="checked"';
    }
    if( $options['style'] == 'fade' ) {
      $fade = ' checked="checked"';
    }
  }

  ?>

  <label><input type='radio' name='navbar_style[style]' value='right' <?php echo $right; ?> >Right <em>(Default)</em></label>
  <label><input type='radio' name='navbar_style[style]' value='left' <?php echo $left; ?> >Left</label>
  <label><input type='radio' name='navbar_style[style]' value='fade' <?php echo $fade; ?> >Fade</label>
php if-statement radio-button wordpress-theming checked
5个回答
4
投票

可以使用动态变量设置,但是不推荐!请参阅下一个示例以正确使用。

$options['style'] = 'left';
$right = $left = $fade = '';

if (in_array($options['style'] ?? '', ['right', 'left', 'fade'])) {
    ${$options['style']} = ' checked="checked"';
}

var_dump($right, $left, $fade);
string(0) ""
string(18) " checked="checked""
string(0) ""

一个更简洁的方法是这个版本并使用例如

$checks['left']
而不是
$left
.

$checks = [];
foreach (['right', 'left', 'checked'] as $check) {
    $checks[$check] = $options['style'] === $check ? ' checked="checked"' : '';
}

var_dump($checks);
array(3) {
  'right' =>
  string(0) ""
  'left' =>
  string(18) " checked="checked""
  'checked' =>
  string(0) ""
}

2
投票

创建一个函数并传入选项可能更紧凑,那么它只是一个测试,看看是否设置了该选项并返回相应的 html ...

  function styleCheck($option, $options)
  {
      return ($options['style'] ?? '') == $option ? ' checked="checked"' : '';
  }
  ?>

  <label><input type='radio' name='navbar_style[style]' value='right'<?php echo styleCheck('right', $options); ?>>Right <em>(Default)</em></label>
  <label><input type='radio' name='navbar_style[style]' value='left'<?php echo styleCheck('left', $options); ?>>Left</label>
  <label><input type='radio' name='navbar_style[style]' value='fade'<?php echo styleCheck('fade', $options); ?>>Fade</label>

2
投票

你也可以这样做:

$style = ['right' => '', 'left' => '', 'fade' => ''];
    
if (isset($options['style']) && array_key_exists($options['style'], $style)) {
    $style[$options['style']] = ' checked="checked"';
}

2
投票

你可以试试这个:

$options = get_option( 'navbar_style', '' );
$styles = array('right', 'left', 'fade');

$checked = array_fill_keys($styles, '');
if(isset($options['style']) && in_array($options['style'], $styles)) {
  $checked[$options['style']] = 'checked="checked"';
}

0
投票

作为一名程序员,您应该留意代码中的重复模式。显然,有重复的 HTML 标记,文本调整最少。首字母缩略词 D.R.Y 的意思是“不要重复自己”。

创建一个包含这些动态数据点的数组,然后实现一个循环来生成所需的标记。这将有助于防止拼写错误并使您的脚本更易于维护。

代码:(演示

$options = ['style' => 'left'];
  
$radios = [
    'right' => 'Right <em>(Default)</em>',
    'left' => 'Left',
    'fade' => 'Fade',
];

foreach ($radios as $value => $text) {
    printf(
        "<label><input type='radio' name='navbar_style[style]' value='%s'%s>%s</label>\n",
        $value,
        ($options['style'] ?? '') === $value ? ' checked' : '',
        $text
    );
}
© www.soinside.com 2019 - 2024. All rights reserved.