Гравитационные формы — Получают значение даты и корректируют его, превращают в тег слияния

#gravity-forms-plugin #gravityforms

#gravity-forms-плагин #gravityforms

Вопрос:

Итак, что я хочу иметь возможность сделать, это взять значение поля, поле даты, и добавить к нему установленный период времени, а затем превратить это в тег слияния, который я затем могу добавить обратно в это значение или использовать где-либо еще.

Я знаю, как создать новый тег слияния, проблема не в этом. Мой вопрос в том, как мне получить значение поля для использования в этом расчете?

 add_filter( 'gform_replace_merge_tags', 'new_date_plus_30', 10, 7 );
function new_date_plus_30( $text, $form, $entry, $url_encode, $esc_html, $nl2br, $format ) {
    $merge_tag = '{date_plus_30}';

    $new_date = date('m/d/Y', strtotime(' 30 days'));

    return str_replace( $merge_tag, $new_date, $text );
}
  

Итак, когда я выполняю вычисление новой даты, мне нужно иметь возможность извлекать поле из этого поста и использовать его.

Я также думал о создании скрипта If / Else, в котором я бы выполнял вычисление даты на основе того, что было установлено в форме. Итак, если пользователь сказал повторять это каждые 15 дней, у меня было бы что-то вроде:

add_filter( ‘gform_replace_merge_tags’, ‘new_date_plus_30’, 10, 7); функция new_date_plus_30( $text, $form, $entry, $url_encode, $esc_html, $nl2br, $format) {

 if ( $form_id == 34 amp;amp; $field_id == 2 amp;amp; $value == 'add 30 days') {

$merge_tag = '{date_plus_30}';
$new_date = date('m/d/Y', strtotime(' 30 days'));

}
else if ( $form_id == 34 amp;amp; $field_id == 2 amp;amp; $value == 'first of month') {

  $merge_tag = '{first_of_month}';
  $new_date = date('m/d/Y', strtotime('first of next month'));

 }

}

return str_replace( $merge_tag, $new_date, $text );


}
  

Но моя проблема все та же. Как я могу использовать два фильтра одновременно? Я предполагаю, что мне нужно использовать gform_get_input_value. Пожалуйста, просмотрите мой код и оставьте отзыв, есть ли другой способ?

Ответ №1:

Или, может быть, что-то вроде этого…

      add_filter( 'gform_merge_tag_filter', function ( $value, $merge_tag, $options, $field, $raw_value ) {
    if ( $field->id == '2' amp;amp; $value == 'first of the month') {
       $merge_tag = '{the_next_date}';
       $thedatetochange = 'Not sure how to get the date value here...';
       $value = date('m/d/Y', strtotime($thedatetochange . 'first of the next month'));

       return $value;
    }
else if ( $field->id == '2' amp;amp; $value == 'the 15th') {
       $merge_tag = '{the_next_date}';
       $thedatetochange = 'Not sure how to get the date value here...';
       $the_first_date = date('m/d/Y', strtotime($thedatetochange . 'first of the next month' ));
       $value = date('m/d/Y', strtotime($the_first_date . ' 15 days' ));

       return $value;
    }
}, 10, 5 );
  

Ответ №2:

Итак, после дополнительных поисков смогу ли я использовать что-то подобное для получения значения поля?

 $theDateToChange = rgar( $entry, ‘3’);
  

Предполагается, что поле 3 является значением даты. Сработает ли это для получения текущей даты ввода?

Ответ №3:

$entry Пропускается через фильтр gform_replace_merge_tags. Вы можете извлечь любое значение поля из $entry по его идентификатору поля. Например, если ваш идентификатор поля был равен 1:

 $value = $entry[1];
  

В качестве альтернативы, если вы готовы использовать эту измененную дату в качестве дополнительного поля даты в вашей форме, у нас есть фрагмент, который может обрабатывать функциональность за вас.

https://gravitywiz.com/populate-dates-gravity-form-fields/

 new GW_Populate_Date( array(
 'form_id' => 1,
 'target_field_id' => 2,
 'modifier' => ' 30 days'
) );
  

Комментарии:

1. Эй, Дэвид, я на самом деле прочитал эту статью несколько раз, чтобы посмотреть, могу ли я что-то сделать со своей. Проблема, с которой я сталкиваюсь с вашей, заключается в том, что мне нужно было бы добавить функциональность if / else. Более или менее мне нужно было бы создать несколько массивов GW_Populate_date. Поверьте мне, я был очень увлечен этим. Но мне нужно иметь возможность обновлять дату на 1 месяц, 3 месяца, 6 месяцев и 1 год в зависимости от опции, которую определяет пользователь.

Ответ №4:

Итак, вот мой текущий рабочий код…

     add_action( 'gform_admin_pre_render', 'add_merge_tags' );
function add_merge_tags( $form ) {
    ?>
    <script type="text/javascript">
        gform.addFilter('gform_merge_tags', 'add_merge_tags');
        function add_merge_tags(mergeTags, elementId, hideAllFields, excludeFieldTypes, isPrepop, option){
            mergeTags["custom"].tags.push({ tag: '{the_next_date}', label: 'The Next Date' });

            return mergeTags;
        }
    </script>
    <?php
    //return the form object from the php hook
    return $form;
}

add_action('wp', 'add_merge_tags');

/** MY MERGE TAGS HERE */

add_filter( 'gform_replace_merge_tags', 'new_date', 10, 7 ); 
function new_date( $value, $merge_tag, $options, $field, $raw_value, $entry, $text, $form, $url_encode, $esc_html, $nl2br, $format ) {

    $pmoptions = $entry[7];

if ( $pmoptions == 'Monthly') {

       $merge_tag = '{the_next_date}';
       $old_date = $entry[2];
       $new_date = date('m/d/Y', strtotime( $old_date . ' 1 month'));

       return str_replace( $merge_tag, $new_date, $text );
    }
else if ( $pmoptions == 'Quarterly') {

       $merge_tag = '{the_next_date}';
       $old_date = $entry[2];
       $new_date = date('m/d/Y', strtotime( $old_date . ' 3 month'));

       return str_replace($merge_tag, $new_date, $text);
    }
}

apply_filters( 'gform_replace_merge_tags', $value, $merge_tag, $options, $field, $raw_value, $entry, $text, $form, $url_encode, $esc_html, $nl2br, $format );