Проверка на стороне сервера NinjaForms заморожена при «обработке» - PullRequest
0 голосов
/ 31 марта 2019

Я работаю с Ninja Forms на Wordpress 5.1.1, чтобы отправить простую форму.Однако мне нужна простая проверка на стороне сервера.Я просеивал несколько дней через документацию и Интернет, но не могу найти решение этой проблемы.

До сих пор я был в состоянии прикрепить свою функцию к ninja_forms_submit_data веб-крючку формы ниндзя.Я подтвердил, что PHP действительно выполняется.Однако, когда я отправляю форму, она застревает на «Обработка», когда я пытаюсь вернуть пользовательскую ошибку.Я считаю, что это как-то связано с форматом ответа AJAX, но я не уверен.Это может быть даже безопасность сайта, блокирующая запрос, но я сомневаюсьСкорее всего, на мой взгляд, это мое принципиальное отсутствие недопонимания того, как NinjaForms работает на бэкэнде.

На этом этапе я даже хотел бы выполнить проверку на стороне клиента (безопасность в контексте не имеет решающего значения).Но я даже не уверен, как это будет достигнуто.

Мой опыт в основном связан с C / C ++, Java, Python и Ruby.PHP немного сбивает меня с толку.Мы ценим любую помощь, которую вы можете предоставить.

Это проверка, вызванная в моем фильтре.Независимо от того, если я установлю $errors на [], отправка будет остановлена ​​при обработке.Это ТОЛЬКО происходит, если выполняется блок if( !validateSite( $form_data, $field_id ) ).В противном случае форма отправляется совершенно нормально.Обработка зависает только в том случае, если об ошибках не сообщается.

function validateSite($form_data, $field_id){
    // $site_code = $form_data['fields'][$field_id]['value'];

    $form_fields   =  $form_data[ 'fields' ];
    foreach( $form_fields as $field ) 
    {
        $field_id    = $field[ 'id' ];    
        $field_key   = $field[ 'key' ];
        $field_value = $field[ 'value' ];

        // Example Field Key comparison
        if( "site_code_1552245398425" == $field_key ) 
        //I Strongly Suspect that this site code is never found,
        //as I can never get this method to return false without
        //hard-setting the default return. (Regardless whether or
        //not the input is even or odd.)
        {
            if(intval($field_value) % 2 != 0) //EXAMPLE TEST
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }  
    return false; //hard set to false
}

Этот фильтр выполняется:

add_filter( 'ninja_forms_submit_data', function( $form_data ){
  $field_id = 'nf-field-21';

  if( !validateSite( $form_data, $field_id ) ) 
  {

    $errors = [];
    $form_fields   =  $form_data[ 'fields' ];
    foreach( $form_fields as $field ) //iterate through the fields
    {
        $field_id    = $field[ 'id' ];
        $field_key   = $field[ 'key' ];
        $field_value = $field[ 'value' ];

        if($field_key == "site_code_1552245398425")
        {
            //$errors = ['fields'][$field_id] = "INVALID SITE CODE";
            $errors = ['fields' => [$field_id => "INVALID SITE CODE"]];
        }
    }

    /*
    $errors = [ 'fields' => [ 'nf-field-21' => __( 'Invalid Site Code.', 'my-plugin' ) ],];
    */
    $response = [
        'errors' => $errors,
    ];
    echo wp_json_encode( $response );
    wp_die(); // this is required to terminate immediately and return a proper response
  }
  // If no errors, be sure to return the $form_data.
    return $form_data;
});

1 Ответ

0 голосов
/ 31 марта 2019

Пройдя немного поиск, мне удалось найти собственный ответ.Учитывая отсутствие подробной документации по этой теме, я считаю, что кто-то может найти это полезным.Код ниже работает эффективно. ЭТА ссылка очень помогла.

function validateSite($form_data, $fieldID)
{
    if(intval($form_data['fields'][$fieldID]['value']) % 31 == 0)
    {
        return true; //No errors
    }
    else
    {
        return false; //ERROR!
    }
}

add_filter( 'ninja_forms_submit_data', function( $form_data ){
  $field_id = 21; //Field ID is NUMERICAL and not a string like 'nf-field-21', despite what you see in the front-end html.

  if( !validateSite( $form_data, $field_id ) ) 
  {
      //This is the EASY way to set an error on a field.
      $form_data['errors']['fields'][21] = "INVALID SITE CODE";
  }

  // If no errors, be sure to return the $form_data.
    return $form_data;
});
...