Vkladanie pola do selectu

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

Ahoj,

neviem či tu niekto toto riešil alebo nie a po pravde pri hladaní som nič nenašiel.
Tak by som sa rád spýtal…
mám štruktúru
…\app
\forms
\CompanyForm.php (továrnička na základnú formu formulára na registráciu)
\models
\conf.php (registrované ako služba)

v conf.php mám

 public  $krajiny = array(
	'AFG' => 'Afghanistan',
	'ALB' => 'Albania',
	'ALG' => 'Algeria',
	'ANG' => 'Angola',
	'ARA' => 'Arab Federation',
	'ARG' => 'Argentina',
	'ARM' => 'Armenia',
	'AST' => 'Australia',
);

a v CompanyForm.php mám select

$form = new NAppForm();
$form->addSelect('krajina', 'Krajina: ', /* tu potrebujem dostať array krajín */);

a moja otázka znie…viete mi poradiť ako dostať tie údaju do CompanyForm.php z conf.php?

Dakujem

Jan Endel
Člen | 1016
+
0
-

V podstatě s využitím dependency injection nevím jak je ten formulář psaný, ale pokud se selectbox „krajiny“ zobrazuje v každém případě a bez nich ten formulář je k ničemu, pak bych volil cestu takzvaného construct injection ->

class CompanyForm extends ...
{
	private $countries;

	public function __construct(array $countries)
	{
		parent::construct();
		$this->countries = $countries;
	}

	.....

	function .....
	{
		....
		$form->addSelect('country', 'Krajina: ', $this->countries);
	}
}
Tabetha
Člen | 140
+
0
-

formulár mám písaný…toto riešenie je jediné čo mi funguje -.- takže som tam určite čosi zle urobil

class CompanyForm extends NAppForm
   {

   public function __construct(IContainer $parent = NULL, $name = NULL)
      {
      parent::__construct($parent, $name);


      $registracne_udaje = $this->addContainer('registracne_udaje');
      $registracne_udaje->addText('username', 'Registračný e-mail: ')
	      ->setRequired('Zadajte registračný e-mail.')
	      ->addCondition(NForm::FILLED)
	      ->addRule(NForm::EMAIL, "Musí byť E-MAILová adresa");
      $registracne_udaje->addPassword('password', 'Heslo: ')
	      ->addRule(NForm::MIN_LENGTH, "Heslo musí mať najmenej %d znakov", 6)
	      ->setRequired('Prosím zadajte heslo.');
      $registracne_udaje->addPassword('password2', 'Zopakovať heslo: ')
	      ->setRequired("Prosím zopakujte heslo.")
	      ->addRule(NForm::EQUAL, "Heslá sa musia zhodovať!", $registracne_udaje['password']);

      $this->addText('obch_meno', 'Obchodné meno: ');

      $zakladne_udaje = $this->addContainer('zakladne_udaje');
      $zakladne_udaje->addText('ico', 'IČO: ')
	      ->addCondition(NForm::FILLED)
	      ->addRule(NForm::MAX_LENGTH, 'Maximálna dĺžka %d znakov', 16);
      $zakladne_udaje->addText('dic', 'DIČ: ');
      $zakladne_udaje->addText('icdph', 'IČ DPH: ');
      $zakladne_udaje->addRadioList('typ_spolocnosti', 'Typ spoločnosti: ', $this->typ_osoby);

      $adresne_udaje = $this->addContainer('adresne_udaje');
      $adresne_udaje->addText('ulica', 'Ulica + číslo: ');
      $adresne_udaje->addText('psc', 'PSČ: ')
	      ->addCondition(NForm::FILLED)
	      ->addRule(NForm::PATTERN, 'Musí byť PSČ', '.*[0-9].*');
      $adresne_udaje->addText('mesto', 'Mesto: ');
      $adresne_udaje->addSelect('krajina', 'Krajina: ', $this->krajiny);

      $kontaktne_udaje = $this->addContainer('kontaktne_udaje');
      $kontaktne_udaje->addText('telefon', 'Telefón: ');
      $kontaktne_udaje->addText('mobil', 'Mobilné číslo: ')
	      ->addCondition(NForm::FILLED)
	      ->addRule(NForm::PATTERN, 'Musí byť číslo.', '.*[0-9].*');
      $kontaktne_udaje->addText('fax', 'Fax: ');

      $kontaktna_osoba = $this->addContainer('kontaktna_osoba');
      $kontaktna_osoba->addSelect('titul_preffix', 'Titul pred menom', $this->preffixované_tituly);
      $kontaktna_osoba->addText('meno_osoby', 'Meno: ');
      $kontaktna_osoba->addText('priezvisko_osoby', 'Priezvisko: ');
      $kontaktna_osoba->addSelect('titul_suffix', 'Titul za menom: ', $this->suffixované_tituly);

      $this->addCheckbox('obch_podmienky', 'Obchodné podmienky')
	      ->setRequired('Je potrebné súhlasiť s obchodnými podmienkami');
      $this->addSubmit('potvrdit', 'Potvrdiť');

      $this->addProtection('Vypršal časový limit');

      $this['adresne_udaje']->setDefaults(array(
	  'krajina' => 'SVK',
      ));
      }

public  $krajiny = array(
       'AFG' => 'Afghanistan',
       'ALB' => 'Albania',
       'ALG' => 'Algeria',
       'ANG' => 'Angola',
       'ARA' => 'Arab Federation',
       'ARG' => 'Argentina',
       'ARM' => 'Armenia',
       'AST' => 'Australia',
);
}
Jan Endel
Člen | 1016
+
0
-

No, i takhle se to da, ale co to ted dela?

Tabetha
Člen | 140
+
0
-

no mám to ako továren aby som nemusel vypisovať dáta…ale zaujímalo ma či by tie „array“ mohli byť v inom súbore a sem ich len odkázať

Jan Endel
Člen | 1016
+
0
-

Jak jsem řekl, přes konstruktor ho tam vstříknout, jenom doplním, že by se instance třídy vytvářela takto:

protected function createComponentCompanyForm($parent, $name)
{
	$form = new CompanyForm($parent, $name, $this->context->params['countries']);
	return $form;
}

pokud tedy by ty counties byly v konfiguráku.

vvoody
Člen | 910
+
0
-

To by bol asi hodne dlhy konfigurak :). Predpokladam, ze tam nema len krajiny zacinajuce na A, sice myslim ze sa da spravit oddeleny konfigurak, ktory by len includol, ale ono to neni moc pekne cpat take udaje do konfigu.

Jednoducho si sprav z toho pola triedu – model

class Krajiny{

	private $krajiny = array(
		'AFG' => 'Afghanistan',
		'ALB' => 'Albania',
		'ALG' => 'Algeria',
		'ANG' => 'Angola',
		'ARA' => 'Arab Federation',
		'ARG' => 'Argentina',
		'ARM' => 'Armenia',
		'AST' => 'Australia'
	);

	public funcion getKrajiny(){
		return $this->krajiny;
	}
}

ktory zadefinujes v configu ako sluzbu, ktoru mozes predat tvojmu formularu.

Editoval vvoody (5. 5. 2012 22:45)

Jan Endel
Člen | 1016
+
0
-

samozřejmě že konfiguračních souborů lze udělat hafo.

Tabetha
Člen | 140
+
0
-

dobre díky za rady… :) v tých krajín je A-Z ale dávať to sem by bolo asi trochu dlhé :D …v configu je to momentálne preto, lebo som ešte neriešil získavanie automaticky IP a následne krajiny z ktorej je pripojené cez GEOIP…čo je v DB tabuľka takže to pôjde v neskoršej fáze cez nu, ale dovtedy to mám v conf.php kvôli tomu aby boli takéto veci pokope :)

a ešte raz díky za váš čas a rady