Witajcie,

Mam bardzo poważny problem - siedzę nad jego rozwiązaniem już ponad 2 dni i nic :/

Nie chcę zanudzać opisami o co chodzi, więc proszę przekonajcie się sami:

http://homebooker.com.pl/test2/

do pewnego momentu wszystko działa - ale kilka razy poprzenoście elementy i pola przestaną być aktywne... :/
Przejrzałem całą dokumentację sortable(), droppable() i draggable() i nic nie wymyśliłem.
Mam nadzieję, że ktoś z Was miał podobny przypadek i coś doradzi.

Będę aktywnie udzielał się w temacie więc śmiało zadawajcie pytania jeśli coś będzie niejasne.

Z góry naprawdę wielkie dzięki za pomoc / dobre chęci !

P.S. - tak wiem, przy przenoszeniu czyści się zawartość - ale to tylko dla testów (nowy init sie robi)

pozdrawiam

Rozwiązanie problemu:

Samemu sobie odpowiem na pytanie - mam nadzieję, że przyda się to komuś jeszcze.

Rozwiązanie nie jest trywialne i zajęło mi dwa dni bez przerw na sen:D

A więc to co udało mi się wyczytać:

"This is due to iframe management : when you move an iframe in the DOM, then it's content disapears."

Biorąc to pod uwagę należy w momencie rozpoczęcia 'drag' wyłączyć kontrole TinyMCE poprzez np:

  1. tinyMCE.execCommand("mceRemoveControl", false, ID_ELEMENTU);


A tuż po opuszczeniu, albo zakończeniu akcji 'drag' przywrócić kontrolę:

  1. tinyMCE.execCommand("mceAddControl", false, ID_ELEMENTU);


Należy też pamiętać, że ID muszą być generowane różne, natomiast do określonego ID widgeta można się dostać za pomocą:

  1. temp_ID = ui.item.find('textarea').attr('name');
- obiekt ui.item to jest ten który aktualnie jest sortowany

do powyższego kodu należy dodać, że aby korzystać z obiektów jQuery ui należy w arg funkcji dodać (event,ui)

Eventsy, do których trzeba przypisać te akcje to: start i stop (oczywiście w sortable())

mniej więcej powinno wyglądać to tak:

  1. sortable({
  2. //items: "li:not(.placeholder)",
  3. placeholder: "ui-state-highlight1",
  4. //items: 'li',
  5. //handle:'.handle',
  6. cancel: ':input,button',
  7. start: function(event,ui){
  8. temp_name = ui.item.find('textarea').attr('name');
  9. if(temp_name){
  10. tinyMCE.execCommand("mceRemoveControl", false, temp_name);
  11. }else{
  12. ui.item.find('#editor').html('<textarea id="elm'+i+'" name="elm'+i+'" style="width:100%"></textarea>');
  13. tinyMCE.init({
  14. // General options
  15. //mode : "exact",
  16. elements : "elm"+i+"",
  17. theme : "advanced"
  18.  
  19. });
  20. tinyMCE.execCommand("mceRemoveControl", false, 'elm'+i);
  21. i++;
  22. }
  23. },
  24. receive: function(event, ui) {
  25. },
  26. stop: function(event,ui){
  27. if(ui.item.children('span').text() == "Tekst"){
  28. var temp_name = ui.item.find('textarea').attr('name');
  29. tinyMCE.execCommand("mceAddControl", false, temp_name);
  30. }
  31. }
  32. });


W tym wypadku wszystko powinno działać PRAWIE dobrze smile.gif Nie powinno działać tylko pierwsze sortowanie - pierwszy element który położymy. Dlaczego ? nie mam pojęcia, może ktoś będzie mądrzejszy ode mnie i to wyjaśni, natomiast rozwiązanie jest bardzo proste:

  1. //mode : "exact",
- zakomentować to cholerstwo, przez które wasz kolega z forum stracił 2dni !:)

Na koniec dodam, że " tinyMCE.execCommand("mceAddControl", false, temp_name);" podobno (nie sprawdzałem w dokumentacji) nie działają dla TinyMCE przyjaznego dla jQuery - działają na tym zwykłym.