Проверка дублирующихся записей в Gravity Forms

Я работаю над плагином WordPress, который расширяет Gravity Forms. Мне нужно добавить некоторые функции для проверки повторяющихся записей. Я использую GFAPI::get_entries( $form_id, $search_criteria );, чтобы найти и перечислить все записи, связанные с моей формой Gravity, которые соответствуют определенным критериям поиска. Вот фрагмент кода:

// Fetch field_ids, establish search criteria
    $first_id = $last_id = $address_id = 0;
    foreach ( $form['fields'] as $field ) {
        if ( $field->get_input_type() == 'name' ) {
            $first_id = $field->id . '.3';
            $last_id  = $field->id . '.6';
            break;
        }
    }
    foreach ( $form['fields'] as $field ) {
        if ( $field->get_input_type() == 'address' ) {
            $address_id = $field->id . '.1';
            break;
        }
    }
    $search_criteria['field_filters'] = array(
        array( 'key' => $first_id, 'value' => $data['voterdata_FirstName'] ),
        array( 'key' => $last_id, 'value' => $data['voterdata_LastName'] ),
        array( 'key' => $address_id, 'value' => $data['voterdata_VoterAddress'] )
    );
    $search_criteria['status'] = 'active';
    $entries = GFAPI::get_entries( $form_id, $search_criteria );

var_dump(); из $entries возвращает все записи для моей формы, соответствующие критериям поиска. Если существует более одной записи, содержащей одно и то же имя, фамилию и комбинацию адресов, я хочу перенаправить своих пользователей на другую страницу, чтобы они могли подтвердить, какая запись принадлежит им. Каков наилучший подход к проверке $entries на наличие дубликатов?

Заранее спасибо,


person marcusnjones    schedule 12.08.2015    source источник


Ответы (2)


Вы можете использовать in_array

Пример:

<?php
$results = [
    ['firstName' => 'Bob', 'lastName' => 'Dole', 'address' => '123 Test'],
    ['firstName' => 'Jon', 'lastName' => 'Doe', 'address' => '444 Foo'],
    ['firstName' => 'Bob', 'lastName' => 'Dole', 'address' => '333 Test']
];

$test = ['firstName' => 'Bob', 'lastName' => 'Dole', 'address' => '123 Test'];

$test2 = ['firstName' => 'Jon', 'lastName' => 'Dole', 'address' => '999 Test'];

$test3 = ['lastName' => 'Jon', 'firstName' => 'Dole', 'address' => '999 Test'];

var_dump(in_array($test, $results));   // This should match
var_dump(in_array($test2, $results));  // This should not match
var_dump(in_array($test3, $results));  // This should not match

Выход:

bool(true)
bool(false)
bool(false)

Изменить

Только что понял, что вы уже ищете... В этом случае вы можете использовать wp_redirect(), если $entries не пусто... Я предполагаю, что вы проверяете данные ПЕРЕД их вставкой, верно? Вы должны, если нет.

person Rob W    schedule 12.08.2015
comment
Поиск выполняется после создания записи, потому что на самом деле я не хочу предотвращать создание новых записей. Я просто хочу дать своим пользователям возможность различать, какая запись принадлежит им. Я пробовал использовать in_array() и wp_redirect() безрезультатно. - person marcusnjones; 12.08.2015
comment
Тогда вам не нужно будет использовать in_array(). Просто подсчитайте общее количество $entries -- если ваши field_filters работают правильно или определены правильно, и вы видите более 1, выполните перенаправление (или что-то еще) и обработайте его соответствующим образом. - person Rob W; 12.08.2015

Я нашел решение:

if ( count( array_unique( $entries ) ) < count( $entries ) ) {
        # do something ...
    }

Наверняка это не единственный подход. Но надеюсь кому-то поможет!

person marcusnjones    schedule 12.08.2015