Dynamické přidání pravidel k prvkům

acid303
Člen | 6
+
0
-

Ahoj,
Mám ve formuláři DependentSelectBox (NasExt), jehož callback mimo jiné používám k dynamickému přidání pravidel určitým prvkům formuláře, protože se načtou až závisle na hodnotě jiného select boxu. Přidání pravidel jsem vyřešil, funguje však tak, že když odešlu formulář poprvé, nic se nestane (možná se zvalidují výchozí pravidla), a až když jej odešlu podruhé, provede se validace s dynamicky přidanými pravidly. Nevíte, jak ten formulář překreslit tak, aby zaregistroval nová pravidla a zároveň neporušil závislosti DependentSelectBoxu?
Zkoušel jsem render(), fireRenderEvents(), fireEvents() ale všechny skončí v cyklu a vyhodí Maximum function nesting level of '256' reached, aborting!

Posílám snippet z callbacku DependentSelectBoxu:

$form->addDependentSelectBox('jp_type', 'md.jackpot.level.table.type', $form['jp_type_id'])
                ->setDependentCallback(function ($values) {
                    $data = new \NasExt\Forms\DependentData;
                    $jp = $this->jackpotTypeModel->get($values["jp_type_id"]);
                    foreach($jp["config"] as $key => $conf) {
                        if(isset($this["jackpotLevelForm"]->components[$key])) {
                            $this["jackpotLevelForm"]->components[$key]->getRules()->reset();
                            $this["jackpotLevelForm"]->components[$key]->setRequired(true);
                            $this["jackpotLevelForm"]->components[$key]->addRule(Form::MIN, "Nejméně ".($conf["min"] ?? 0), ($conf["min"] ?? 0));
                            $this["jackpotLevelForm"]->components[$key]->addRule(Form::MAX, "Maximálně ".($conf["max"] ?? PHP_INT_MAX), ($conf["max"] ?? PHP_INT_MAX));
                            $this["jackpotLevelForm"]->components[$key]->getRules()->check(); //Check nezabere
                    }
                    $this["jackpotLevelForm"]->render(); // Render skončí cyklem
                    }
                    return $data;
                });

Editoval acid303 (4. 2. 2020 11:30)

acid303
Člen | 6
+
0
-

Tak jsem to nakonec vyřešil jinak. Na ten config se ptám při změně selectu AJAXem, z něj pak vytvořím pravidla a ručně je přidám do atributu data-nette-rules
Kdyby to někoho zajímalo, připojuji kód.

<script>
    $(function() {
        $("[name='jp_type_id']").change(function(e) {
        $.nette.ajax({
            method: "GET",
            url: {link getConfig!},
            data: { id: $(this).val() },
            success: function(res) {
                applyConfig(res.config);
            }
        });
    });

    function applyConfig(config) {
    for(var key in config) {
        if(config.hasOwnProperty(key)){
            if(key !== "type" && key !== "type_add") {
                var rules = JSON.parse($("[name='"+key+"']").attr("data-nette-rules")); // Načtu výchozí pravidla
                rules.forEach(function(v, i) {
                    if(v.op === ":min" || v.op === ":max") {
                        rules.splice(i, 1); // Odeberu původní min a max
                }
                });
				// Přidám dynamická pravidla
                if(typeof config[key].min !== "undefined") {
                    rules.push({ op: ":min", msg: "Nejméně "+config[key].min, arg: config[key].min });
                }
                if(typeof config[key].max !== "undefined") {
                    rules.push({ op: ":max", msg: "Maximálně "+config[key].max, arg: config[key].max });
                }
                $("[name='"+key+"']").attr("data-nette-rules", JSON.stringify(rules)); // A vrátím do atributu
                }
        }
    }
    }
    });

</script>
jokas
Člen | 14
+
0
-

Ahoj,

zajímavé řešení, které chci využít právě pro dynamické odstránění pravidel a skrytí některých polí na základě dát v DB, ale je to funkční jenom pro událost onSubmit a ne pro onSuccess. Je to správně, nebo je možné pravidla nastavit tak, aby to prošlo i pro událost onSuccess?

acid303
Člen | 6
+
0
-

jokas napsal(a):

Ahoj,

zajímavé řešení, které chci využít právě pro dynamické odstránění pravidel a skrytí některých polí na základě dát v DB, ale je to funkční jenom pro událost onSubmit a ne pro onSuccess. Je to správně, nebo je možné pravidla nastavit tak, aby to prošlo i pro událost onSuccess?

Ahoj, moc dobře nerozumím, na co se ptáš? Já formulář zpracovávám handlerem onSuccess a prochází mi to bez problému, pokud tedy validuješ formulář jen na straně klienta, neměl by nastat žádný problém.