Avatar billede heyn Nybegynder
22. januar 2012 - 23:39 Der er 13 kommentarer og
1 løsning

HJÆLP - Kan nogle løse save-problem i TinyMCE WYSIWYG editor.

Hej Eksperter.

Jeg har søgt og søgt i dagevis efter en løsning på dette problem. Jeg er ved at blive helt skør.

Når jeg i TinyMCE-editoren ( http://www.tinymce.com ) klikker på 'save' (altså den med disketten) sker der intet.
Efter en del søgen fandt jeg ved hjælp af Firebug ud af at der kom en fejlmelding når jeg klikker på save:

"r is undefined" i filen tiny_mce.js som er minimeret.

Når den tilsvarende ikke-minimerede fil tiny_mce_src.js omdøbes til tiny_mce.js bliver det til:

"f is undefined" i filen tiny_mce.js på linie 12106.

Variablerne r og f er de samme. De ligger begge i koden:

return f.apply(s || t, Array.prototype.slice.call(arguments, 1));

I den minimerede fil kaldes variablen f bare for r. Ellers er koden helt ens.

Det skal lige nævnes at jeg anvender versionen:
Version: 3.4.7 (2011-11-03) af TinyMCE

Jeg vil være enormt taknemmelig hvis nogle der kender en løsning på dette problem vil fortælle mig det.
Jeg kan jo ikke rigtig præsentere mit produkt før det er løst.

Desuden vil i spare staten for en plads på en sindsygeanstalt :)

MVH Christian
Avatar billede olebole Juniormester
23. januar 2012 - 00:01 #1
<ole>

Du må lave en fejl, men det er umuligt at sige, hvor. Prøv at lægge et link til et eksempel

/mvh
</bole>
Avatar billede heyn Nybegynder
23. januar 2012 - 00:10 #2
Den kører på localhost p.t.

Jeg lægger et link op hurtigst muligt og melder tilbage.

Jeg har ikke ændret i koden, så jeg har svært ved at overskue hvad det skulle være.
Avatar billede olebole Juniormester
23. januar 2012 - 00:23 #3
Det må være denne metode (min editor er godt nok version 3.4.6):

        execCallback : function(n) {
            var t = this, f = t.settings[n], s;

            if (!f)
                return;

            // Look through lookup
            if (t.callbackLookup && (s = t.callbackLookup[n])) {
                f = s.func;
                s = s.scope;
            }

            if (is(f, 'string')) {
                s = f.replace(/\.\w+$/, '');
                s = s ? tinymce.resolve(s) : 0;
                f = tinymce.resolve(f);
                t.callbackLookup = t.callbackLookup || {};
                t.callbackLookup[n] = {func : f, scope : s};
            }

            return f.apply(s || t, Array.prototype.slice.call(arguments, 1));
        },

- men om den skriver man i dokumentationen:

execCallback method
public function execCallback(n:String):Object

Executes a legacy callback. This method is useful to call old 2.x option callbacks. There new event model is a better way to add callback so this method might be removed in the future.

Parameters
    n:String  Name of the callback to execute.

Returns
    Object - Return value passed from callback function

Så noget kunne tyde på, den metode slet ikke burde bruges(?)
Avatar billede olebole Juniormester
23. januar 2012 - 00:32 #4
Du kunne prøve at alert'e n og se, hvad den indeholder, når scriptet fejler. Derefter kan du finde ud af, hvorfor en property med det navn ikke findes i settings.

Der omkring kan årsagen ligge, hvis f bliver sat til undefined i linjen her:

var t = this, f = t.settings[n], s;

- men der er også steder senere i funktionen, hvor variablen sættes. Du må prøve at alert'e dig frem til stedet, hvor det går galt
Avatar billede heyn Nybegynder
23. januar 2012 - 01:05 #5
Jeg kan i øvrigt se på nettet at det ikke kun er ved save problemet opstår.
Også ved filemanage oplever mange fejlen.
Jeg kunne bare ikke finde en løsning.
Avatar billede heyn Nybegynder
23. januar 2012 - 01:12 #6
Der gav du mig et GODT hint!!!

Jeg havde en save_onsavecallback i MCEinit. Når jeg udkommenterer den fungerer det.

Problemet er måske at jeg ikke helt forstår hvad værdien for save_onsavecallback skal være?

Grunden til at jeg oprindeligt indsatte den var at jeg læste i TinyMCE forum at man skulle indsætte den ved AJAX-kald så man undgår at opdatere siden.
På den anden side var der også en der havde en løsning hvor save_onsavecallback ikke indgår.

Ved du hvilke værdier save_onsavecallback kan have?

MANGE tak fra Christian
Avatar billede olebole Juniormester
23. januar 2012 - 01:52 #7
save_onsavecallback er en metode. Den kan ikke 'have en værdi'  =)
Avatar billede heyn Nybegynder
23. januar 2012 - 06:53 #8
Det fungerer nu fantastisk. Også med AJAX.

Den løsning med AJAX jeg fandt på TinyMCE Forum TROR jeg var udviklet til en udgave der anvender JQery, men lidt omskrivning af koden løste problemet.

Skulle du kende til ét problem:

Når jeg sætter
save_enablewhendirty : true, (Default er FALSE) så:

- save-knappen er ikke aktiv (grå) når teksten ikke er ændret siden sidste update. (FINT NOK)
- save-knappen bliver aktiv hvis man har slettet tekst el. trykket 'return'. (FINT NOK)
- Hvis man indfører tekst uden at slette, f.eks. retter en stavefejl hvor man havde glemt et bogstav el. et ord så bliver save-knappen ikke aktiv. Først når man har slettet el. trykket return én gang bliver den aktiv. (EN FEJL)

Har du set det problem før?

I øvrigt MANGE tak for din hjælp. Du har langt fortjent dine point så smid lige et svar.

MVH Christian

P.s.
Jeg lægger snart en kopi af min løsning ind så andre kan have glæde af den.
P.s.s. Hvad gør save_onsavecallback egentlig?
I min løsning skulle jeg i TinyMCEinit sætte

save_onsavecallback : NAVNET_PÅ_DEN_FUNKTION_SOM_SENDER_TEKSTEN

(Hvis jeg altså havde brugt den metode :)
Avatar billede olebole Juniormester
23. januar 2012 - 12:47 #9
Jeg så fornylig en Ajax drevet filemanager til TinyMCE, som var en ren foræring til enhver hacker. Uploadede filers indhold blev midlertidigt - men helt uden tjek - skrevet ned i en eksekverbar fil, data.php. Det betyder, man kan uploade en 'farlig' fil med PHP-kode og kalde den noget.jpg.

Så snart den rammer serveren kan data.php kaldes og lægge hele serveren ned. Håber ikke, det er samme manager, du bruger.

Løsningen er at undersøge præcist, hvad der sker 'bag scenen' i de libraries, man bruger  *o)
Avatar billede heyn Nybegynder
23. januar 2012 - 17:32 #10
Jeg anvender ibrowser og imanager til billeder og upload. 2 plugin der primært er tænkt til upload og management af bileder i forhold til TinyMCE.
I config skal man i forvejen definere formatet på de filer man må uploade. .jpg .gif etc.
Man skal også definere hvilken mappe filerne skal placeres i.
Disse 2 filemanagere kører med phpkode. Der indgår ikke AJAX så vidt jeg kan se.
Men jeg vil lige søge på nettet for at sikre mig.

Jeg har fået 3 ens kontaktmail fra eksperten.dk som lyder:

--- " ---

Hej kære,

Mit navn er glip af Susan.

Mine fritidsinteresser er læsning, musik, se film og spille basketball.

Jeg var imponeret, da jeg så din profil i dag kl (www.eksperten.dk) og jeg blev interesseret i at mødes med dig, vil gerne diskutere vigtige spørgsmål med dig, og samt etablere et langvarigt forhold med dig.Hej kære,

...
...
...

--- " ---

Har du også fået disse mail?

Er ekspertens DB blevet krakket?

MVH Christian

P.s.
Hvad blev det til med det svar ???
Avatar billede heyn Nybegynder
24. januar 2012 - 06:33 #11
UTROLIGT - Så lykkedes det alligevel at få metoden save_onsavecallback i TinyMCE til at fungere således at jeg kan foretage AJAX kald når jeg gemmer.

I TinyMCE.init skulle jeg sætte

...
...
save_onsavecallback : postForm,
...
...

Hvor PostForm er navnet på den funktion som foretager det egentlige AJAX-kald.
Men som tidligere nævnt er det slet ikke nødvendigt at anvende denne metode, og så kan den jo gemmes til noget andet.

Min samlede løsning for at sætte TinyMCE op til at gemme med AJAX-kald blev følgende:

I TinyMCE-mappen på stien plugins/save/editor_plugin.js åbner man filen editor_plugin.js og foretager følgende ændring i koden:

Find: "formObj.submit();"
Udskift med: "postForm(ed);"

postForm er den funktion man definerer til at foretage AJAX-kaldet. Hvis man kalder funktionen noget andet er det selvfølgelig den man skal indsætte.
Det afgørende er at det er her aktionen ved eventet "Klik på save" håndteres.

I TinyMCE.init indfører man følgende:

cleanup_on_startup : true,
cleanup: true,
debug : false,

( Husk nu at undlade det sidste komme hvis du indfører dette sidst i TinyMCE.init !!!
)

MIN funktion postForm ser således ud:

function postForm(ed){
  var text = ed.getContent(); // Indhold af TinyMCE hentes
  var AreaId = ed.id;        // ID på textarea hentes
  text = text.replace(/\+/g, "&#43");
  text = text.replace(/\\/g, "&#92");
  text = escape(text);
  var pars = AreaId + '=' + text + '&T_ID=' + <?php echo $T_ID; ?>;
  var ajax = new XMLHttpRequest();
  ajax.open('POST','savetext.php',false);
  ajax.setRequestHeader('Content-type','application/x-www-form-urlencoded');
  ajax.send(pars);
}

Hvor:
- Variablen er den tekst som er skrevet i TinyMCE editoren.
- Variablen AreaID er id'et på det tekstarea hvor TinyMCE er placeret. I princippet kunne man udelade denne og så i vaiable pars indføre en anden variabel til at repræsentere teksten i AJAX-kaldet.
- Som nævnt er variablen pars den data som skal overføres med AJAX-kaldet. Alt dette med T_ID og php-kode er udelukkende fordi JEG skal bruge det at identificere teksten i min DB. Den er ikke nødvendig for andre.
- Bemærk at jeg anvender POST-metoden - IKKE GET-metoden. Dette er fordi mængden af data i POST kan være næsten ubegrænset, mens der er begrænsninger på størrelsen af URL ved anvendelse af GET. Indholdet i TinyMCE kan jo nemt blive ret stort!!!
- savetext.php er simpelthen navnet på den PHP-fil JEG anvender til at gemme teksten i DB.

HVIS man havde ønsket at anvende JQuery i stedet skulle man foretage følgende ændring i postForm:
Alt hvad der har med AJAX at gøre i postForm skal udskiftes med:

var myAjax = new Ajax.Request(
  'savetext.php',
  {
      method: 'post',
      postBody: pars,
      onComplete: showResponse
  }
);

Der findes faktisk en JQuery udgave af TinyMCE.

BEMÆRK at denne løsning kun fungerer for version 3.4.7 (mere generelt 3.4.x). I versionen 3.3.x  er det lidt anderledes. I version 3.2.x og tidligere er det FULDSTÆNDIG anderledes. Læs om løsningen for version 3.3.x og tidligere på siden http://www.tinymce.com/forum/viewtopic.php?id=5519 .

MVH Christian
Avatar billede olebole Juniormester
24. januar 2012 - 13:16 #12
- men det har intet med Ajax at gøre. Det giver kun mening at tale om Ajax, hvis man kalder asynkront - og du kalder synkront  =)
Avatar billede heyn Nybegynder
26. januar 2012 - 09:18 #13
OK - Endnu noget jeg skal lære...

Men smid nu det svar...
Avatar billede heyn Nybegynder
15. april 2013 - 13:37 #14
Nå - Desværre ikke noget svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester