【问题标题】:PHP Make form field read-only conditionally based on date & timePHP根据日期和时间有条件地使表单字段只读
【发布时间】:2020-10-16 08:36:10
【问题描述】:

我试图让表单中的 2 个字段在特定时间和日期后变为只读状态。 我拼凑了一些来自几个地方的代码以尝试完成这项工作,但我完全是新手,所以我无法确定哪里出错或为什么出错。

在下面的示例中,我希望有条件地只读的字段是 1 和 13。我什至不确定数字 9 和 2 的用途。就像我说的,绝对的初学者。

从他的回答中添加 Angel 的时间和日期定义,这就是我目前所拥有的......

$W1F1Start = "2020-10-16 12:42:00";
  $now = date('Y-m-d H:i:s');
 if(strtotime($now) > strtotime($W1F1Start)){

add_filter('frm_setup_new_fields_vars', 'frm_set_read_only_on_create', 9, 2);
add_filter('frm_setup_edit_fields_vars', 'frm_set_read_only_on_create', 9, 2);
function frm_set_read_only_on_create( $values, $field ){
 
  if ( in_array( $field->id, array( 1,13 ) ) ) { 
       $values['read_only'] = 1;
    }
 return $values;
}
return $values;
}

如果我让这个工作,我最终需要在不同的时间和日期以相同的形式将最多 20 个字段设为只读。

如果有影响的话,我的表单在 wordpress 上是一个强大的表单。

在他们的知识库中,他们有 2 位代码,我认为我可以以某种方式将它们放在一起做我想做的事,但我不知道如何......

这个'使字段只读'基于事物

add_filter('frm_setup_new_fields_vars', 'frm_set_read_only_on_create', 9, 2);
add_filter('frm_setup_edit_fields_vars', 'frm_set_read_only_on_create', 9, 2);
function frm_set_read_only_on_create( $values, $field ){
    // If on the back-end, keep fields editable
    if ( FrmAppHelper::is_admin() || current_user_can( 'administrator' ) ) {
      return $values;
    }

    // If on front-end, make specific fields read-only
        if ( in_array( $field->id, array( 554,555,556 ) ) ) { 
       $values['read_only'] = 1;
    }   
    return $values;
}

这个“基于当前日期”做了一些事情

add_filter('frm_setup_new_fields_vars', 'remove_field_option_by_date', 30, 2);
add_filter('frm_setup_edit_fields_vars', 'remove_field_option_by_date', 30, 2);
function remove_field_option_by_date( $values, $field ) {
  $today = time();
  $close_date = strtotime ( "2020-06-20" ); // change 2020-06-20 to the date after which the option should be removed
  
  if ($today id == 13677 ) { // change 13677 to your field id
    $options_to_remove = array( 'Option 1' ); // change Option 1 to the value to remove
    foreach ( $options_to_remove as $remove ) {
      $option_key = array_search( $remove, $values['options'] );
      if ( $option_key !== false ) {
        unset( $values['options'][ $option_key ] );
      }
    }
  }
  return $values;
}

我需要“使字段只读”-“基于日期”。但我不知道如何将这两件事放在一起。

希望这是所有需要的信息。这可能吗?

【问题讨论】:

  • 这并不能解决您的问题,但您应该使用 Datetime 类而不是 PHP 时间函数 php.net/manual/fr/class.datetime.php。这是处理日期和时间的更好方法
  • 目前我正在将此代码放入一个名为 Code Snippets 的 wordpress 插件中,否则我不知道该放在哪里。
  • 感谢 ypio,感谢您的任何建议。
  • 不不不,你完全搞砸了!我的代码应该在你的方法中!不要这样包装它
  • 我会用你的原始代码制作和编辑

标签: php date time conditional-statements field


【解决方案1】:

第一个 - 在 Wordpress 中的“code sn-ps”中进入位于您正在使用的主题内的 functions.php,因此无需插件即可执行此操作。现在比较 2 个日期,你可以有这样的东西:

// Static W1F1 start date
$W1F1Start = new DateTime();
$W1F1Start->setTimestamp(1602840600);
$now = new DateTime();
    
if($now > $W1F1Start){
  // do whatever
}

或者假设您的变量 $W1F1Start 是一个字符串“2020-10-16 09:30:00”(这是格式化的 $W1F1Start->format('Y-m-d H:i:s') 的值)并且您想要将它与当前时间进行比较,那么您可以使用 strtotime(),它将您的字符串转换为时间戳:

$W1F1Start = "2020-10-16 09:30:00";
$now = date('Y-m-d H:i:s');

if(strtotime($now) > strtotime($W1F1Start)){
   // do whatever
}

这是你的代码最终外观:

add_filter('frm_setup_new_fields_vars', 'frm_set_read_only_on_create', 9, 2);
add_filter('frm_setup_edit_fields_vars', 'frm_set_read_only_on_create', 9, 2);
function frm_set_read_only_on_create( $values, $field ){

    // Static W1F1 start date
    $W1F1Start = new DateTime();
    $W1F1Start->setTimestamp(1602840600);
    // current time
    $now = new DateTime();
    $now->setTimezone(new DateTimeZone('UTC'));

    // if cuurent time > W1F1Start    
    if ($now > $W1F1Start) {
       if ( in_array($field->id, array(1,13))) { 
          $values['read_only'] = 1;
       }  
       return $values;
    }   
    return $values;
}

【讨论】:

  • 嗨,天使,现在几乎完美了。是否可以考虑时区差异?我比 UTC 早 1 小时。我在英国,所以在 BST 上运行,所以是 GMT+1。澄清一下,代码 100% 是有效的,我总是可以使用 unix 时间转换器或其他东西来解释时差,但是对 20 个不同的字段执行此操作可能会让人感到困惑。
  • 是的,看看编辑,使用 setTimezone() - php.net/manual/en/datetime.settimezone.php
  • 我是否需要将时区设置为“欧洲/伦敦”而不是 UTC?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
相关资源
最近更新 更多