Git Product home page Git Product logo

Comments (14)

xong avatar xong commented on July 18, 2024 1

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.

christophboecker avatar christophboecker commented on July 18, 2024 1

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.

skerbis avatar skerbis commented on July 18, 2024

Würde das auch das Kopieren von Datensätzen mit Relationen ermöglichen?

from tricks.

christophboecker avatar christophboecker commented on July 18, 2024

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.

skerbis avatar skerbis commented on July 18, 2024

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.

tbaddade avatar tbaddade commented on July 18, 2024

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.

christophboecker avatar christophboecker commented on July 18, 2024

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.

skerbis avatar skerbis commented on July 18, 2024

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.

olien avatar olien commented on July 18, 2024

Super coooll! DANKE!

from tricks.

christophboecker avatar christophboecker commented on July 18, 2024

@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.

xong avatar xong commented on July 18, 2024

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.

christophboecker avatar christophboecker commented on July 18, 2024

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.

skerbis avatar skerbis commented on July 18, 2024

Aber hier hast du es einfacher erklärt @christophboecker :-)

from tricks.

tbaddade avatar tbaddade commented on July 18, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.