Obsah formulárov v závislosti na predošlej voľbe
- StanlieK
- Člen | 28
Dobrý deň, ahojte :-).
Začínam s Nette, tak sa vopred ospravedlňujem, že táto otázka je možno
trochu sprostá. Fakt, ospravedlňujem sa. Ale potrebujem pomoc s vytvorením
„selectov“, pre automobily, kde mám v databáze zadané „znacka, model,
palivo, prevodovka“ a chcem, aby boli tieto výbery závislé na voľbe
predošlej. To znamená, že ak vyberiem znacku vozidla, automaticky sa zmenia
voľby modelov na modely, ktoré sa u tejto znacky v databáze nachádzajú.
Na tom ostatnom nezáleží, palivo a prevodovka sa nemusí kontrolovať. Ale
znacka nech zmení obsah modelov.
Potreboval by som presný popis, čo kam vložiť atď. Vopred vám ďakujem za trpezlivosť.
- Karel Chramosil
- Člen | 114
Posílám zdroják s podobným problémem. Míst strOrganizace zadáš značku.
<?php
use Nette\Application\UI\Form;
use Nette\Security as NS;
/**
* AutomatList presenter.
*
* @author Karel Chramosil
* @package Opravy
* Presenter, který zajišťuje výpis automatů s výběrem.
*/
class AutomatList4Presenter extends SecuredPresenter
{
/*
private $strOrganizace = '';
private $values;
*/
public function actionDefault()
{
$strOrganizace = '%%';
$this->template->automats = $this->context->createAutomats()->WHERE('organizace LIKE ?' ,$strOrganizace)->order('organizace ASC');
}
/*
public function beforeRender()
{
}
*/
/*
vzorový zdroják.
public function hladajKnihu($searchword,$language,$mediatype)
{
$selection = $this->database->table($table)->select('*')->where("name LIKE ?", "%$searchword%");
if ($language != "all")
$selection->where("language", $language);
if ($mediatype != "all")
$selection->where("mediatype", $mediatype);
return $selection;
}
*/
public function renderDefault()
{
$this->template->anyVariable = 'any value';
}
protected function createComponentEditaceForm()
{
$form = new Form();
$form->addText('organizace', 'Název organizace:', 50, 100);
$form->addSubmit('set', 'Hledej podle organizace');
$form->onSuccess[] = callback($this, 'editaceFormSubmitted');
return $form;
}
/**
* Zpracuje odeslaný formulář. Zobrazí výběr.
* @param Nette\Application\UI\Form $form
*/
public function editaceFormSubmitted(Form $form)
{
$values = $form->getValues();
if ($values == NULL ) {
$strOrganizace = '%%';
$this->template->automats = $this->context->createAutomats()->WHERE('organizace LIKE ?' ,$strOrganizace)->order('organizace ASC');
} else {
try {
$strOrganizace = $values->organizace;
$strOrganizace = '%'.$strOrganizace.'%';
$this->template->automats = $this->context->createAutomats()->WHERE('organizace LIKE ?' ,$strOrganizace)->order('organizace ASC');
/* $this->redirect('AutomatList3:');*/
} catch (PDOException $e) {
$form->addError('Nefunguje databáze, informujte administrátora. Chyba číslo 101.');
}
}
}
}
- castamir
- Člen | 629
Takto je to přehlednější. Míň kódu a krom vynechaného try-catch funkčně ekvivaletní.
Edit: Ještě bych dodal, že ta pasáž s dotazem do databáze by měla být spíš ve službě Automats. Zároveň by se Automats mělo injectovat (prostě vyhnout se použití $this->context).
use Nette\Application\UI\Form;
use Nette\Security as NS;
class AutomatList4Presenter extends SecuredPresenter
{
private $strOrganizace = '%%';
public function renderDefault()
{
$this->template->automats = $this->context->createAutomats()->WHERE('organizace LIKE ?', $this->strOrganizace)->order('organizace ASC');
}
protected function createComponentEditaceForm()
{
$form = new Form();
$form->addText('organizace', 'Název organizace:', 50, 100);
$form->addSubmit('set', 'Hledej podle organizace');
$form->onSuccess[] = callback($this, 'editaceFormSubmitted');
return $form;
}
/**
* Zpracuje odeslaný formulář. Zobrazí výběr.
* @param Nette\Application\UI\Form $form
*/
public function editaceFormSubmitted(Form $form)
{
$values = $form->getValues();
if ($values !== NULL ) {
$this->strOrganizace = '%'. $values->organizace .'%';
}
}
}
Editoval castamir (6. 4. 2013 12:47)
- StanlieK
- Člen | 28
Šlo by to urobiť pomocou AJAXu? Nech sa nemusí stránka refreshovať?
Mám to namysli asi takto nejako… → http://server.jollykode.com/autob.png
Je to na tej fotke, je to časť designu.
- castamir
- Člen | 629
Přidej a inicializuj nette.ajax.js.
protected function createComponentEditaceForm()
{
$form = new Form();
$form->getElementPrototype()->class = "ajax";
// ...
}
public function editaceFormSubmitted(Form $form)
{
// ...
if ($this->isAjax()) {
$this['editaceForm']->invalidateControl();
}
}
Editoval castamir (6. 4. 2013 13:31)
- castamir
- Člen | 629
Jsou na to 2 způsoby:
- nastavení globálně pro prvek komponenty (projeví se ve všech místech, kde je tato komponenta vykreslena)
- nastavení v konkrétní šabloně viz konec kapitoly manuálního vykreslování formulářů
ad 1)
protected function createComponentEditaceForm()
{
// ...
$form->addSubmit('vyhladat', 'Popisek k vyhladat')->setAttribute('class', 'search-button');
// ...
}
ad 2) v tentokrát v šabloně (např default.latte):
{form editaceForm}
...
{input vyhladat class => 'search-button'}
...
{/form}
Editoval castamir (6. 4. 2013 13:57)
- StanlieK
- Člen | 28
Prosím vás, čo je toto za chybu a ako ju mám vyriešiť.
http://jollykode.com/chyba.jpg
Som z toho fakt zúfalý!
- StanlieK
- Člen | 28
Nie nebolo. Dobre, tak už aj s týmto problémom som sa vysporiadal.
Ale objavil sa opäť ďalší. Keď už mám vyriešené tie závislosti selectov. Potrebujem aby bola v selecte možnosť nepodstatné, ktorá bude vracať ‚%%‘. Zápis mám takýto.
protected function createComponentForm($name) {
$form = new Nette\Application\UI\Form($this, $name);
$znackyPairs = $this->znackyRepository->findAll()->order('znacka ASC')->fetchPairs('id', 'znacka');
$form->addSelect('znacka', 'Značka', $znackyPairs)
->setPrompt('Nezáleží');
Čo tam mám zmeniť prosím.
Editoval StanlieK (6. 4. 2013 15:20)