PHP 根据日期和时间有条件地将表单字段设置为只读
PHP Make form field read-only conditionally based on date & time
我试图让表单中的 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 位代码,我认为我可以以某种方式将它们放在一起来做我想做的事,但我不知道如何...
这个'makes fields read only'基于一件事
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;
}
而这个做了一些事情'based on current date'
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;
}
我需要'make fields read only'-'based on a date'。但我不知道如何将这两件事放在一起。
希望这就是所需的全部信息。这可能吗?
1st - 在 Wordpress 的“代码片段”中进入 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;
}
我试图让表单中的 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 位代码,我认为我可以以某种方式将它们放在一起来做我想做的事,但我不知道如何...
这个'makes fields read only'基于一件事
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;
}
而这个做了一些事情'based on current date'
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;
}
我需要'make fields read only'-'based on a date'。但我不知道如何将这两件事放在一起。
希望这就是所需的全部信息。这可能吗?
1st - 在 Wordpress 的“代码片段”中进入 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;
}