Dojo dnd target и зареждане на страницата

Въпросът ми е свързан с примера за dnd (Стъпка 4: слушане на събития), публикуван на http://www.sitepen.com/blog/2011/12/05/dojo-drag-n-drop-redux/.

В моя случай имам множество dnd източници, които обхващат няколко страници. Как да запиша данните в количката за пазаруване (цел), така че артикулите в нея да не изчезват след зареждане на различни страници и потребителите да могат да продължат да пускат още артикули?

Всички съвети ще бъдат много оценени!


person Sunny T    schedule 04.05.2012    source източник


Отговори (2)


вижте dojotoolkit.org

Изглежда обаче документите не са нагоре по веригата за списъците 1.7;

абонирайте се за набор от теми и ще знаете кога/какво се драпира

dojo.topic.subsribe

  • /dnd/старт: когато DnD започне. Текущият източник, възлите и флагът за копиране (вижте startDrag() на мениджъра за повече информация) се предават като параметри на това събитие.
  • ./dnd/source/over : когато мишката се движи върху източник. Въпросният източник се предава като параметър. Същото събитие възниква, когато мишката излезе от източник. В този случай null се предава като параметър.
  • /dnd/drop/before: повдигнат точно преди падането. Може да се използва за улавяне на параметрите на падане. Параметрите са същите като за /dnd/drop.
  • /dnd/drop: повдигнат за извършване на пускане. Първите три параметъра са същите като за /dnd/start. Четвъртият параметър е целевият обект. Обърнете внимание, че по време на обработката на това събитие възлите вече могат да бъдат преместени или използвани повторно. Ако имате нужда от оригиналните възли, използвайте /dnd/drop/before, за да ги заснемете, или използвайте събития, локални за източник/целеви обекти.
  • /dnd/отказ : когато DnD е отменен или от потребител (чрез натискане на Esc), или чрез пускане на елементи на незаконно място. Тази тема няма параметри.

Пример за абонамент за тема:

dojo.subscribe("dnd/start", function(source, nodes, copy) {
  // see dojo.dnd.startDrag documentation for details
  // this event will process when user picks up a dnditem
  console.log("Arguments:", arguments);

};
dojo.subscribe("dnd/drop", function(source, nodes, copy, target) {
  // see dojo.dnd.startDrag documentation for details
  // this event will process when user releases dnditem on a valid target
  // note the extra parameter, target - in 99% cases a DOM node
  console.log("Arguments:", arguments);
});

Това, което се случва, е, че потребителят взема елемент - и dndmanager извиква dojo.publish(dnd/start, this.source, this.selection, this.bCopy). Докато се абонирате за темата, ще получите известието.

dojo.topic работи така, както ако сте се абонирали за пощенски списък, ще получавате имейл, след като новините са налични

person mschr    schedule 05.05.2012
comment
Благодаря mschr. За съжаление, аз съм нов в dojo, така че изглежда не мога да видя връзката между манипулаторите на събития, които посочихте по-горе, и решението на моя проблем. Предполагам, че мога да задам въпроса си по този начин. Първата страница (page1.html) има контейнери source1 и target. Източник 2 обаче трябва да е на втората страница (page2.html). Как да се справя с целта, така че да се показва на страница 2, да приема повече елементи и да показва тези от страница 1? - person Sunny T; 05.05.2012
comment
опитайте да добавите горния пример към вашата кодова база и проверете аргументите чрез конзола - person mschr; 05.05.2012
comment
Благодаря ви, mschr. ще го пробвам! - person Sunny T; 06.05.2012
comment
mschr, сега мога да получа данните в количката за пазаруване на page1.html. Как обаче да доведа СЪЩАТА количка за пазаруване (цел) на страница2.html с артикулите, изпуснати от източник1 на страница1.html в нея? Или трябва да създам друга цел? Ще съм много благодарен, ако можете да ми дадете някои съвети. - person Sunny T; 07.05.2012
comment
тогава имате две възможности, една; изпращане на ajax заявка към сървъра при всяко добавяне към количката и две; най-често използваните са постоянни бисквитки, да речем, че ако имате идентификатор за всяка възможност за плъзгане - запазете го в бисквитка dojo.cookie("mycart", idlist), след това от страна на сървъра ще получите бисквитката, когато page2.html (трябва да използвате друго освен .html..) и можете да уредите копие на вашето плъзгане в количката - така че е там, когато го конструирате - person mschr; 07.05.2012

Искате да инициализирате количката си с артикулите, които потребителят е избрал за покупка, всяко падане трябва

<script>
    function dropped(source, nodes, copy, target) {
      if(target.id == "myCardId") {
        var list = dojo.cookie("mycart");
        // split or initialize list (delimiter : comma)
        list = list = "" ? [] : list.split(",");
        if(dojo.indexOf(nodes[0].id), list) != -1)
           // allready there, return
           return;
        else {
           // combine list with every dropped node
           dojo.forEach(nodes, function(dropItem) { list.push(dropItem.id); });
           // set cookie with new variable
           dojo.cookie("mycart", list.join(",");
        }
      }
    }

    ....
   dojo.subscribe("dnd/drop", dropped);
</script>

Може да се имплементира в PHP така, докато няма да навлизам в подробности как получавате изгледа на елементите, заради примера - имате ги в db_data;

<?php

if(isset($_COOKIE) && !empty($_COOKIE['mycart'])) {
   $cartContents = "<ul class=\"dndContainer\">";
   foreach(explode(",", $_COOKIE['mycart']) as $id)
      $cartContents .= "<li class=\"dndItem\">".$db_data[$id]->title."</li>";
   $cartContent .= "</ul>";
}
?>
<div id="dragSource"><? print generateView(); ?></div>
<div id="myCartId"><? print $cartContents; ?></div>

алтернативно за големи колички, бисквитката е излишна и ще затрупа заглавките, горният скрипт може след това да изпрати XHR с идентификатор и сървър, след което да го добави към сесията, използвайки същата логика като javascript - в този случай просто заменете $_COOKIE с $_SESSION

person mschr    schedule 07.05.2012