Problém ve formulái – signal receiver component ‚addItemsForm‘ is not found

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

Zdravím, mám problém, v presenteru mám fce

public function actionAddItems() {
public function renderAddItems() {
public function createComponentAddItemsForm($name) {
public function addItemsFormSubmitted(Form $form) {

no a onSubmit je
$form->onSubmit[] = callback($this, ‚addItemsFormSubmitted‘);

A laděnka mi hlásí, The signal receiver component ‚addItemsForm‘ is not found.

Mikulas Dite
Člen | 756
+
0
-

Chyba není v tom útržku kódu. Chápu to tak, že po submitu formuláře naskočí tahle chyba ⇒ komponenta není nalezena ⇒ špatně používáš továrnu. Hoď sem celý presenter a opravíme to.

2. formátuj prosím příspěvky.

JPalounek
Člen | 19
+
0
-

Stačí metody createComponentAddItemsForm a public function addItemsFormSubmitted?

Ten presenter je celkem velký a nevím jestli by se klientovi líbilo, že tady „publikuji“ kód celého presenteru.

	protected function createComponentAddItemsForm($name) {
		$forms = $this->itemQuantity;

		$form = new Form;

		for($i = 0; $i < $forms; $i++) {
			$itemNumber = $i + 1;
			$form->addGroup('Položka č.' . $itemNumber);
			$form->addText('name_item' . $i,  'Položka :');
			$form->addSpinbox('quantity_item' . $i,  'Počet :');
			$form->addSpinbox('prize_item' . $i,  'Cena bez DPH :');
		}

		$form->addSubmit('new', 'Přidat položky k faktuře');
		$form->onSubmit[] = callback($this, 'addItemsFormSubmitted');

		return $form;
	}
	public function addItemsFormSubmitted(Form $form) {
		$datas = $form->getValues();

		for($i = 0; $i < $this->itemQuantity; $i++) {
			// Clear after last iteration
			if(isset($collection)) {
				unset($collection);
			}

			// Prepare data for this iteration
			$collection['name'] = $datas['name_item' . $i];
			$collection['quantity'] = $datas['quantity_item' . $i];
			$collection['prize'] = $datas['prize_item' . $i];

			// @todo Implment saving of collected datas

			// Prize
			$prize += $collection['prize'];
		}

		$this->redirect('index');
	}

Pokud není vidět chyba v tomhle tak sem hodím celý ten presenter.

bojovyletoun
Člen | 667
+
0
-

Místo Form zkus AppForm

Taky nědělej guláš s 'quantity_item' . $i → použij $form->addContainer($i)

JPalounek
Člen | 19
+
0
-

bojovyletoun napsal(a):

Místo Form zkus AppForm

Taky nědělej guláš s 'quantity_item' . $i → použij $form->addContainer($i)

Rada s AppForm nezabrala, to s addContainer místo lepení strringů implementuji, ale to problémm nevyřeší (?)

bojovyletoun
Člen | 667
+
0
-

Tahle hláška znamená prostě, že komponentu (ten formulá nelze najít nebo není připojen k presenteru. – tak to nějak zkontroluj) . Ta rada s AppForm je důležitá – jinak formulář nebude fungovat jak by měl – nedojde k callbackům.

PS: napadlo mě zkus vytvořit formulář v startup ($this['aditemform]=new AppForm($this);) a né pomocí továrničky.

JakubJarabica
Gold Partner | 184
+
0
-

V továrničke by mohlo byť pripojenie formu k presenteru:

<?php
protected function createComponentAddItemsForm($name) {
	...
        $form = new AppForm($this, 'addItemsForm');
	...
?>

Toto nepomôže?

Mikulas Dite
Člen | 756
+
0
-

Raději AppForm($this, $name);.

JPalounek
Člen | 19
+
0
-

Tak jsem zakomentoval

createComponentAddItemsForm($name)

a ve presenteru vytvořil metodu startup

	protected function startup() {
		parent::startup();

		$this['addItemsForm'] = new AppForm($this, 'addItemsForm');

		$billing = $this->getLastBilling();

		$forms = $this->itemQuantity;

		for($i = 0; $i < $forms; $i++) {
			$itemNumber = $i + 1;
			$this['addItemsForm']->addGroup('Položka č.' . $itemNumber);
			$this['addItemsForm']->addText('name_item' . $i,  'Položka :');
			$this['addItemsForm']->addSpinbox('quantity_item' . $i,  'Počet :');
			$this['addItemsForm']->addSpinbox('prize_item' . $i,  'Cena bez DPH :');
		}

		$this['addItemsForm']->addSubmit('new', 'Přidat položky k faktuře');
		$this['addItemsForm']->onSubmit[] = callback($this, 'addItemsFormSubmitted');
	}

No, a když to teď spustím, dostanu kuriózní laděnku Component with name ‚addItemsForm‘ already exists.
Vím, že teď budu vypadat jako úplná lama, ale já tu metodu createComponentAddItemsForm($name) zkutečně zakomentoval…

Ideas?

JPalounek
Člen | 19
+
0
-

A když v createComponentAddItemsForm($name)

Změním $form→ na $this[‚addItemsForm‘] vidím stejnou laděnku, přitom tu komponentu nikde jinde nevytvářím

bojovyletoun
Člen | 667
+
0
-

FATAL ERROR! má být $this['addItemsForm'] = new AppForm; – a to jsem ještě přemýšlel, jestli se komponenta připojí opravdu správně.

JPalounek
Člen | 19
+
0
-

Ano, takže po změně

$this['addItemsForm'] = new AppForm($this, 'addItemsForm');

na

$this['addItemsForm'] = new AppForm;

Mám opět laděnku The signal receiver component ‚addItemsForm‘ is not found.
Tzn. jsem zase na začátku.

JPalounek
Člen | 19
+
0
-

V aplikaci jsem tuhle fci obešel a naimplementoval jinak, takže problém již není aktuální.

Děkuji všem za pomoc!

kokoumes
Člen | 39
+
0
-

A jak? celkem by mě to zajímalo.