Zvláštní chování snippetu
- Joacim
- Člen | 229
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)
- Joacim
- Člen | 229
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)
- Joacim
- Člen | 229
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');
}
}
- Kori
- Člen | 73
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
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)
- Joacim
- Člen | 229
$("#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
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)