Ako odovzdat komponent druhej komponente?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
steelbull
Člen | 241
+
0
-

Mam komponentu modal, ktora je potomkom UI\Control a maly formular, ktory je tiez potomkom UI\Control; Dalej mam velky hlavny formular, ktory je taktiez potomkom UI\Control.

V hlavnom formulari by som chcel vytvorit instanciu komponenty modal, ktorej by som chcel setterom odovzdat instanciu maleho formulara alebo prip. aj inej komponenty. A v modali by som chcel tuto komponentu vykreslit. Ale neviem ako :-(

<?php

namespace Test\Components;

use Nette\Application\UI\Control;

class ModalControl extends Control
{
    private $title = '';
    private $body = '';
    private $footer = '';
    private $control;
    private $name;

    /**
     * Constructor
     */
    public function __construct() {
        $this->name = $this->getName();
    }

    /**
     * Set control
     *
     * @param $control
     */
    public function setControl($control) {

		// Tu neviem, co s tym, ziskam instanciu UI\Control (napr. formular)
		// a dalej neviem, ako ju pouzit/vykreslit...
        $this->control = $control;
    }

    /**
     * Set title
     *
     * @param $title
     */
    public function setTitle($title)
    {
        $this->title = $title;
    }

    /**
     * Set body
     *
     * @param $body
     */
    public function setBody($body) {
        $this->body = $body;
    }

    /**
     * Set footer
     *
     * @param $footer
     */
    public function setFooter($footer) {
        $this->footer = $footer;
    }

    /**
     * Render component
     */
    public function render()
    {
        $template = $this->template;
        $template->setFile(__DIR__ . '/Modal.latte');
        $template->title = $this->title;
        $template->body = $this->body;
        $template->footer = $this->footer;
        $template->name = $this->name;
        $template->render();
    }
}
Martk
Člen | 661
+
+1
-

Smazal bych prvně tuto část kódu:

private $name;

    /**
     * Constructor
     */
    public function __construct() {
        $this->name = $this->getName();
    }

$this->name bude vždy hodnota null;

protected function createComponentControl() {
	return $this->control; // Nesmí se předávat již připojená komponenta
}
{control control}
steelbull
Člen | 241
+
0
-

Dakujem @Antik, ano $name vrati vzdy null. Ako inak ziskam nazov komponenty?

A toto je ok alebo bad practise:

/**
 * Render component
 */
public function render()
{
    $this->addComponent($this->control, 'pokus');

    $template = $this->template;
    $template->setFile(__DIR__ . '/Modal.latte');
    $template->title = $this->title;
    $template->body = $this->body;
    $template->footer = $this->footer;
    $template->name = $this->name;
    $template->render();
}
Martk
Člen | 661
+
+1
-

@steelbull Jestli nemáš žádnou proměnou $this->name ve třídě, tak pak je to v pořádku, tzn. že se zavolá getter $this->getName() (https://api.nette.org/…ent.php.html#…), který vrátí jméno komponenty (Když není připojená vrátí null), přes Nette\Object.

Jestli máš na mysli takovéto připojení ke komponentě, tak ano, je to v pořádku.