Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,14 @@
Changelog
=========

Version 5.0.2 - TBD
--------------------------

### Neu

* YORM: `setExcludeFields()` Methode hinzugefügt, um Felder vom generierten Formular auszuschließen - nützlich für die Erstellung von Formularen mit weniger Feldern, wie z.B. bei User-Profilen, wo bestimmte Felder nicht bearbeitet werden sollen


Version 5.0.1 - 25.06.2025
--------------------------

Expand Down
39 changes: 39 additions & 0 deletions docs/04_yorm.md
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,43 @@ $yform = $post->getForm();
echo $post->executeForm($yform)
```

<a name="felder-excluden"></a>

#### Felder vom Formular ausschließen

Mit `setExcludeFields()` können bestimmte Felder vom generierten Formular ausgeschlossen werden. Dies ist nützlich, wenn z.B. bei einem User-Profil der Name und Vorname nicht mehr angezeigt oder bearbeitet werden sollen, oder wenn das Formular mit weniger Details benötigt wird.

```php
<?php
$dataset = rex_yform_manager_dataset::get($id, 'rex_kontakte');

// Felder 'name' und 'vorname' vom Formular ausschließen
$dataset->setExcludeFields(['name', 'vorname']);

$yform = $dataset->getForm();

// Optional: Ausgeschlossene Felder als Hidden-Felder setzen,
// um deren Werte beim Speichern beizubehalten
$yform->setValueField('hidden', ['name', $dataset->getValue('name'), 'REQUEST']);
$yform->setValueField('hidden', ['vorname', $dataset->getValue('vorname'), 'REQUEST']);

echo $dataset->executeForm($yform);
```

Das gleiche Prinzip funktioniert auch für neue Datensätze:

```php
<?php
$dataset = rex_yform_manager_dataset::create('rex_kontakte');

// Nur bestimmte Felder im Formular anzeigen
$dataset->setExcludeFields(['status', 'created_at', 'updated_at']);

$yform = $dataset->getForm();
echo $dataset->executeForm($yform);
```


<a name="methoden-referenz"></a>

## Methoden-Referenz
Expand Down Expand Up @@ -535,6 +572,7 @@ $dataset = rex_yform_manager_query::get('rex_yf_example')
- get
- getAll
- getData (liefert Felder als Array zurück)
- getExcludedFields (liefert ausgeschlossene Felder als Array zurück)
- getForm (liefert Formular zurück - EXPERIMENTELL!)
- getId
- getMessages
Expand All @@ -546,6 +584,7 @@ $dataset = rex_yform_manager_query::get('rex_yf_example')
- getValue
- hasValue
- isValid
- setExcludeFields (schließt Felder vom generierten Formular aus, siehe [Felder vom Formular ausschließen](#felder-excluden))
- loadData

<a name="debugging"></a>
Expand Down
30 changes: 30 additions & 0 deletions lib/manager/dataset.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ class rex_yform_manager_dataset
/** @var bool */
private $historyEnabled = true;

/** @var string[] */
private array $excludedFields = [];

final private function __construct(string $table, ?int $id = null)
{
$this->table = $table;
Expand Down Expand Up @@ -651,6 +654,28 @@ public function setHistoryEnabled(bool $historyEnabled): void
$this->historyEnabled = $historyEnabled;
}

/**
* Set fields to exclude from the form.
*
* @param string[] $fields Array of field names to exclude
* @return $this
*/
public function setExcludeFields(array $fields): self
{
$this->excludedFields = $fields;
return $this;
}

/**
* Get fields to exclude from the form.
*
* @return string[]
*/
public function getExcludedFields(): array
{
return $this->excludedFields;
}

public function __isset(string $key): bool
{
return $this->hasValue($key);
Expand Down Expand Up @@ -692,6 +717,11 @@ private function createForm(): rex_yform
$yform->setDebug(self::$debug);

foreach ($fields as $field) {
// Skip excluded fields
if (in_array($field->getName(), $this->excludedFields, true)) {
continue;
}

/** @var class-string<rex_yform_base_abstract> $class */
$class = 'rex_yform_' . $field->getType() . '_' . $field->getTypeName();

Expand Down
33 changes: 33 additions & 0 deletions tests/rex_yform_yorm_test.php
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,39 @@ public function testTableAPI()
$cat2->getId(),
])
->save();

// Test exclude fields functionality
$testDataset = rex_yform_manager_dataset::create($tableName)
->setValue($fieldName, 'Test Exclude Fields');
$testDataset->save();

// Get dataset and test field exclusion
$datasetWithExclude = rex_yform_manager_dataset::get($testDataset->getId(), $tableName);

// Set fields to exclude
$datasetWithExclude->setExcludeFields([$fieldName]);

// Verify excluded fields are stored
static::assertEquals(
[$fieldName],
$datasetWithExclude->getExcludedFields(),
'excluded fields should be stored correctly',
);

// Get form and verify excluded field is not in the form
$yform = $datasetWithExclude->getForm();
$formFields = [];
foreach ($yform->objparams['values'] as $valueField) {
if (isset($valueField->params['name'])) {
$formFields[] = $valueField->params['name'];
}
}

static::assertNotContains(
$fieldName,
$formFields,
'excluded field should not be in form values',
);
}
}

Expand Down
Loading