Zjištění, zda-li je uživatelské jméno volné – AJAX

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

Dobrý den,

mám takový problém. Potřebuji ve formuláři ověřovat, zda-li je uživatelské jméno volné ještě před tím, než uživatel formulář odešle (→ tj. potřebuji Ajax)

Mám v presenteru nastavený atribut onblur na JS funkci checkAviability(). Používám jQuery

...
->setAttribute('onblur', 'checkAviability()');
<script>
	function checkAviability(){
            $.get({link check!}, {'value': $( 'input:text[name=username]' ).val()});
    }
</script>

V presenteru mám funkci handleCheck(), kde jsem zatím zkoušel alespoň vypsat hodnotu inputu username (zkoušel jsem jak flash message (ty mám také ve snippetu – snippet flashes), tak i jen vypsat do těla stránky (snippet test)

function handleCheck($value){
            $this->flashMessage($value);
            $this->template->testVar = $value;
            $this->redrawControl('test');
            $this->redrawControl('flashes');
}

A v latte šabloně

{snippet test}
       {$testVar}
{/snippet}
{control addForm}

Když si udělám snippet na formuláři a ten pak znouvu vykreslím, tak se formulář, vymaže, takže Ajax funguje. Ale to, co mám výše ani ťuk. Už fakt nevím, co s tím :/.

Děkuji, sd

Jan Endel
Člen | 1016
+
+2
-

todle bych osobně řešil spíše payloadem:

public function handleCheckUsername($username)
{
	$this->payload->isFree = $this->users->isUsernameFree($username);
	$this->sendPayload();
}
<form n:name="addForm" data-check-url="{link checkUsername!}" id="addForm">
	<input n:name="username" id="username"><span id="isFree"></span>
</form>
$.('#addForm').on('blur', '#username', function (e) {
		var $form = this;
		var $input = $.('#username');

	$.nette.ajax({
			type: 'post',
			url: $form.data('check-url'),
			data: {
				'username': ($input.val())
			},
			success: function (payload) {
				$text = (payload.isFree) ? 'volné' : 'zabrané';
				$.('#isFree').setInnerText($text);
			}
		})

takhle nějak přibližně.

Editoval Jan Endel (8. 1. 2015 14:54)

sd
Člen | 87
+
0
-

Děkuji moc za odpověď :). Po malých úpravách se mi to podařilo částečně rozchodit. Vše je zdánlivě ok, žádná chyba v konzoli FireBugu se nevyskytuje,
ale když chci vypsat hodnotu payload.isFree, tak je undefined.
``
Předtím mi házel Error 500 – Internal server error, prý nemohl nalézt šablonu checkUsername.latte, tak jsem ji prázdnou vytvořil a rozjelo se to. Je to asi prasárna ale jinak to vůbec nejede :/.
``

jQuery + Nette Ajax addon v1.2.2
JS: (main.js) //Tady jsem nahradil $ za var, dodal jsem úvozovky k ‚zabrané‘ atd..

$("#username").on('blur', function(){

    var form = this;
    var input = $('#username');

    $.nette.ajax({
            type: 'post',
            url: $('#addForm').data('check-url'),
            data: {
                'username': (input.val())
            },
            success: function (payload) {
                var text = (payload.isFree) ? 'volné' : 'zabrané';
                $('#isFree').text(text);
            }
    })
});

Kód v presenteru:

public function handleCheckUsername($username)
       {
           $this->payload->isFree = TRUE; //True jsem tady zkoušel, jestli vůbec něco v tom JS vytáhnu z toho paloadu, a nevytáhl jsem ani to TRUE :/, pouze undefined. Zkoušel jsem si vyhodit alert okno s payload.isFree.
           $this->sendPayload();
       }

Neví někdo prosím, co je za problém že hodnota payload.isFree je undefined?
Děkuji, sd

Editoval sd (8. 1. 2015 12:06)

Jan Endel
Člen | 1016
+
0
-

Koukni na jakou url adresu se ajax volá, myslím, že mi v tom linku chybí vykřičník, a pak si u adresu zkus pustit v prohlížeči samostatně bez ajaxu, měla by ti v ideálním případě vypsat JSON payloadu.

sd
Člen | 87
+
0
-

Bylo to tím vykříčníkem :D. ({link checkUsername!}). A ta šablona je totální hovadina :). Už jsem to pochopil, bez toho vykřičníku to odkazovalo na .latte šablonu :D a ne na akci ?do=checkUsername :D.
Děkuji moc.

Editoval sd (8. 1. 2015 12:45)