Naplnění selectu ajaxem a odeslání formuláře

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

Zdravím,
potřeboval bych trochu popostrčit se zajaxováním formuláře. Mám v něm checkbox, na jehož zaškrtnutí je navázaný toggle selectu, do kterého se načítají data z databáze.

$this->addCheckbox('add_user', 'Chci do skupiny ihned přidat uživatele.')
			->addCondition($this::FILLED)
				->toggle('users');

		$this->addGroup()->setOption('id', 'users')->setOption('style', 'display:none');

		$this->addMultiSelect('users', 'Uživatelé')
			->addConditionOn($this['add_user'], $this::EQUAL, True)
				->addRule($this::FILLED, 'Vyberte aspoň jednoho uživatele.');

Potřeboval bych to udělat tak, aby se dotaz do databáze volal, až když je checkbox zaškrtnutý. Co jsem teda zkusil:
Handler volaný událostí onchange checkboxu.

function handleFillUsers()
	{
		$form = $this->getComponent('addGroupForm');
		$users = $this->userRepo->getFrontUsers($this->user->getId(), True);
		$this->sendResponse(new \Nette\Application\Responses\JsonResponse($users));
	}

Javascript v šabloně, který vyparsuje JSON a udělá z něj <option>.

<script>
$('input[name=add_user]').on('change', function(e) {
	if ($(this).prop('checked')) {
		$.getJSON({link fillUsers!},{ ajax: 'true' }, function(array) {
			var options = '';
			for (var key in array) {
				options += '<option value="' + key + '">' + array[key] + '</option>';
			}
			$("#frmaddGroupForm-users").html(options);
		});
	}
});
</script>

Když ale zaškrtnu checkbox, vyberu uživatele a odešlu formulář, zakřičí na mě Vyberte aspoň jednoho uživatele. Tohle samozřejmě můžu obejít vypnutím podmínky na vyplnění selectu, ale nepřijde mi to jako dobré a čisté řešení.

A vůbec, jdu na to správně, nebo se to dá vyřešit elegantněji? Osobně se mi moc nelíbí ten JS, ale na nic lepšího jsem nepřišel.

frosty22
Člen | 373
+
0
-

No bez JS se takto nevyhneš, v podstatě možnosti jsou 3:

  1. Použiješ JS + tady je problém, že při vytváření toho SELECTu nemá ten select dané hodnoty, čili nette ti pak tu hodnotu vyfiltruje, jelikož mu připadá, že je potvržená, čili tohle je trošku komplikovaná záležitost v nette – viz problematika závislých selectů v nette, např. https://forum.nette.org/…ct-jak-na-to
  2. Nebudeš to řešit a nahraješ tam ty uživatele i tak, když je to skryté tak je to snad jedno. A pokud ti jde o optimalizaci výkonu, tak pokud těch uživatelů není 1000+ tak je to snad jedno.
  3. Dvoukrokový formulář, ale to už není UI friendly