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

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

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
+
0
-

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
+
0
-

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
+
0
-

No fuj, vážně přístup přes context? Injektni si službu Nette\Http\Request

Mariocz
Člen | 52
+
0
-

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 .)

Editoval Mariocz (8. 4. 2014 10:43)

2rec
Člen | 40
+
0
-

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
+
0
-

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