handler signálu v komponentě

jannemec
Člen | 78
+
0
-

Nějak mi nefunguje signál v komponentě.
Nezavolá se mi signál v komponentě

<?php
public function handlefacebookAuthorize(): void {
        // Do something
        }
?>

A musím to udělat ručně přes

<?php
public function signalReceived(string $signal):void {
        if ($signal == 'facebookAuthorize') {
            $this->handlefacebookAuthorize();
        }
        parent::signalReceived($signal);
    }
?>

Předpokládám, že je to nějaká prkotina, ale nemohu na ní přijít …
JN

MajklNajt
Člen | 470
+
0
-

Máš komponentu pripojenú k presenteru? Ako ju vytváraš?

MajklNajt
Člen | 470
+
+1
-

Pripadne skús názov metódy zmeniť na handleFacebookAuthorize

jannemec
Člen | 78
+
0
-

MajklNajt napsal(a):

Pripadne skús názov metódy zmeniť na handleFacebookAuthorize

To jsem samozřejmě zkoušel … ale ona připojená je – protože ten

<?php
public function signalReceived(string $signal):void {
        if ($signal == 'facebookAuthorize') {
            $this->handlefacebookAuthorize();
        }
        parent::signalReceived($signal);
    }
?>

se zavolá (je to etoda té komponenty ..)

A jinak je to normálně v presenteru přes továrnu vytvořená komponenta

<?php
public function createComponentSocialLogin() {
        return new \Controls\SocialLogin($this, 'socialLogin');
    }
?>

a konstruktor yé komponenty

<?php
    public function __construct($parent = null, $name = null) {
        if (is_null($name)) {
            $name = 'socialLogin';
        }
        $this->form = new \Nette\Application\UI\Form();
		// Vytvoření toho formuláře
        $this->addComponent($this->form, $name . 'frm');

        $parent->addComponent($this, $name);
    }
?>
CZechBoY
Člen | 3608
+
+1
-

Pouzij createComponentXXX nebo ten kod zavolej az ve startup/action

CZechBoY
Člen | 3608
+
0
-

A vzdycky volej parent::__construct();

jannemec
Člen | 78
+
0
-

CZechBoY napsal(a):

A vzdycky volej parent::__construct();

To mi ale hází chybu

16: class SocialLogin extends \Nette\Application\UI\Control {
17: public function __construct($parent = null, $name = null) {
18: parent::__construct();
19: if (is_null($name)) {
20: $name = ‚socialLogin‘;

Na řádku 18 – chyba „Cannot call constructor“

A tu továrnu mám – je to v presentru

<?php
public function createComponentSocialLogin() {
        return new \Controls\SocialLogin($this, 'socialLogin');
    }
?>
CZechBoY
Člen | 3608
+
0
-

Nepripojuj komponenty takhle rucne, nech to na Nette.

Marek Bartoš
Nette Blogger | 1143
+
0
-

$this->form = new \Nette\Application\UI\Form();
// Vytvoření toho formuláře
$this->addComponent($this->form, $name . ‚frm‘);

$parent->addComponent($this, $name);

Takhle ne, pro formulář si vytvoř samostatnou createComponent* metodu. Nech Nette, aby zavolalo addComponent() samo

A vzdycky volej parent::__construct();

Pokud tedy existuje. Což u komponenty od Nette 3 neexistuje, @CZechBoY

A nepřipojuj komponenty do hierarchie v konstruktoru. Připojíš tak při inicializaci komponentu k rodiči, který sám ještě není inicializovaný a připojený k presenteru. Vzniknou ti tak těžko odhalitelné chyby

Editoval Mabar (5. 1. 2020 23:53)

CZechBoY
Člen | 3608
+
0
-

@Mabar pravda, az ted jsem si vsiml ze poslal vlastne konstruktor komponenty. Nicmene parent konstruktor by se mel vzdy volat – pokud ovsem existuje, coz u komponenty asi neexistuje.