yform icon indicating copy to clipboard operation
yform copied to clipboard

yform 4.0.2 rest api: filterung funktioniert nicht

Open isospin opened this issue 3 years ago • 1 comments

nach dem update von yforn 3.4.2 auf 4.0.2 funktioniert die filterung über filter[feldname]=suchwert parameter nicht mehr.

es gibt folgende fehlermeldung:

message: field-class-not-found
status: 400

folgendes beispiel funktioniert unter 3.4.2 und wirft unter 4.0.2 den fehler:

/rest/v2/npe_countries?token=ae0fef3f64f08d26862aa9ab2ad972f8&filter[status]=1

$route = new \rex_yform_rest_route(
    [
        'path' => '/v2/npe_countries/',
        'auth' => '\rex_yform_rest_auth_token::checkToken',
        'type' => \NPE15_countries_v2::class,
        'query' => \NPE15_countries_v2::query(),
        'get' => [
            'fields' => [
                'NPE15_countries_v2' => [
                    'country__name',
                    'country__code',
                    'status'
                ]
            ],
            'filter' => [
                'country__code',
                'status'
            ]
        ]
    ]
);
\rex_yform_rest::addRoute($route);

isospin avatar Apr 29 '22 17:04 isospin

anscheinend hat sich die funktion, die hier aufgerufen wird geändert https://github.com/yakamara/redaxo_yform/blob/b51a3593310b7a3951fb4e578ac3b82292d0dd9f/plugins/rest/lib/rest/route.php#L473

H A C K :

wenn ich die zeilen

$rawQuery = $field->getObject()->getSearchFilter([ 'value' => $filterValue, 'field' => $field, ]);

durch die (etwas angepassten) zeilen aus der alten funktion ersetze funktioniert es erstmal wieder:


/*
$rawQuery = $field->getObject()->getSearchFilter([
    'value' => $filterValue,
    'field' => $field,
]);
*/
                                

$sql = rex_sql::factory();
$value = $filterValue;
$field = $field;

if ($value == '(empty)') {
    $rawQuery = ' (' . $sql->escapeIdentifier($field) . ' = "" or ' . $sql->escapeIdentifier($field) . ' IS NULL) ';
} elseif ($value == '!(empty)') {
    $rawQuery = ' (' . $sql->escapeIdentifier($field) . ' <> "" and ' . $sql->escapeIdentifier($field) . ' IS NOT NULL) ';
} else {
    $pos = strpos($value, '*');
    if ($pos !== false) {
        $value = str_replace('%', '\%', $value);
        $value = str_replace('*', '%', $value);
        $rawQuery = $sql->escapeIdentifier($field) . ' LIKE ' . $sql->escape($value);
    }else{
        $rawQuery = $sql->escapeIdentifier($field) . ' = ' . $sql->escape($value);                                        
    }
}

isospin avatar Apr 30 '22 13:04 isospin

sollte nun passen. Gerne testen

dergel avatar Sep 19 '22 11:09 dergel