Replicator – dynamické podpoložky – košík

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

Ahoj,
trošku bojuju s replicatorem. Mám dynamický počet akcí a ke každé dynamický počet účastníků.

  1. nevím, jak ke každé akci protlačit počet účastníku (teď tam je 1), chtěl bych to vytáhnout ze session, ALE nevím jak to spojit s foreach (nebo jak jinak každé akci přidělit daný počet účastníku – nebo to zprasit nějak v šabloně? – to se mi ale moc nelíbí)
	protected function createComponentAttendeeForm() {
		$tree = $this;
		$products = $this->userCart;

		$form = new Form;
		$form->addDynamic('products', function (Container $product) {
			$removeEvent = callback($this, 'attendeeFormRemoveElementClicked');
			$attendees = $product->addDynamic('attendees', function (Container $attendee) use ($removeEvent) {
				$attendee->addText('first_name', 'Jméno')->setAttribute('placeholder', 'Jméno');
				$attendee->addText('last_name', 'Příjmení')->setAttribute('placeholder', 'Příjmení');
				$attendee->addText('company_position', 'Pozice ve firmě')->setAttribute('placeholder', 'Pozice ve firmě');
				$attendee->addText('email', 'Email')->setAttribute('placeholder', 'Email')->setRequired('Jaký je email tohoto účastníka?');
				$attendee->addText('phone', 'Telefon')->setAttribute('placeholder', 'Telefon');
				$guide = array(
					'e' => 'Elektronická',
					't' => 'Tištěná',
				);
				$attendee->addRadioList('guide', 'Příručka ke kurzu:', $guide)->setRequired('Tato položka je povinná.');
				$attendee->addSubmit('remove', '[x]')
					->setValidationScope(FALSE)
					->onClick[] = $removeEvent;
			}, 1);
			$attendees->addSubmit('add', 'Přidat dalšího účastníka')
				->setValidationScope(FALSE)
				->onClick[] = callback($this, 'attendeeFormAddElementClicked');
		}, count($products));

		$form->addSubmit('submit', 'Další');
		//$form->onSuccess[] = array($this, 'productsFormSubmitted');
		return $form;
	}
  1. nevím, jak to manuálně vykreslit – problém obdobný – akce vykreslím, ale na účastníky nevím, kudy kam
	{form attendeeForm}
		{foreach $form['products']->containers as $id => $product}
			{if isset($items[$id])}
				<div>
					{$presenter->findTerm($items[$id]->id)->product->code} - {$items[$id]->product} <br>

					{$presenter->findTerm($items[$id]->id)->location->title}
					{var $totalPricePerProduct = 0}
					{foreach -----co dát sem???----- as $key => $attendee}
						{input products-$id-attendees-$key-first_name}
						{input products-$id-attendees-$key-last_name}
						{input products-$id-attendees-$key-company_position}
						{input products-$id-attendees-$key-email}
						{input products-$id-attendees-$key-phone}
						{input products-$id-attendees-$key-remove}
						<strong>{$items[$id]->price|number} Kč (bez DPH)</strong>
						{var $totalPricePerProduct += $items[$id]->price}
					{/foreach}
					{input products-$id-attendees-add} <strong>{$totalPricePerProduct|number} Kč (bez DPH)</strong>
				</div>
			{/if}
		{/foreach}
		<a n:href="ShoppingCart:, localization => $localization">Předchozí krok: Produkty</a><br>
		{input submit}
	{/form}
  1. když použiju následující kód dle dokumentace ⇒ error Undefined variable: attendees … bez ifíčka to jede v pohodě
	public function attendeeFormAddElementClicked(SubmitButton $button) {
		$button->parent->createOne();

		if ($attendees->isAllFilled()) {
			$button->parent->createOne();
		}
	}

Díky za nakopnutí.

Editoval FJP (23. 4. 2015 13:47)

FJP
Člen | 124
+
0
-

Tak problém dva odhalen :D

{foreach $product['attendees']->containers as $key => $attendee}
FJP
Člen | 124
+
0
-

Povedlo se mi propsat tohle v akci presenteru, ale problém je, že v šabloně se to neprojeví. Neví někdo proč?

		$form = $this['attendeesForm'];
		if (!$form->isSubmitted()) {
			$products = $this->userCart;
			foreach ($products as $key => $product) {
				$counter = array();
				$form['products'][$key]->components['attendees']->createDefault = $product->count;
			}
		}

Ještě jedna věc, když odkomentuju:

$form->onSuccess[] = $this->attendeesFormSubmitted;

tlačítka se chovají divně – add a remove jako by odesílají formulář, zatímco submit nedělá nic.

FJP
Člen | 124
+
+1
-

FJP napsal(a):

Ještě jedna věc, když odkomentuju:

$form->onSuccess[] = $this->attendeesFormSubmitted;

Tak už vím, kde je bug:

$form->addSubmit('submit', 'Další')->onClick[] = callback($this, 'attendeesFormSubmitted');

...

	/**
	 * @param SubmitButton $button
	 */
	public function attendeesFormSubmitted(SubmitButton $button) {
		//$this->getSession('values')->users = $button->form->values;
		$products = $button->form->values;
	}

HA, vyřešen už i problém 3:

	public function attendeesFormAddElementClicked(SubmitButton $button) {
		$attendees = $button->parent;

		if ($attendees->isAllFilled()) {
			$button->parent->createOne();
		}
	}

Vtipný odpovídat si sám :D, třeba se to někomu bude hodit :D…

Editoval FJP (24. 4. 2015 11:08)