Snippet problem s parametrom

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

Potrebujem urobit dynamicke vyhladavanie s tym ze sa budu filtrovat polozky v tabulka, takze sa bude tabulka prekreslova, tabulku som uzavrel do snippetu

{snippet table}
        <table class="table table-hover" style="margin-top:1%">
            <thead>
                <tr>
                    <th>#</th>
                    <th>Meno</th>
                    <th>Priezvisko</th>
                    <th>Email</th>
                    <th>Telefón</th>
                    <th>Variabilný symbol</th>
                    <th>Lekár/Zdrav. Sestra</th>
                    <th>Abstrakt</th>
                    <th>Operácie</th>
            </thead>
            {foreach $rows as $row}
                <tr>
                    <td>{$iterator->getCounter()+(($actualPage-1)*10)}</td>
                    <td>{$row->name}</td>
                    <td>{$row->surname}</td>
                    <td><a href="mailto:{$row->email}">{$row->email}</a></td>
                    <td>{$row->phone}</td>
                    <td>{$row->variable_symbol}</td>
                    {if $row->nurse}
                        <td>Zdrav. Sestra</td>
                    {else}
                        <td>Lekár</td>
                    {/if}
                    <td n:if="$row->registration_active"><a href="http://pdfgenerator.webpixels.sk/index.php?id={$row->id}&code={$code}" target="blank">Abstrakt</a></td>
                    <td n:if="!$row->registration_active">Bez abstraktu</td>
                    <td>
                        <div class="dropdown">
                          <button class="btn btn-default dropdown-toggle" type="button" id="dropdownMenu1" data-toggle="dropdown" aria-expanded="true">
                            <span class="caret"></span>
                          </button>
                          <ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu1">
                            <li role="presentation"><a role="menuitem" tabindex="-1" n:href="User:user $row->id, $name, $id, $code , $actualPage">Upraviť účastníka</a></li>
                            <li role="presentation"><a role="menuitem" tabindex="-1" href=""
                                data-toggle="modal" data-target="#deleteModal"
                                data-iduser="{$row->id}" data-name="{$row->name}" data-surname="{$row->surname}" data-congres="{$name}">Zmazať účastníka</a></li>
                          </ul>
                        </div>
                    </td>
                </tr>
            {/foreach}

        </table>
        {/snippet}

policko kde vola ajax vyzera takto

<form class="form-inline">
        <div class="col-md-6">
            <div class="input-group">
                <input type="text" class="form-control" id="searchRegistred" placeholder="Hľadať...">
                <span class="input-group-btn">
                    <button class="btn btn-default" n:href="search! $code" class="ajax" id="searchSubmit">
                        <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
                    </button>
                </span>
            </div>
        </div>
        </form>

v presenteri teda mam:

public function handleSearch($congres)
    {
        $value = "su";
        $actualPage=1;
        if ($this->isAjax()) {
            $this->template->rows = $this->database->table($congres.'_participants')
                ->where('name LIKE ?', '%'.$value.'% OR surname LIKE ? OR email LIKE ?', '%'.$value.'%', '%'.$value.'%', '%'.$value.'%')->order('id')->limit(10,($actualPage-1)*10);

            $this->redrawControl('table');
            $this->redrawControl('itemsContainerArea');
        }
    }

a metoda ktora to renderuje:

public function renderCongres($congresID,$congresCode, $congresName, $actualPage)
    {
        if (!$this->getUser()->isLoggedIn()) {
            $this->redirect('Sign:in');
        }

        $this->codeOfCongress = $congresCode;
        $this->idOfCongress = $congresID;

        $this->template->select_sections = $this->database->table($congresCode.'_sections')->select('id,section');
        $this->template->select_hotels = $this->database->table($congresCode.'_hotels')->select('id,hotel');

        $numberOfRows = $this->database->table($congresCode.'_participants')->count();
        $numberOfPages;

        if ($numberOfRows%10 == 0) {
            $numberOfPages = $numberOfRows/10;
        }
        else {
            $numberOfPages = (int)($numberOfRows/10)+1;
        }

        $this->template->countPages = $numberOfPages;
        $this->template->actualPage = $actualPage;
        $this->template->id = $congresID;
        $this->template->code = $this->codeOfCongress;
        $this->template->name = $congresName;
        $this->template->rows = $this->database->table($congresCode.'_participants')->order('id')->limit(10,($actualPage-1)*10);


        $this->template->breads =
                array('Kongresy' => $this->link('Homepage:default'),
                    $congresName => ''
                    );
    }

moj problem je ze ak kliknem na to tlacitko pre to vyhladavanie ktore by malo zavoalt AJAX a prekreslit tabulku mi zahlasi SQL problem ze tabulak ktoru chcem neexistuje pretoze v $congresCode nieje nic… pomozete mi ?

Editoval figurluk (27. 6. 2015 18:30)

chemix
Nette Core | 1296
+
+2
-

@figurluk ahoj, je to tim ze signal (handle___) se vola PRED render___ viz dokumentace https://doc.nette.org/…n/presenters#…

Je treba nekterou logiku dat do action___

Baj voko cca asi prvnich 6 radku z renderCongres presunout do actionCongres

figurluk
Člen | 61
+
0
-

chemix napsal(a):

@figurluk ahoj, je to tim ze signal (handle___) se vola PRED render___ viz dokumentace https://doc.nette.org/…n/presenters#…

Je treba nekterou logiku dat do action___

Baj voko cca asi prvnich 6 radku z renderCongres presunout do actionCongres

ja mam aj metodu actionCongres v ktorej sa to nacitava a nepomohlo to vobec

Editoval figurluk (27. 6. 2015 22:22)

chemix
Nette Core | 1296
+
+1
-

@figurluk to by pomoci melo, pak uz me napada jen otazka na javascript, neni pro me ani tak zajimave jak to dela, ale kam se pta pro data.

Posli kod + overeni z browser konzole co se doopravdy poslalo za XHR pozadavek.

figurluk
Člen | 61
+
0
-

zobral som toto: https://componette.org/search/?…
to odporucaju aj v dokumentacii a potom mame na ten button toto

<script>
$("#searchSubmit").live('click', function() {

            $(function () {
                $.nette.init();
            });

            $.get(this.href);
            event.preventDefault();
        });

</script>

toto XHR neviem ani co je

Editoval figurluk (27. 6. 2015 22:32)

chemix
Nette Core | 1296
+
+1
-

@figurluk XHR je officialni nazev pro AJAX pozadavek.

Zde je videt seznam adres ruznych XHR pozadavku, zde na foru pri suggestion, tam by melo byt videt zdali se $congres nejak posila

chemix
Nette Core | 1296
+
+1
-

PS: pro predavani parametru spise pouzivej data- atributy, treba data-src

PS2: to $.nette.init() vytahni z buttonu, at se to nevola po kazdem kliku

PS3: nevim jak ten $.get .. pouzil bych radeji $.ajax, viz dokumentace k doplnku „Ajaxification envelopes standard $.ajax() call and extends it with several events,“ nevim zdali u toho cisteho .get pak zafunguje plugin snippet aby to automaticky prekreslil… (neovereno)

chemix
Nette Core | 1296
+
+1
-

PS4: to ze prefixujes tabulky tim kongresem imho take neni idealni… osobne bych volil spise dalsi sloupecek k tabulce, ale neznam zadani

figurluk
Člen | 61
+
0
-

chemix napsal(a):

PS4: to ze prefixujes tabulky tim kongresem imho take neni idealni… osobne bych volil spise dalsi sloupecek k tabulce, ale neznam zadani

na XHR neposlalo nic… aa tie prefixy to musim mat tak z urcitych dovodov :) nette.init som vytiahol a dal som tam teda

<script>
$("#searchSubmit").live('click', function() {

            $.nette.ajax({
                url: this.href
            });
            // event.preventDefault();
        });
</script>

Editoval figurluk (28. 6. 2015 0:57)

chemix
Nette Core | 1296
+
+1
-

@figurluk to je divne, to by se melo ukazat, pokud se to posila ajaxem, ledaze by se to neposilalo

ted jsem si tu zkusil nejake neco malo, v tom kode co mas nahrad viz PS1 src za data-src a zkus tento JS

<script type="text/javascript">
	$(function(){
		console.log('init');
		var $btn = $('#searchSubmit');
		$btn.click( function() {
			console.log('click');
			$.ajax({
				url: $btn.data('href'),
				success: function(){
					console.log('success');
				}
			});
		});
	});
</script>

--/

Editoval chemix (28. 6. 2015 1:24)

figurluk
Člen | 61
+
0
-

chemix napsal(a):

@figurluk to je divne, to by se melo ukazat, pokud se to posila ajaxem, ledaze by se to neposilalo

ted jsem si tu zkusil nejake neco malo, v tom kode co mas nahrad viz PS1 src za data-src a zkus tento JS

<script type="text/javascript">
	$(function(){
		console.log('init');
		var $btn = $('#searchSubmit');
		$btn.click( function() {
			console.log('click');
			$.ajax({
				url: $btn.data('href'),
				success: function(){
					console.log('success');
				}
			});
		});
	});
</script>

--/

nechapem co mam nahradit za data-src

skusil som to s tym tvojim a tak ci tak v XHR nic nemam … a zase ta ista chyba

Editoval figurluk (28. 6. 2015 2:04)

chemix
Nette Core | 1296
+
+1
-

@figurluk promin, napsal jsem src ale myslel jsem href.

<button class="btn btn-default" n:href="search! $code" class="ajax" id="searchSubmit">

za

<button class="btn btn-default" data-src="{link search! $code}" class="ajax" id="searchSubmit">

A pak by me teda zajimalo co vidis v JS konzoli pokud nahradis ten JS kod…

Zkousel jsem to ted na vetsim kusu kodu a narazil na drobnost. Jelikoz ty ten input mas ve formu a jako tlacitko pouzivas ‚<button>‘ tak je tam treba nezapomenout ten preventDefault() u meho dema bez formu jsem to nezjistil… :( az ted kdyz jsem pouzil tvuj kod

to je vypis me konzole kdyz kliknu na tlaciko… u toho kodu, pouprav si JS a sablonu tak aby jsi tam ve vysledku mel neco podobneho a zkus to pak spustit zdali se v konzoli objevi vsechny 3. hlasky a bude tam i jeden XHR pozadavek, ktery jde rozkliknout a v nem by jsi mel videl nejakou odpoved, byt treba 500, pokud by to nefungovalo zakomentuj si ty veci v handleSearch a dej si tam treba jen dump($congres) zdali se tam hodnota dostane a co.

Pripadne pokud to zahlasi nejakou chybu, tak bud vice sdilny, na jakem radku + code co je par radku kolem

snad se posuneme dal

<html>
<head>
	<meta charset="UTF-8">
</head>
<body>

<form class="form-inline" class="ajax">
<div class="col-md-6">
    <div class="input-group">
        <input type="text" class="form-control" id="searchRegistred" placeholder="Hľadať...">
        <span class="input-group-btn">
            <button id="searchSubmit" data-href="/">button</button>
                <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
            </button>
        </span>
    </div>
</div>
</form>

<script type="text/javascript" src="https://code.jquery.com/jquery-1.11.3.min.js"></script>
<script type="text/javascript" src="nette.ajax.js"></script>

<script type="text/javascript">
	$(function(){
		console.log('init');
		var $btn = $('#searchSubmit');
		$btn.click( function() {
			console.log('click');
			$.ajax({
				url: $btn.data('href'),
				success: function(){
					console.log('success');
				}
			});
			event.preventDefault();
		});
	});
</script>
</body>
</html>
figurluk
Člen | 61
+
0
-

@chemix

takze talcitko vyzera takto

<button class="btn btn-default" data-href="{link search! $code}" class="ajax" id="searchSubmit">

script vyzera takto

<script>
$(function(){
          console.log('init');
          var $btn = $('#searchSubmit');
          $btn.click( function() {
              console.log('click');
              $.ajax({
                  url: $btn.data('href'),
                  success: function(){
                      console.log('success');
                  }
              });
        event.preventDefault();
          });
      });
</script>

v konzole to vypise:
init congres?congresID=2&congresCode=neuro&congresName=Neurológia&actualPage=1:704
click congres?congresID=2&congresCode=neuro&congresName=Neurológia&actualPage=1:707
GET http://localhost/…page/congres jquery.min.js:4 congres=neuro&congresID=2&congresCode=neuro&congresName=Neurol%C3%B3gia&actualPage=1&do=search 500 (Internal Server Error)

a uz je v XHR jeden riadok..
tu je screen ako to cele vyzera…
a po kliknuti na tlacitko sa sa nic vobec nestane… spadne to na tej chybe v javascripte… ladenka zadnu chybu neda

http://www.fastimages.eu/images/beznzvopo.png

Editoval figurluk (28. 6. 2015 13:14)

chemix
Nette Core | 1296
+
+1
-

@figurluk a do logu se zapise co? pripadne pokud tu celou adresu otevres v novek okne mela by byt videt cela chyba kde je problem, ted vime ze se to posila, ze se posilaji parametry ale nevime co se deje v tom handle___

chemix
Nette Core | 1296
+
+1
-

ps: a ten button nepotrebuje tridu „ajax“ jelikoz si chovani resis sam. Trida ajax je pouzivana pro automaticke odkazy. Pokud mas odkaz s tridou ajax nebo formular, tak ten js se to to nejak bude snazit postarat sam

figurluk
Člen | 61
+
0
-

@chemix

ked otvorim tu stranku tak na nej nieje ziadna chyba…

log:

[2015–06–28 17–48–34] Nette\InvalidArgumentException: Argument count does not match placeholder count. in C:\Xampp\htdocs\progres\webman\vendor\nette\database\src\Database\Table\SqlBuilder.php:234 @ http://localhost/…page/congres?… @@ exception-2015–06–28–13–05–13-c9d7c1115a6e0bf4c09e5133e2e7adeb.html

tak to vyzera na problem v SQL dotazu:

$this->template->rows = $this->database->table($this->codeOfCongress.‚_participants‘)
->where(‚name LIKE ?‘, ‚%‘.$value.‚% OR surname LIKE ? OR email LIKE ?‘, ‚%‘.$value.‚%‘, ‚%‘.$value.‚%‘, ‚%‘.$value.‚%‘)->order(‚id‘)->limit(10,($actualPage-1)*10);

Opraveny SQL a uz ot funguje :) dakujem velmi si mi pomohol!

Ale aj tak to este spadne ak nastavim aby sa ten AJAX vykonal ak cokolvek napsies do toho pola hned nech sa vykonava bez nutnosti stlacenia tlacitka… ak tam toto neije tak to nespadne.. aa tabulka sa neprekresluje

Editoval figurluk (28. 6. 2015 18:00)

chemix
Nette Core | 1296
+
0
-

priste to zkus nejprve bez javascriptu, signaly funguji i bez nich a tuto chybu bys mozna odhalil drive :)

tak at se dari…

H.

figurluk
Člen | 61
+
0
-

chemix napsal(a):

priste to zkus nejprve bez javascriptu, signaly funguji i bez nich a tuto chybu bys mozna odhalil drive :)

tak at se dari…

H.

@chemix

pomoz mi este prosim

Unlink
Člen | 298
+
0
-

A čo konkrétne ti nefunguje, ako to padne a ako si to spravil?

figurluk
Člen | 61
+
0
-

Unlink napsal(a):

A čo konkrétne ti nefunguje, ako to padne a ako si to spravil?

tak potrebujem si z toho inputu preposlat co napisal do toho handle a prekreslit tabulku..

public function handleSearch($value)
    {
        $actualPage=1;
        if ($this->isAjax()) {
            $this->template->rows = $this->database->table($this->codeOfCongress.'_participants')
                ->where('name LIKE ? OR surname LIKE ? OR email LIKE ?', '%'.$value.'%', '%'.$value.'%', '%'.$value.'%')->order('id')->limit(10,($actualPage-1)*10);

            $this->invalidateControl('table');
        }
    }

da sa nejako zachytavat obsah inputu v latte a pridavat ho do data-href v buttone ?

Editoval figurluk (28. 6. 2015 18:24)

Unlink
Člen | 298
+
+1
-

Sprav to tak, že si zavesíš na ten input udalosť a pošli to potom na ten handler

$("#searchRegistred").keydown(function() {
    $.ajax({
   		url: $("#searchSubmit").data('href'),
        data: {
            value: $(this).val()
        }
	});
});
figurluk
Člen | 61
+
0
-

Unlink napsal(a):

Sprav to tak, že si zavesíš na ten input udalosť a pošli to potom na ten handler

$("#searchRegistred").keydown(function() {
    $.ajax({
   		url: $("#searchSubmit").data('href'),
        data: {
            value: $(this).val()
        }
	});
});

okej urobil som to tak, ale aj tak mi ten handler neprepisuje tu tabulku :( co mam este zle

Unlink
Člen | 298
+
0
-

Pozri v konzole čo ti to vracia.
ps. to value je meno toho parametra v handle metóde.

figurluk
Člen | 61
+
0
-

Unlink napsal(a):

Pozri v konzole čo ti to vracia.
ps. to value je meno toho parametra v handle metóde.

no ved posiela to na spravny link ale proste ten handle neprekresli tu tabulku

a neviem teraz preco je ten response zly…

Editoval figurluk (28. 6. 2015 19:34)

Unlink
Člen | 298
+
0
-

A v tej odpovedi máš ten snippet table?

figurluk
Člen | 61
+
0
-

Unlink napsal(a):

A v tej odpovedi máš ten snippet table?

takto to mam:

public function handleSearch($value)
    {
        $actualPage=1;
        if ($this->isAjax()) {
            $this->template->rows = $this->database->table($this->codeOfCongress.'_participants')
                ->where('name LIKE ? OR surname LIKE ? OR email LIKE ?', '%'.$value.'%', '%'.$value.'%', '%'.$value.'%')->order('id')->limit(10,($actualPage-1)*10);

            $this->redrawControl('table');
        }
    }

co by malo prekreslit tu tabulku s novymi udajmi ktore dostane z toho selektu

Editoval figurluk (28. 6. 2015 19:35)

Unlink
Člen | 298
+
0
-

Dobre, ale v konzole si pozri ten požiadavok, je v odpovedi ten snippet?

figurluk
Člen | 61
+
0
-

Unlink napsal(a):

Dobre, ale v konzole si pozri ten požiadavok, je v odpovedi ten snippet?

je, ale niesu v nom vyfiltrovane veci pdola SQL ale vsetky tam tu takze sa v podstate nic nezmeni

Unlink
Člen | 298
+
0
-

No podľa toho čo mám k dispozicii tak v handle nastavíš $this->template->rows a v render to prepíšeš.

figurluk
Člen | 61
+
0
-

Unlink napsal(a):

No podľa toho čo mám k dispozicii tak v handle nastavíš $this->template->rows a v render to prepíšeš.

tak teda som to zmenil v render metode ale ja tak sa ta tabulka nezmeni a ked pozeram v konzole je uz aj spravny response

render metoda:

public function renderCongres($congresID,$congresCode, $congresName, $actualPage)
    {
        if (!$this->getUser()->isLoggedIn()) {
            $this->redirect('Sign:in');
        }

        if (!isset($this->filter)) {
            $this->codeOfCongress = $congresCode;
            $this->idOfCongress = $congresID;

            $this->template->select_sections = $this->database->table($congresCode.'_sections')->select('id,section');
            $this->template->select_hotels = $this->database->table($congresCode.'_hotels')->select('id,hotel');

            $numberOfRows = $this->database->table($congresCode.'_participants')->count();
            $numberOfPages;

            if ($numberOfRows%10 == 0) {
                $numberOfPages = $numberOfRows/10;
            }
            else {
                $numberOfPages = (int)($numberOfRows/10)+1;
            }

            $this->template->countPages = $numberOfPages;
            $this->template->actualPage = $actualPage;
            $this->template->id = $congresID;
            $this->template->code = $this->codeOfCongress;
            $this->template->name = $congresName;
            $this->template->rows = $this->database->table($congresCode.'_participants')->order('id')->limit(10,($actualPage-1)*10);


            $this->template->breads =
                    array('Kongresy' => $this->link('Homepage:default'),
                        $congresName => ''
                        );
        }
        else {
            $this->template->id = $congresID;
            $this->template->actualPage = 1;
            $this->template->code = $this->codeOfCongress;
            $this->template->name = $congresName;
            $this->template->rows = $this->filter;
        }


    }

handler:

public function handleSearch($value)
    {
        $actualPage=1;
        if ($this->isAjax()) {
            $this->filter = $this->database->table($this->codeOfCongress.'_participants')
                ->where('name LIKE ? OR surname LIKE ? OR email LIKE ?', '%'.$value.'%', '%'.$value.'%', '%'.$value.'%')->order('id')->limit(10,($actualPage-1)*10);

            $this->redrawControl('table');
        }
    }

Editoval figurluk (28. 6. 2015 22:26)

Unlink
Člen | 298
+
0
-

No lebo to nijako neprekresluješ.

Môžeš použiť
https://github.com/…ette.ajax.js

a potom použitie by malo byť

$("#searchRegistred").keyup(function() {
    $.nette.ajax({
          url: $("#searchSubmit").data('href'),
        data: {
            value: $(this).val()
        }
  });
});

ps. teraz ma napadlo že keydown je ešte pred zmenou $(this).val() tak je lepšie použiť keyup

chemix
Nette Core | 1296
+
0
-

@figurluk ps: priste needituj prispevek s pridanim dalsi otazky :) vubec jsem to nezaregistroval.

To co pise @Unlink by uz melo litat jako tryskac…

figurluk
Člen | 61
+
0
-

@chemix
@Unlink

dakujem Vam velmi ste mi pomohli uz vsetko funguje ako ma :)