Cesta ku komponente z configu neon

tomino
Člen | 14
+
0
-

Mám JEDEN systém, viac zákazníkou, jeden zákazník chce formulár na editáciu stránky inak než ten druhý. Nejde len o šablónu (tú si už viem inkludovať z inej cesty), ide aj o elementy vo formuláry, čiže by som potreboval niečo takéto, načrtnem:

Components
ArticleControl ← default
DruhyZakaznik/ArticleControl

class ArticleControl extends \app\Components\ArticleControl …

V novej komponente DruhyZakaznik/ArticleControl mám override createComponentArticleForm.
Dá sa niečo takéto použiť? Chcel by som, pokiaľ je v neon nastavene v premennej „DruhyZakaznik“, tak aby sa použila komponenta DruhyZakaznik/ArticleControl, v opačnom pripade default komponenta ArticleControl…

Ako by sa to najkrajšie dalo spraviť?

Petr Steinbauer
Člen | 26
+
0
-

Zdravím,
požadovaného bych dosáhl pomocí Továren na komponenty.

Dokumentace:
https://doc.nette.org/…dependencies#…

Kód naslepo:

    public function createComponentEditRealtyForm()
    {
		if ($this->user->isSpecial()) {
        	return $this->editArticleSpecialFormFactory->create();
		}
        return $this->editArticleFormFactory->create();
	}

Tip
možná je i jiné řešení, toto je první co mě napadlo.

tomino
Člen | 14
+
0
-

Chcel som sa vyhnúť tomu aby som všetkym klientom musel nastavoval tovarnicku:

/** @var IArticleControlFactory @inject */
public $articleControlFactory;

/** @var IDruhyZakaznikArticleControlFactory @inject */
public $druhyZakaznikArticleControlFactory;

/** @var IDalsiZakaznikArticleControlFactory @inject */
public $dalsiZakaznikArticleControlFactory;

...
Petr Steinbauer
Člen | 26
+
0
-

Rozumím v tom případe bych postupoval takto:

$this->editArticleFormFactory->create($user);

A v jedné jediné továrně si ovlivněte výsledný formulář požadovaným způsobem (a nezapomeňte na onSave)

if ($user->isSpecial()) {
	$form->addText('special', 'Vaše speciální okno');
}
tomino
Člen | 14
+
0
-

Myslím si že mať vypodmienkovanú metódu na nastavenie formulára je ako to vy hovoríte „prasárna“. Z mojho pohľadu je lepšie/krajšie riešenie mať každý formulár (pre každého zákazníka) v samostatnom súbore …

A áno, v componente, ktorá extenduje defaultnú componentu, overridujem práve tieto dve metódy createComponentArticleForm a onSave.

Petr Steinbauer
Člen | 26
+
+1
-

tomino napsal(a):

Myslím si že mať vypodmienkovanú metódu na nastavenie formulára je ako to vy hovoríte „prasárna“. Z mojho pohľadu je lepšie/krajšie riešenie mať každý formulár (pre každého zákazníka) v samostatnom súbore …

A áno, v componente, ktorá extenduje defaultnú componentu, overridujem práve tieto dve metódy createComponentArticleForm a onSave.

Ten if je pochopitelně pro demostraci :)


Takže zpět:
Určitě bych nedělal přidávání dle jména klientů jak jste posílal:

/** @var IDruhyZakaznikArticleControlFactory @inject */
public $druhyZakaznikArticleControlFactory;
...

ale rozdělil bych si zákazníky do nějakých funkčních celků které popisují realitu – a ty pospojoval.

Například pomocí $form->addContainer a obepínacího $form->addMyContainer

Čili jeden velký formulář a jednoduše si načte jen ty containery které má mít…

jeden formulář má například:

$form->addMyContainer(self::FORM_SECTION_GENERAL, 'Nemovitost (obecné)');
$form->addMyContainer(self::FORM_SECTION_PRICE, 'Ceny, stav prodeje');
$form->addMyContainer(self::FORM_SECTION_AUCTION, 'Dražba');

a jiný formulář má zase jiný seznam.
Tím pádem nebudete duplikovat žádný kód a jen si vybíráte na co má zákazník nárok – určuje to role zákazníka a seznam.

Pochopitelně výsledné provedení je na Vás :)

tomino
Člen | 14
+
0
-

Dakujem velmi pekne.