Zvláštní chování snippetu

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

Mám výpis fotek dané galerie a u každé fotky ikonku pro editaci, pokud na ikonku kliknu objevý se form, kde vyplním co potřebuji, dám Save a vše se uloží jak má, bohužel se nevykreslí fotky, ale vypíše se hláška „No data in DB“ → {if $images_cnt == 0 || $images_cnt == null}, pokud dám tag pro snippet přímo před foreach, vyrenderuje se prázdná fotogaleri bez obrázků, chybu jsem v konzoly nenašel a laděnka píše že se dotaz pro danou galerii v DB provedl

show.latte (výpis obrázků dané galerie) – url

http://localhost/test-mvc/www/gallery/show?gid=17
{snippet galleryListShow}
    {if $images_cnt == 0 || $images_cnt == null}
        <div class="panel-body">
            <div class="alert alert-warning">
                <i class="fa fa-warning fa-fw"></i> No data in Database.
            </div>
        </div>
    {else}
        <div class="row">
            <div class="col-lg-12">
                <h1 class="page-header"></h1>
            </div>

            {foreach $gallery_images as $img}
                <div class="col-lg-3 col-md-4 col-xs-6 thumb thumbnail">
                    <input type="checkbox" class="check" name="images_list" value="{$img->id}" id="img_{$img->id}">
                    <i class="fa fa-edit edit-btn" id="{$img->id}"></i>
                    <a class=" group1" href="{$basePath}/img_gallery/{$img->gallery_id}/{$img->name}">
                        <img class="img-responsive" src="{$basePath}/img_gallery/{$img->gallery_id}/thumb/{$img->name}" alt="" width="400" height="300">

                    </a>
                    Velikost: {$img->size |bytes}
                    {$img->visible}
                </div>
            {/foreach}

        </div>

    {/if}
{/snippet}

GalleryPresenter.php

public function renderShow($gid) {
    $this->template->gallery_images = $this->database->query('SELECT * FROM gallery_images WHERE gallery_id = ?', $gid)->fetchAll();
    $this->template->images_cnt = count($this->template->gallery_images);
    // Zjistit velikost a počet obrázků

    $this->template->gid = $gid;

    if ($this->isAjax()) { // Pokud se jedná o ajax, přerenderujeme galleryList
        $this->redrawControl('galleryListShow');
    }
}


public function handleRenderPhotoEdit($photo_id, array $photo_data) {
    if ($this->isAjax()) {
        $photo_data['edited'] = date('Y-m-d H:i:s');
        $photo_data['editedBy'] = $this->user->identity->user_id;

        $this->database->query('UPDATE gallery_images SET ? WHERE id=?', $photo_data, $photo_id);
    }
}

Všude jinde jsem používal snippety stejně a vždy se vyrenderovala data správně (jen jsem používal tabulku pro výpis a snippet jsem měl hned před foreach)

Editoval Joacim (13. 8. 2015 22:13)

Stejsi
Člen | 21
+
+1
-

Myslím že ti v tom renderShow($gid) chybí ta proměnná $gid .

Joacim
Člen | 229
+
0
-

Pravda, teď jsem to kontroloval a není → NULL

if ($gid == NULL) {
    $gid = $this->getParameter('gid');
}

příklad hore Nefunguje, jen pokud dám do proměnné na pevno ID galerie, jak mám tedy dostat gallery id do renderShow($gid) ?

Nenašla by se dobrá duše co by mě poradila ?

Zkoušel jsem posílat $gid přes ajax v parametru fnce pro ajax, ale bez efektu.

Editoval Joacim (27. 8. 2015 10:42)

ondrusu
Člen | 118
+
0
-

ahoj, taky jsem narazil na prakticky totožný problém a vůbec nevim jak to řešit

Joacim
Člen | 229
+
0
-

To je sice super odkaz, ale stále nevím jak si tento parametr z url předávat, udělal jsem několik pokusů a vždy mě ajax vrátí hodnotu NULL u proměné $gid

/** @persistent gid */
    public $gid;

 public function renderShow($gid) {

        $this->template->gallery_images = $this->database->query('SELECT * FROM gallery_images WHERE gallery_id = ?', $gid)->fetchAll();
        $this->template->images_cnt = count($this->template->gallery_images);
        // Zjistit velikost a počet obrázků

        $this->template->gid = $gid;

        if ($this->isAjax()) { // Pokud se jedná o ajax, přerenderujeme galleryList
            $this->redrawControl('galleryListShow');
        }
    }
David Matějka
Moderator | 6445
+
0
-

Odkud a jak volas tu metodu handleRenderPhotoEdit ?

Kori
Člen | 73
+
0
-

Tak to uz jsou zaklady OOP. $gid je property presenteru, takze k hodnote se dostanes pres $this->gid.

$this->template->gallery_images = $this->database->query('SELECT * FROM gallery_images WHERE gallery_id = ?', $this->gid)->fetchAll();

$this->template->gid = $this->gid;

Editoval Kori (31. 8. 2015 5:40)

Joacim
Člen | 229
+
0
-

Možná je to základ OOP, ale tuhle variantu jsem též zkoušel a vrací mě NULL.
Možná mám špatně zápis:

/** @persistent gid */
    public $gid;

URL mám ve formátu:

http://localhost/mvc/www/gallery/show?gid=18

Zaškrtnu input dané fotky a zmáčknu Delete → Ajax request, který odešle ID fotky(array s ID fotek k smazání) co se má smazat do presenteru Gallery

public function handleRenderImagesDelete(array $images_data) {
        if ($this->isAjax()) {
            $base_image_file = strval($this->imageStorage->dir);
            foreach ($images_data as $id) {
                $name = $this->database->table('gallery_images')->select('name,gallery_id')->where('id = ?', $id)->fetch();
                $file = new Nette\Utils\FileSystem();
                // Smažeme obrázky z gallerie
                $this->database->table('gallery_images')->where('id = ?', $id)->delete();
                // Smažeme obrazek
                $file->delete($base_image_file . $name['gallery_id'] . '/' . $name['name']);
            }
        }
    }
Header: http://localhost/mvc/www/gallery/show?do=RenderImagesDelete&images_data%5B%5D=33
Response: {"state":{"gid":null},"snippets": Info}

Fotka se smaže, jak z DB tak i file ve složce galerie, ale snippet se neobnoví, jelikož nemá kde vzít renderShow proměnou s ID galerie $gid, která je neustále jako parametr v url

Editoval Joacim (31. 8. 2015 16:43)

David Matějka
Moderator | 6445
+
0
-

A jak vyvolavas ten ajax request?

Joacim
Člen | 229
+
0
-
$("#delete-images").click(function () {
        $("<div id='infoDialog' title='Status Dialog' style='text-align: center;'>Opravdu chcete smazat zaškrtnuté obrázky?</div>").dialog({
            modal: true,
            draggable: false,
            resizable: false,
            buttons: {
                "Ano": function () {
                    var images = [];
                    $("input[name='images_list']:checked:enabled").each(function () {
                        images.push($(this).val());
                    });
                    $.nette.ajax({
                        type: 'GET',
                        url: "?do=RenderImagesDelete",
                        data: {
                            "images_data": images
                        },
                        success: function (data) {
                            // dialogMessage('Obrázky byly smazány.');
                        },
                        error: function (jqXHR, textStatus, errorThrown) {
                            // Turn Off active row highlight
                            // Ajax ERROR Dialog
                            $("<div id='infoDialog' title='Error Dialog' style='text-align: center;'>An error occurred... Look at the console (F12 or Ctrl+Shift+I, Console tab) for more information!<br><br>"
                                    + "<b>" + jqXHR.statusText + "</b><br>"
                                    + jqXHR.responseText.substring(0, 360) + " . . . <b>More in console</b></div>").dialog({
                                width: 480,
                                height: 280,
                                modal: true,
                                draggable: false,
                                resizable: false,
                                buttons: {
                                    "Ok": function ()
                                    {
                                        $(this).dialog("close");
                                    }
                                }

                            }).addClass("ui-state-error");
                            $('#result').html('<p>status code: ' + jqXHR.status + '</p><p>errorThrown: ' + errorThrown + '</p><p>jqXHR.responseText:</p><div>' + jqXHR.responseText + '</div>');
                            console.log('jqXHR:');
                            console.log(jqXHR);
                            console.log('textStatus:');
                            console.log(textStatus);
                            console.log('errorThrown:');
                            console.log(errorThrown);
                        }
                    });
                    $(this).dialog("close");
                },
                "Ne": function () {
                    $(this).dialog("close");
                }
            }
        });
    });

Jediné co jsem nezkusil je předat gid ID v GET ajaxu

Editoval Joacim (31. 8. 2015 17:07)

Kori
Člen | 73
+
0
-

Ad: Jediné co jsem nezkusil je předat gid ID v GET ajaxu

A to je presne to, co musis udelat :-) Je to novy pozadavek na server a presenter, samozrejme, jiz o zadnem $gid nevi, ikdyz ty ho vidis v adresnim radku prohlizece.

Persistentni parametry se doplnuji automaticky do URL jen pokud pouzijes macra plink / link / n:href. Pokud si vytvaris URL / request sam, coz jsi mel uvest hned na zacatku, tak si tam musis to $gid take predat sam.

A pak bud vyuzijes persistentni parametr a nebo si do toho handle predas tu promennou $gid a pres nejakou svoji property si ji predas do renderu.

Editoval Kori (31. 8. 2015 18:07)

Joacim
Člen | 229
+
0
-

Děkuji mnohokrát, už to šlape jak hodinky