Obsah formulárov v závislosti na predošlej voľbe

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

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
+
0
-

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
+
0
-

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
+
0
-

Š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.

Karel Chramosil
Člen | 114
+
0
-

Díky za opravu, funguje bezvadně.

David Matějka
Moderator | 6445
+
0
-
castamir
Člen | 629
+
0
-

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)

StanlieK
Člen | 28
+
0
-

Ok, už sa s problémom dajako vysporadúvam. Ale teraz by som potreboval pomoc. Ako tomuto : {input vyhladat}, priradím vzhľad, ktoré je v css ako class=„search-button“ ??

castamir
Člen | 629
+
0
-

Jsou na to 2 způsoby:

  1. nastavení globálně pro prvek komponenty (projeví se ve všech místech, kde je tato komponenta vykreslena)
  2. 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
+
0
-

Ďakujem, funguje to perfektne.

StanlieK
Člen | 28
+
0
-

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ý!

castamir
Člen | 629
+
0
-

Zkus google. Každopádně si pak změň heslo do databáze pokud to bylo připojení do produkční verze ;)

StanlieK
Člen | 28
+
0
-

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)

castamir
Člen | 629
+
0
-

použiju opět předchozí kód…

public function editaceFormSubmitted(Form $form)
{
    $values = $form->getValues();
    if ($values->znacka === NULL ) {
            $this->strOrganizace = '%%';
    }
}