Skip to content

YForm Validierung programmatisch löschen können ohne ein Feld zu löschen #537

Description

@iriswerner

die Gegenmethode existiert bereits – allerdings mit einer Einschränkung

### removeTablefield()` – Felder aus dem Schema entfernen

<?php
// Entfernt ALLE Einträge in rex_yform_field mit diesem table_name + name
rex_yform_manager_table_api::removeTablefield('rex_ycom_user', 'custom_field');

Quelle:

public static function removeTablefield(string $table_name, string $field_name): void
{
    $f = rex_sql::factory();
    $f->setDebug(self::$debug);
    $f->setQuery('delete from ' . rex_yform_manager_field::table() . ' where table_name=:table_name and name=:name', [':table_name' => $table_name, ':name' => $field_name]);

    rex_yform_manager_table::deleteCache();
}

⚠️ Kritische Einschränkung: Validierungen werden nicht eindeutig gelöscht

Die Methode löscht ausschließlich nach table_name + name. Das bedeutet:

  • Bei einem value-Feld (type_id = 'value') ist das in Ordnung – es gibt pro Name nur einen Eintrag.
  • Bei einer Validierung (type_id = 'validate') kann es aber mehrere Einträge mit demselben name geben (z. B. validate|empty|phone und validate|type|phone). removeTablefield() löscht dann alle Validierungen für diesen Feldnamen auf einmal.

Wenn du nur eine bestimmte Validierung entfernen möchtest (z. B. nur validate|type|phone, aber nicht validate|empty|phone), musst du direkt per SQL löschen:

<?php
// Nur eine bestimmte Validierung entfernen (z. B. type-Validator für 'phone')
rex_sql::factory()->setQuery(
    'DELETE FROM ' . rex_yform_manager_field::table()
    . ' WHERE table_name = :table_name'
    . '   AND name = :name'
    . '   AND type_id = :type_id'
    . '   AND type_name = :type_name',
    [
        ':table_name' => 'rex_ycom_user',
        ':name'       => 'phone',
        ':type_id'    => 'validate',
        ':type_name'  => 'type',   // z. B. 'type', 'empty', 'size_range', …
    ]
);

rex_yform_manager_table::deleteCache();

DB-Spalte ebenfalls entfernen?

removeTablefield() löscht nur den Eintrag in rex_yform_field – die eigentliche Datenbankspalte bleibt erhalten. Falls die Spalte auch aus der DB-Tabelle gelöscht werden soll:

<?php
$tableName  = 'rex_ycom_user';
$fieldName  = 'custom_field';

// 1. Aus YForm-Schema entfernen
rex_yform_manager_table_api::removeTablefield($tableName, $fieldName);

// 2. DB-Spalte droppen (nur wenn wirklich gewünscht – Datenverlust!)
rex_sql::factory()->setQuery(
    'ALTER TABLE `' . $tableName . '` DROP COLUMN `' . $fieldName . '`'
);

Tipp: Bei Validierungs-Feldern (no_db = 1) existiert keine DB-Spalte, der DROP-Schritt entfällt dann.


Zusammenfassung

Ziel Methode
Value-Feld + alle seine Validierungen entfernen removeTablefield($table, $name)
Nur eine bestimmte Validierung entfernen Direktes SQL mit type_id + type_name als Filter
Auch DB-Spalte entfernen Zusätzlich ALTER TABLE … DROP COLUMN
Cache aktualisieren Wird von removeTablefield() automatisch erledigt; bei manuellem SQL manuell rex_yform_manager_table::deleteCache() aufrufen

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions