redrawControl mezi dvěma šablonama

kalipny
Člen | 19
+
0
-

Ahoj,

Mám komponentu, k ní mám vytvořenou šablonu X a Y.
Signálem komponenty změním šablonu X na šablonu Y, která v sobě obsahuje fomulář. – to Funguje

Problém je, že Když dám redrawControl při zpracování formuláře, který je v šabloně Y, tak se mi komponenta překreslí, ale nastaví se mi tam původní šablona bez formuláře. Nevíte jak na to?

Ještě poznámka: vše provádím ajaxem.

Díky za odpověď.

Konstrukce komponenty je standardní:

<?php
class PolozkaCmp extends UI\Control
{
    private x;

    function __construct()
    {
        parent::__construct();
        $this->x = 100;
    }


    public function handlesignalX(){

        $this->x = 200;
        $this->getpresenter()->redrawControl('panel');
    }

    public function handlesignalY(){

        $this->x = 100;
        $this->getpresenter()->redrawControl('panel');
    }


    public function render( )
    {


        if ($this->x == 100) {
            $this->template->setFile(__DIR__ . '/'.strtolower('sablonax.latte')');
        } elseif ($this->x == 200) {
            $this->template->setFile(__DIR__ . '/'.strtolower('sablonay.latte'));
        }

        $this->template->render();
    }



//======================================================================================================

    protected function createComponentPForm($name)
    {

        $form = new \PForm();

        return $form;
    }

}
?>
Polki
Člen | 553
+
0
-

Jde o to, že při zpracování formuláře se nastartuje celý životní cyklus, čímž dojde ke znovu inicializování tvé komponenty a v ten moment má tato komponenta nastavenou šablonu X. Zkuz ve zpracování formuláře (onValidate) nastavit $this->x = 200;

nebo v onValidate zavolej metodu $this->handlesignalY();

kalipny
Člen | 19
+
0
-

Děkuji, pomohlo to.

MajklNajt
Člen | 502
+
+2
-

stačilo by nastaviť $x ako persistentnú

/** @persistent */
public $x = 100;

musí byť public a nesmieš ju nastavovať v constructore ale dať jej východziu hodnotu priamo

Editoval MajklNajt (15. 1. 2019 12:14)

Polki
Člen | 553
+
0
-

MajklNajt napsal(a):

stačilo by nastaviť $x ako persistentnú

/** @persistent */
public $x = 100;

musí byť public a nesmieš ju nastavovať v constructore ale dať jej východziu hodnotu priamo

Jistě, ale pokud to jde, tak bych perzistentní parametry nepoužíval, jelikož porušují zapouzdření a taky u nich nevynutíš datový typ.

CZechBoY
Člen | 3608
+
0
-

@Polki Můžeš si udělat svoji loadState/saveState funkci která to bude řešit. Nebo počkat na php 7.4, která bude mít typed properties.

Polki
Člen | 553
+
0
-

CZechBoY napsal(a):

@Polki Můžeš si udělat svoji loadState/saveState funkci která to bude řešit.

Udělal jsem si na podobné věci třídu, která to řeší ukládáním do session.

CZechBoY napsal(a):

Nebo počkat na php 7.4, která bude mít typed properties.

To bych se načekal, když spousta poskytovatelů ještě dnes nepodporuje vyšší verzi PHP, než 7.0 i když ta už ztratila podporu v prosinci. Každopádně o typed properties jsem ještě neslyšel kouknu na to díky.