AJAX – odeslání AJAX požadavku není bráno jako AJAX?

Bulhy
Člen | 6
+
0
-

Zdravím,
narazil jsem na problém a nejsem schopen zjistit, kde je chyba.

Mám šablonu, ve které mám <a>, které by mělo sloužit pro překreslení snippetu přes ajax. Problém je, že v handle metodě chci překreslit daný snippet, ve kterém je onen <a> tag, avšak ta metoda to nerozezná jako ajax, tudíž redrawControl na daný snippet nic neudělá (resp. ona se překreslí celá stránka, případě dám-li v else redirect, pošle se tam.

Zde je onen kód v šabloně:

<div class="column">
        <div class="floatLeft ">
            {snippet user_booked_lessons}
                {if !isset($lessons)}
                <a n:href="booked!" class="ajax">Zobrazit objednané hodiny</a>
                {elseif isset($lessons)}
                    <h1>Objednané hodiny</h1>
                    <form n:name="lessonsCancelForm">
                    <table border="1" class="instructorsTable">
                        <tr>
                            <th>Datum</th>
                            <th>Jazyk</th>
                            <th>Typ</th>
                            <th>Instruktor</th>
                            <th>Akce</th>
                        </tr>
                        {php $today = (new \Nette\Utils\DateTime)}
                    {foreach $lessons as $l}
                        <tr>
                            {if $today < $l->date}
                            <td>{$l->date->format('j. n. Y. \v H:00')}</td>
                            <td>{$l->language}</td>
                            <td>{$l->type}</td>
                            <td>{$l->instructor->user->first_name} {$l->instructor->user->last_name}</td>
                            <td><input type="checkbox" id="{$l->ID}" onclick="lessonsEdit(this)"></td>
                            {/if}
                        </tr>
                    {/foreach}
                        <input n:name="lessons">
                        <tr>
                            <td colspan="5" class="noPadding"><input n:name="submit"></td>
                        </tr>
                    </table>
                    </form>
                    <h1>Proběhlé hodiny</h1>
                    <div class="overFlowTable">
                    <table border="1" class="instructorsTable">
                        <tr>
                            <th>Datum</th>
                            <th>Jazyk</th>
                            <th>Typ</th>
                            <th>Instruktor</th>
                            <th>Hodnocení</th>
                        </tr>
                    {foreach $lessons as $l}
                        <tr>
                            {if $today > $l->date}
                            <td>{$l->date->format('j. n. Y. \v H:00')}</td>
                            <td>{$l->language}</td>
                            <td>{$l->type}</td>
                            <td>{$l->instructor->user->first_name} {$l->instructor->user->last_name}</td>
                            <td align="center">
                                <div class="rating">
                                    {for $i=5; $i>=1; $i--}
                                        <i class="fas fa-star" {if $l->score >= $i}id="starChecked"{/if} onclick="starClicked({$l->ID},{$i})"></i>
                                    {/for}
                                </div>
                            </td>
                            {/if}
                        </tr>
                    {/foreach}
                    </table>
                    </div>
                {/if}
            {/snippet}
        </div>
    </div>

Handle pro překreslení snippetu

public function handleBooked(){
        $this->lessons = $this->lessonsManager->getBookedByUser($this->getUser()->getIdentity()->getId());
         if ($this->isAjax()) {
            $this->redrawControl('user_booked_lesson');
         }
         else{
            $this->redirect('Homepage:');
         }

    }

AJAX jako takový by mi měl fungovat, jelikož tato obslužná metoda:

public function handleChangeScore($lessonID, $score)
    {
        $this->lessonsManager->setScore($lessonID, $score);
        $this->lessons = $this->lessonsManager->getBookedByUser($this->getUser()->getIdentity()->getId());
        if ($this->isAjax()) {
            $this->redrawControl('user_booked_lessons');
        }
    }

pro odesílání informací o hodnocení funguje správně (odešle opravdu AJAX), avšak snippet se opět nepřekreslí.

Otázka tedy je, z jakého důvodu se to neodesílá jako ajax?

Za jakékoliv rady budu rád.

Editoval Bulhy (3. 10. 2018 13:39)

David Matějka
Moderator | 6445
+
0
-

co pouzivas za js knihovnu na ajax? jak ji inicializujes?

Bulhy
Člen | 6
+
0
-

Vypíši již vše raději.
nette.ajax.js 2.3.0, jquery.js v3.3.1. Dále v souboru load.js:

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

A v @layout.latte na začátku body

{block scripts}
        <script src="{$basePath}/js/jquery.js" type="text/javascript"></script>
        {*<script src="https://nette.github.io/resources/js/netteForms.min.js"></script>*}
        <script src="{$basePath}/js/nette.ajax.js"></script>
        <script src="{$basePath}/js/load.js"></script>
    {/block}

EDIT:

Každopádně se mi povedlo zprovoznit překreslení snippetu, když používám hodnocení (handleChangeScore). Tam bylo špatně tohle (zakomentovaná byla špatně)

<script>
function starClicked(lessonID, score){
        $.nette.ajax({
            url: {link changeScore!},
            data: {"lessonID": lessonID, "score": score},
            type: 'get',
            dataType: 'json'
        });
    }
    {*
    function starClicked(lessonID, score){
        $.getJSON(
            {link changeScore!},
            {
                {$control->getParameterId('lessonID')}: lessonID,
                {$control->getParameterId('score')}: score
            }
        );
    } *}
</script>

Avšak problém při kliknutí na <a> tag přetrvává a dochází k redirectu.

Editoval Bulhy (3. 10. 2018 14:13)

David Matějka
Moderator | 6445
+
0
-

chybi ti tam zavolani te funkce, kterou tam deklarujes a ve ktere dochazi k initu, oprav na:

(function () {
        $.nette.init();
})();
Bulhy
Člen | 6
+
0
-

Provedl jsem, avšak stále nic. Jen si to raději upřesním, zda jsem to pochopil správně. Když mám šablonu a v ní snippet, tak když přes AJAX (pomocí <a…>) vyvolám handle metodu a v ní bude redrawControl(snipperName), tak by se neměla aktualizovat celá stránka, ale pouze se překreslit ten snippet, že? Přesně takto to funguje, když to odesílám jen takto pomocí JavaScriptu pro hodnocení, když už je zobrazeno.

Bohužel má stávající handleBooked metoda, která má zobrazit celkově hodnocení atp., která reaguje na <a class=„ajax“ n:href=„booked!“> to stál takto nedělá.

Editoval Bulhy (3. 10. 2018 14:33)