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 |
die Gegenmethode existiert bereits – allerdings mit einer Einschränkung
###removeTablefield()` – Felder aus dem Schema entfernenQuelle:
Die Methode löscht ausschließlich nach
table_name+name. Das bedeutet:type_id = 'value') ist das in Ordnung – es gibt pro Name nur einen Eintrag.type_id = 'validate') kann es aber mehrere Einträge mit demselbennamegeben (z. B.validate|empty|phoneundvalidate|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 nichtvalidate|empty|phone), musst du direkt per SQL löschen:DB-Spalte ebenfalls entfernen?
removeTablefield()löscht nur den Eintrag inrex_yform_field– die eigentliche Datenbankspalte bleibt erhalten. Falls die Spalte auch aus der DB-Tabelle gelöscht werden soll:Zusammenfassung
removeTablefield($table, $name)type_id+type_nameals FilterALTER TABLE … DROP COLUMNremoveTablefield()automatisch erledigt; bei manuellem SQL manuellrex_yform_manager_table::deleteCache()aufrufen