Comments (14)
Ich hab einen leicht anderen Ansatz über einen Trait gewählt. Das hat den Vorteil, dass man den Trait einfach bei den Model-Klassen hinzufügen kann und keine abgeleiteten Klassen braucht.
<?php
namespace Project\Trait;
use rex_i18n
, rex_yform
, rex_yform_value_submit
, rex_yform_value_be_manager_relation;
trait Clonable
{
/**
* @param null|callable(rex_yform):void $afterFieldsExecuted
*/
public
function executeForm(rex_yform $yform, callable $afterFieldsExecuted = null): string
{
// clone angefordert? Wenn nein: normale Bearbeitung
if (1 !== rex_request('clone', 'integer', 0)) {
return parent::executeForm($yform, $afterFieldsExecuted);
}
// clone angefordert! afterFieldsExecuted wird durch ein eigenes Callback ersetzt,
$callback = function (rex_yform $yform) use ($afterFieldsExecuted) {
// Titelzeile frisieren: mangels EP wird die i18n-Tabelle geändert.
rex_i18n::addMsg('yform_editdata', 'Datensatz klonen [Original: {0}]');
// Für das Formular an sich: Auf "Add" umschalten, indem func auf "add" gesetzt und
// die Datensatznummer entfernt wird.
$yform->objparams['form_hiddenfields']['func'] = 'add';
unset($yform->objparams['form_hiddenfields']['data_id']);
// Änderungen in den Values: jeweils den vorgenerierten HTML-Code ändern
foreach ($yform->objparams['values'] as $k => $v) {
// Submit-Buttons von "Edit" auf "Add" zurückstellen
if ($v instanceof rex_yform_value_submit) {
$yform->objparams['form_output'][$k] = str_replace(
[rex_i18n::msg('yform_save') . '</button', rex_i18n::msg('yform_save_apply') . '</button'],
[rex_i18n::msg('yform_add') . '</button', rex_i18n::msg('yform_add_apply') . '</button'],
$yform->objparams['form_output'][$k]
);
continue;
}
// im Feldtyp be_manager_relation / Typ 5 (=inline) ebenfalls die hidden-inputs mit
// der Datensatz-ID der verbundenen Sätze entfernen
// Nur "inline" ist problematisch;
if ($v instanceof rex_yform_value_be_manager_relation && 5 == $v->getElement('type')) {
$fieldName = preg_quote($v->getFieldName());
$pattern = '/<input type="hidden" name="' . $fieldName . '(\[\d+\])*\[id\]" value="\d+" \/>/';
$yform->objparams['form_output'][$k] = preg_replace($pattern, '', $yform->objparams['form_output'][$k]);
}
}
call_user_func($afterFieldsExecuted, $yform);
};
return parent::executeForm($yform, $callback);
}
}
project/boot.php
\rex_extension::register('YFORM_DATA_LIST', function (\rex_extension_point $ep) {
/** @var \rex_list $list */
$list = $ep->getSubject();
if (rex_get('rex_yform_manager_opener', 'bool')) {
return $list;
}
// clone link
if ($className = \rex_yform_manager_dataset::getModelClass($ep->getParam('table')->getTableName())
and in_array(Clonable::class, class_uses($className))) {
$name = $list->getColumnNames()[0];
if (str_contains($name, 'href="index.php?func=add')) {
$list->addColumn('clone', '<i class="rex-icon rex-icon-duplicate"></i>', 1);
$list->setColumnLayout('clone', ['<th></th>', '<td class="rex-table-icon">###VALUE###</td>']);
$params = $list->getColumnParams($name);
$params['clone'] = 1;
$list->setColumnParams('clone', $params);
}
}
return $list;
});
Model-Klasse
<?php
namespace Project\Model;
use Project\Trait\Clonable;
class ModelClass extends \rex_yform_manager_dataset
{
use Clonable;
}
from tricks.
PR für YForm wäre super
Wenn das so einfach wäre, ich hab´s mal probiert, aber das ist mir insgesamt zu heikel.
das Klonen bitte in das Dropdown.
In der neuen Version #311 ist es so gebaut, dass man beide Varianten wählen kann. Al Gusto
Habe gleichzeitig das Yform_usability angehabt. Dabei verschwand mal das Prio-Feld oder plötzlich gab es wieder den Bleistift zu sehen.
Hm, könnte mit fest verdrahteten Spaltennummer zu tun haben (0 = Edit, 1 = Clone). Baue ich aber nix für ein
from tricks.
Würde das auch das Kopieren von Datensätzen mit Relationen ermöglichen?
from tricks.
Ich bin da sehr zuversichtlich. Bei 1-n inline nutze ich es intensiv ohne Probleme. Bei den normalen Varianten 1 bis 4 (select/popup) sollte es für kein 1-n-Relationeneh kein Problem geben, denn die haben ja keine Relationen-Tabelle.
Bei n-m-Relationen via Relationentabelle bin ich mir nicht sicher; ich meine es mal ausprobiert zu haben. Vermutung: ja
from tricks.
Wenn ich das so eingebe wie von Dir hier beschrieben bekomme ich:
Too few arguments to function Dataset::YFORM_DATA_LIST(), 0 passed in …and exactly 1 expected
Das passiert wenn ich rex_extension::register('rex_extension_point', Dataset::YFORM_DATA_LIST())
; einsetze.
from tricks.
Es gibt bereits 2 Tricks in diese Richtung. Vielleicht machen wir aus diesen drei einen Trick mit allen möglichen Varianten oder besser noch einen PR für YForm selbst?
from tricks.
Wenn ich das so eingebe wie von Dir hier beschrieben bekomme ich: ...
Danke für den Hinweis, hab es geändert.
rex_extension::register('YFORM_DATA_LIST', 'Dataset::YFORM_DATA_LIST');
from tricks.
GETESTET UND SUPER GEIL. @tbaddade ich würde diese Lösung favorisieren. 1-n Relationen wurden übernommen. Klasse.
@christophboecker PR für YForm wäre super und das Klonen bitte in das Dropdown.
Habe gleichzeitig das Yform_usability angehabt. Dabei verschwand mal das Prio-Feld oder plötzlich gab es wieder den Bleistift zu sehen.
from tricks.
Super coooll! DANKE!
from tricks.
@xong Was passiert denn, wenn ich in der Klasse ModelClass
die Methode executeForm
erweitern will? Kann man das; ich dachte bisher, dass das zu Konflikten führt?
from tricks.
Dann müsstest du den Trait anders einbinden:
use Clonable {
executeForm as cloneExecuteForm;
}
public function executeForm(rex_yform $yform, callable $afterFieldsExecuted = null): string
{
return $this->cloneExecuteForm($yform, $afterFieldsExecuted);
}
Hab ich aber nicht getestet.
Wollte hier nur mal meinen Weg darstellen.
from tricks.
Es gibt bereits 2 Tricks in diese Richtung.
@tbaddade Hast natürlich recht. Und einer der beiden ist ziemlich genau diese Lösung - kein Wunder, ist ja von mir. Autsch. Ich hab auch sofort das New-Trick-Label entfernt.
from tricks.
Aber hier hast du es einfacher erklärt @christophboecker :-)
from tricks.
Was wir vermeiden sollten, dass zum Schluss vier Tricks auf der Seite sind und keiner weiß welchen er nehmen soll.
from tricks.
Related Issues (20)
- YForm Trick: Kontaktformular an richtige Ansprechpartner-E-Mail-Adresse, ohne E-Mail-Adresse offenzulegen HOT 1
- Neuer Trick: Artikel-Metadaten aus YForm-Tabelle per Ajax im Artikel hinzufügen HOT 14
- Mediapool - externe Datei in den Medienpool synchronisieren HOT 3
- Neue Tipps & Tricks: Backups – Warum, wann und wie durchführen? HOT 8
- rex_list Datensatz duplizieren HOT 3
- Eigene Addons in der Backend Navigation oben plazieren HOT 7
- Modul Tipp: Repeater HOT 7
- Info: Sortierung Medienpool aufsteigend HOT 2
- Problem: Rendern nummerierter Listen mit Unterbrechung HOT 2
- UPDATE Tricks > Development > VSCode 1/2
- UPDATE Tricks > Development > VSCode 2/2 HOT 4
- REDAXO & XAMPP für Windows HOT 4
- Seitentitel und Metadaten anpassen mit Daten, die erst im Modul erzeugt werden HOT 1
- Image URL bei Repeater ist defekt HOT 1
- VSCode und Redaxos PHP_CS_FIXER_CONFIG (auf dem Mac) HOT 1
- REDAXO Klassen ausserhalb REDAXO Kontext nutzen HOT 1
- Suchfunktion zeigt keine neuen Treffer HOT 5
- YForm Upload als Download bereitstellen
- `iwcc` entfernen
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from tricks.