Uchování obrázků přesunutých uživatelem na jejich místě i po refreshi stránky

- 2rec
- Člen | 40
Mám web (zde), na kterém je možno přetahat obrázky do políček pod nimi. Řešeno html5, javascriptem a drag and drop eventů. Potřeboval bych poradit nějakou metodu, jakou bych mohl uchovat obrázky pro daného uživatele na místě, kam je přetahal.
Jak bych toho mohl docílit, prosím?
Zkoušel jsem metodu předání ajaxem proměnné s názvem obrázku do presenteru (kód níže), ale nefunguje mi, tak hledám jinou možnost.
<script>
var data = null;
var currentID = null;
var test = "ahoj mami";
function allowDrop(ev) {
if(ev.preventDefault)
ev.preventDefault();
}
function drop(ev) {
if(ev.preventDefault)
ev.preventDefault();
var data = ev.dataTransfer.getData("picture");
var actDiv = ev.target.id;
if(actDiv == "background-music" && currentID != "content-music")
div.style.border="2px solid red";
else
ev.target.appendChild(document.getElementById(data));
$.ajax({
type: 'POST',
url: {link processAjax!},
data: test,
error: function(){
alert("Theres an error with AJAX.");
}
});
}
function dragStart(ev) {
this.style.opacity = '0.4';
ev.dataTransfer.setData("picture", ev.target.id);
currentID = ev.target.id;
}
function dragEnter(ev) {
this.style.border="2px dashed black";
}
function dragLeave(ev) {
this.style.border="2px solid #ccc";
}
function dragEnd(ev) {
this.style.opacity = '1';
[].forEach.call(divs, function (div) {
div.style.border="2px solid #ccc";
});
}
var divs = document.querySelectorAll('.dropdiv');
[].forEach.call(divs, function(div) {
div.addEventListener('dragover', allowDrop, false);
div.addEventListener('drop', drop, false);
div.addEventListener('dragenter', dragEnter, false);
div.addEventListener('dragleave', dragLeave, false);
});
var imgs = document.querySelectorAll('.content');
[].forEach.call(imgs, function(img) {
img.addEventListener('dragstart', dragStart, false);
img.addEventListener('dragend', dragEnd, false);
});
</script>
Editoval 2rec (7. 4. 2014 21:04)

- Mariocz
- Člen | 52
Ajax volej pomocí tohohle addonu https://componette.org/search/?…
tady příklad:
$.nette.ajax({
type: 'GET',
url: '{link savePicPosition!}',
data: {
'myComponentControl-position': 1
}
});
pokud to nemáš v komponentě tak posíláš jen ‚position‘: 1
zpracování pak v metodě
public function handleSavePicPosition($position) {
}

- 2rec
- Člen | 40
Mariocz napsal(a):
Ajax volej pomocí tohohle addonu https://componette.org/search/?…
tady příklad:
$.nette.ajax({ type: 'GET', url: '{link savePicPosition!}', data: { 'myComponentControl-position': 1 } });pokud to nemáš v komponentě tak posíláš jen ‚position‘: 1
zpracování pak v metodě
public function handleSavePicPosition($position) { }
Děkuju, jenom ještě pro budoucí zájemce doplním, že v metodě `handleSavePicPosition `k tomu přistupuju pomocí
$this->context->httpRequest->getPost('position');
(a používám teda POST metodu), chvilku jsem to dohledával.

- Michal Vyšinský
- Člen | 608
No fuj, vážně přístup přes context? Injektni si
službu Nette\Http\Request

- 2rec
- Člen | 40
Mariocz napsal(a):
Vůbec si to nemusíš komplikovat. Do metody hodnotu dosteneš v proměnné $position
// Na context bys neměl vůbec šahat. jestli tak někde děláš tak zkus dohledat jak nato jinak .)
Proměnnou $position mám prázdnou, proto jsem hledal nějaký jiný způsob.
public function handleProcessAjax($position) {
$pexesoSession = $this->session->getSection('pexesoSession');
$pexesoSession->position = $position; // v session je position = NULL
}
EDIT: Celý ten nápad s contextem jsem našel tady na
fóru. Jak bych k tomu teda měl přistupovat, když je proměnná
$position prázdná?
Editoval 2rec (8. 4. 2014 23:18)

- Mariocz
- Člen | 52
Jestli je proměnná $position prázdná, je něco špatně. měl bys mít hodnotu právě tam.
Jednoduchý teď vyzkoušený příklad:
šablona:
{block content}
<a class="test" href="#">test</a>
{snippet snip}
{ifset $fin}{$fin}{/ifset}
{/snippet}
<p></p>
<script>
$( 'a.test' ).click(function() {
$.nette.ajax({
type: 'POST',
url: {link ajaxTest!},
data: {
'value': 1
}
});
});
</script>
v preseteru:
public function handleAjaxTest($value) {
$this->template->fin = $value;
$this->invalidateControl('snip');
}
zkontroluj si ve firebugu/chrome jestli ti v postu posílá hodnotu. důležitý je dát před název proměnné název komponenty a pomlčku jestli to nemáš přímo v presenteru
jak píše Michal, vhodnější je injectnout si potřebnou službu v presenteru pomocí anotace @inject