Direkter Link auf das offene FCKEditor Form im BenutzerKonto

am 25.09.2008 - 09:04 Uhr in
Ich habe ein Link, der geht direkt auf das FCKEditor Form im BenutzerKonto und lautet:
print l(t('customize_editor'), "user/$user->uid/edit", array(), NULL, 'richtextsettings');
Der FCKEditor Form is by default "collapsed" was so richtig ist. So wenn der User den obrigen Link benutzt, wird das FCKEditor Form geschlossen angezeig, es sollte jedoch direkt offen angezeigt werden.
Was muss ich da machen?
- Anmelden oder Registrieren um Kommentare zu schreiben
fieldset
am 25.09.2008 - 09:18 Uhr
Moin!
Einfach ist langweilig, oder? :-)
Das Fieldset wird ja nur geöffnet/geschlossen, wenn man auf den entsprechenden Link im Titel klickt. Das passiert ja mittels jQuery.
Da Du jedoch den Status ändern willst, wenn Du direkt auf die Seite mit Anker gehst, musst Du irgendwie die Klasse "collapsed" wegbekommen.
Das geht einerseits über ein neues Modul, bei dem Du in hook_form_alter() (
$form_id == 'user_edit'
) abfragst, ob der Anker "richtextsettings" in der URL enthalten ist und dementsprechend das fieldset auf'#collapsed' => FALSE'
setzt.Oder Du packst in Deine page.tpl.php ein wenig jQuery rein, mit dem Du schaust, ob der Anker in der URL enthalten ist und dann schnell die CSS-Klasse "collapsed" vom fieldset entfernst.
Die erste Variante ist sauberer und würde ich auch präferieren.
hth,
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
jquery <?phpvar url =
am 25.09.2008 - 09:22 Uhr
jquery
<?php
var url = document.URL;
var splits = url.split("#");
var anchor = splits.pop();
$("#". anchor).click();
?>
--------------
Blog www.freeblogger.org: Deutscher IRC-Channel: irc.freenode.net #drupal.de ... Jabber-me: dwehner@im.calug.deXING
Parse error: syntax error,
am 25.09.2008 - 10:45 Uhr
Parse error: syntax error, unexpected T_VAR in der var url Zeile. Was ist noch nicht richtig?
jQuery
am 25.09.2008 - 12:29 Uhr
Was ist noch nicht richtig?
Das ist kein PHP, sondern Javascript.
Also:
<head>
...
<script type="javscript">
var url = document.URL;
try {
var splits = url.split("#");
var anchor = splits.pop();
$("#". anchor).click();
} catch (e) {}
</script>
</head>
hth,
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Keine Fehlermeldung mehr und
am 25.09.2008 - 14:56 Uhr
Keine Fehlermeldung mehr und der Link funktioniert, jedoch das Field bleibt geschlossen. Wir nähern uns der Lösung ...
jQuery
am 25.09.2008 - 15:19 Uhr
Keine Fehlermeldung mehr und der Link funktioniert, jedoch das Field bleibt geschlossen. Wir nähern uns der Lösung ...
Probier mal, die CSS-Klasse zu entfernen:
<script type="javscript">
var url = document.URL;
try {
var splits = url.split("#");
var anchor = splits.pop();
$("#". anchor).removeClass('collapsed');
} catch (e) {}
</script>
und schau mal, was denn danach im Quelltext steht (mit firebug).
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Auch wenn ich $("#".
am 26.09.2008 - 04:38 Uhr
Auch wenn ich
$("#". anchor).removeClass('collapsible collapsed');
verwende funktioniert es nicht.Der Quelltext:
<div id="richtextsettings"><fieldset class="collapsible collapsed"><legend><a href="#">Rich Text Editor settings</a></legend>
Die Class wird nicht entfernt, im Firebug steht weiterhin
<fieldset class="collapsible collapsed">
.jQuery
am 26.09.2008 - 13:02 Uhr
Moin!
Auch wenn ich
$("#". anchor).removeClass('collapsible collapsed');
verwende funktioniert es nicht.Das kann auch nicht funktionieren, da Du immer nur eine Klasse so entfernen kannst. Und Javascript kennt keine Punkte als String-Verbinder, nur "+" (hatte ich oben gar nicht bemerkt).
Also:
$(document).ready(function() {
$("#" + anchor).removeClass('collapsed');
/* $("#" + anchor).removeClass('collapsible'); */
});
Es reicht, wenn Du "collapsed" entfernst. Die zweite Klasse sagt dem System nur, dass das fieldset prinzipiell zusammenfaltbar ist.
hth,
Stefan
PS: Der hier genannte Quelltext funktioniert bei mir prinzipiell.
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
jQuery
am 26.09.2008 - 13:17 Uhr
Ich frage mich allerdings gerade, ob das mit dem Anker wirklich so funktioniert.
Hat denn das fieldset wirklich die Id? Wenn nicht, müsstest Du erstmal das fieldset finden.
Also ausgehend vom Element mit der Id nach oben gehen (in der Hierarchie), bis mal ein fieldset auftaucht und dann dessen Klasse entfernen.
Ok, habs gerade mal ausprobiert: ist doch nicht ganz so einfach.
Die erste Id im fieldset ist "edit-fckeditor-default". Von dort muss man dann 3 Ebenen nach oben um das fieldset zu haben:
<script type="text/javascript">
$(document).ready(function() {
var elem = $('#edit-fckeditor-default');
var fieldset = $(elem).parent().parent().parent();
$(fieldset).removeClass('collapsed');
});
</script>
Das funktioniert bei mir (und ist sicherlich noch schöner hinzubekommen).
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
+ Also es funktioniert, wenn
am 26.09.2008 - 14:34 Uhr
+ Also es funktioniert, wenn der Link
print l(t('customize_editor'), "user/$user->uid/edit", array(), NULL, 'richtextsettings');
von einer anderen URL kommt, wo sich das Fieldset nicht befindet.- Jedoch funktioniert es nicht mit diesem Link noch über
<a href="#richtextsettings" title="Test innerhalb einer Seite »">Anker</a>
. Da kommt man an die richtige Stelle, aber das Fiedset bleibt zu.- Noch schlimmer ist, wenn man auf die Seite kommt, ohne das Fieldset (#) angesprochen zu haben, wird das Fieldset bereits offen angezeigt.
Desweitern bräuchte ich eine grundsätzliche Lösung, da ich diese Spiel mit sechs weiteren Fieldsets machen möchte.
Ich bin von Deiner Geduld begeistert!
Schnittmenge
jQuery
am 26.09.2008 - 17:20 Uhr
Moin!
Mal vorweg: hast Du mal eine Testseite, wo ich mir das mal live anschauen könnte?
+ Also es funktioniert, wenn der Link
print l(t('customize_editor'), "user/$user->uid/edit", array(), NULL, 'richtextsettings');
von einer anderen URL kommt, wo sich das Fieldset nicht befindet.Hatte ich auch so getestet. Allerdings frage ich mich noch immer, wo der Anker "richtextsettings" bei Dir herkommt. Den finde ich bei mir nirgendwo.
- Jedoch funktioniert es nicht mit diesem Link noch über
<a href="#richtextsettings" title="Test innerhalb einer Seite »">Anker</a>
. Da kommt man an die richtige Stelle, aber das Fiedset bleibt zu.Macht Sinn, da der jQuery-Code nur beim Öffnen der Seite ausgeführt wird. Da die Seite jedoch bei einem einfachen Klick auf einen Ankerverweis innerhalb der angezeigten Seite nicht erneut geladen wird, wird der Code auch nicht ausgeführt.
Eine Möglichkeit wäre, diesem Ankerverweis eine zusätzliche Klasse mitzugeben und dann beim
click()
-Ereignis zusätzlich den obigen jQuery-Code ausführen zu lassen.- Noch schlimmer ist, wenn man auf die Seite kommt, ohne das Fieldset (#) angesprochen zu haben, wird das Fieldset bereits offen angezeigt.
Auch klar, da keine Prüfung stattfindet, ob überhaupt ein Anker in der URL enthalten ist.
Desweitern bräuchte ich eine grundsätzliche Lösung, da ich diese Spiel mit sechs weiteren Fieldsets machen möchte.
Ok:
<script type="text/javascript">
function uncollapseReferencedFieldSet() {
var url = document.URL;
try {
var splits = url.split("#");
if (splits.length < 1) return;
var elem = $('#' + splits.pop());
while (elem.tagName.toLowerCase() != 'fieldset') {
elem = $(elem).parent();
}
$(elem).removeClass('collapsed');
} catch (e) {}
}
$(document).ready(function() {
uncollapseReferencedFieldSet();
$('a.uncollapse').click(function() {
$(this).click();
uncollapseReferencedFieldSet();
});
});
</script>
Den letzten Teil konnte ich jetzt leider nicht testen.
Ich bin von Deiner Geduld begeistert!
Na und ich erst :-)
hth,
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Testseite
am 27.09.2008 - 05:11 Uhr
Besuche b2.test.consenser.org und melde Dich als user6 (Passwort: user6) an. Auf /user/95/edit findest Du die Seite von der wir reden. Auf /node/add/consensus hast Du einen Link auf das Fieldset.
Status:
+ Also es funktioniert, wenn der Link print l(t('customize_editor'), "user/$user->uid/edit", array(), NULL, 'richtextsettings'); von einer anderen URL kommt, wo sich das Fieldset nicht befindet.
Funktioniert nicht mehr. Der Anker "richtextsettings" kommt vom FCKEditor, wenn Du Deinen Benutzer das Recht gibst den FCKEditor zu personalisieren zu können.
- Jedoch funktioniert es nicht mit diesem Link noch über Anker. Da kommt man an die richtige Stelle, aber das Fiedset bleibt zu.
Daran hat sich nicht geändert
- Noch schlimmer ist, wenn man auf die Seite kommt, ohne das Fieldset (#) angesprochen zu haben, wird das Fieldset bereits offen angezeigt.
Das Problem ist gelöst.
Saludos,
Daniel
jQuery und fieldset
am 27.09.2008 - 14:34 Uhr
Besuche b2.test.consenser.org und melde Dich als user6 (Passwort: user6) an. Auf /user/95/edit findest Du die Seite von der wir reden. Auf /node/add/consensus hast Du einen Link auf das Fieldset.
Ok, jetzt sehe ich :-)
+ Also es funktioniert, wenn der Link print l(t('customize_editor'), "user/$user->uid/edit", array(), NULL, 'richtextsettings'); von einer anderen URL kommt, wo sich das Fieldset nicht befindet.
Funktioniert nicht mehr. Der Anker "richtextsettings" kommt vom FCKEditor, wenn Du Deinen Benutzer das Recht gibst den FCKEditor zu personalisieren zu können.
Ah, war bei meiner Testinstallation gestern nicht so. Macht aber nichts.
Dann wird das Ganze sogar noch ein wenig einfacher:
<script type="text/javascript">
function uncollapseReferencedFieldSet(anchor) {
var url = document.URL;
try {
if (!anchor) {
var splits = url.split("#");
if (splits.length < 1) return;
var anchor = '#' + splits.pop();
}
var fieldset = $(anchor + ' fieldset');
$(fieldset ).removeClass('collapsed');
} catch (e) {}
}
$(document).ready(function() {
uncollapseReferencedFieldSet();
$('a.uncollapse').click(function() {
/* $(this).click(); */
uncollapseReferencedFieldSet($(this).href());
});
});
</script>
- Jedoch funktioniert es nicht mit diesem Link noch über Anker. Da kommt man an die richtige Stelle, aber das Fiedset bleibt zu.
Daran hat sich nicht geändert
Ja, weil der Code nicht zur HTML-Struktur gepasst hat.
Probiers mal mit obenstehendem Quelltext. Könnte funktionieren.
Grüsse,
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
+ Also es funktioniert, wenn
am 27.09.2008 - 21:44 Uhr
+ Also es funktioniert, wenn der Link print l(t('customize_editor'), "user/$user->uid/edit", array(), NULL, 'richtextsettings'); von einer anderen URL kommt, wo sich das Fieldset nicht befindet. SUPER
+ Wenn man auf die Seite kommt, ohne das Fieldset (#) angesprochen zu haben, wird das Fieldset geschlossen angezeigt. SUPER
- Jedoch funktioniert es nicht mit obrigen Link noch über
<a href="#richtextsettings" title="Test innerhalb einer Seite »">Anker auf richtextsettings</a>
. Da kommt man an die richtige Stelle, aber das Fiedset bleibt zu. FUNKTIONIERT NOCH NICHTWir sind fast am Ziel. ;-)
Saludos,
Daniel
PS: Wenn wir uns treffen, brauchst du kein Geld mitnehmen. Ich lade ein ..
Klasse
am 28.09.2008 - 09:52 Uhr
- Jedoch funktioniert es nicht mit obrigen Link noch über
<a href="#richtextsettings" title="Test innerhalb einer Seite »">Anker auf richtextsettings</a>
. Da kommt man an die richtige Stelle, aber das Fiedset bleibt zu.Gib mal dem Link die Klasse "uncollapse" mit:
<a href="#richtextsettings" class="uncollapse" title="Test innerhalb einer Seite »">Anker auf richtextsettings</a>
PS: Wenn wir uns treffen, brauchst du kein Geld mitnehmen. Ich lade ein ..
Ok. Spätestens im nächsten Jahr auf der drupalCon ;-)
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Zitat: Gib mal dem Link die
am 28.09.2008 - 13:10 Uhr
Gib mal dem Link die Klasse "uncollapse" mit:
<a href="#richtextsettings" class="uncollapse" title="Test innerhalb einer Seite »">Anker auf richtextsettings</a>
Dies war leider nicht die Lösung.
uncollapse
am 28.09.2008 - 13:53 Uhr
Hm, kommen denn irgendwelche JS-Fehler (im Firebug)?
Mach mal
$(document).ready(function() {
uncollapseReferencedFieldSet();
$('a.uncollapse').click(function() {
console.log('öffne ' + $(this).href());
uncollapseReferencedFieldSet($(this).href());
});
});
und schau, was in der Console vom firebug steht. Wenn da nicht "öffne richtextsettings" steht, findet jQuery den Link irgendwie nicht.
Mir ist allerdings das hier immer noch schleierhaft:
Der Anker "richtextsettings" kommt vom FCKEditor, wenn Du Deinen Benutzer das Recht gibst den FCKEditor zu personalisieren zu können.
Ich habs jetzt installiert und konfiguriert, allerdings wird das fieldset bei mir nicht in ein extra div-Element mit der Id gepackt. Hast Du da noch irgendeine Theme-Funktion überschrieben?
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.
Anker gesetzt
am 29.09.2008 - 10:25 Uhr
Also ich sehe kein "öffne richtextsettings" siehst Du es?
Richtig ich habe per div ein Anker gesetzt. Bei mir steht in der custom_form_alter Funktion folgende Zeilen:
$request = request_uri();
$form['fckeditor']['fckeditor']['#prefix'] = '<div
id="richtextsettings">';
$form['fckeditor']['fckeditor']['#suffix'] = '</div>';
Hast Du nicht mal Lust, dass wir uns in Mumble treffen? Ich bin über den drupal.de IRC-Channel zu erreichen.
Also
am 29.09.2008 - 14:37 Uhr
Das Aufrufen von Anker auf der selben Seite habe ich jetzt anders gelöst und werde nur den Teil benutzen der den Anker von einer anderen Seite aufruft. Vielen Dank für Deine Hilfe.
Was kann ich rausnehmen?
am 29.09.2008 - 15:27 Uhr
Also wenn ich nur die Funktion haben möchte, wenn ich von einer anderen Seite komme, was kann ich aus dem Code herausnehmen?
<script type="text/javascript">
function uncollapseReferencedFieldSet(anchor) {
var url = document.URL;
try {
if (!anchor) {
var splits = url.split("#");
if (splits.length < 1) return;
var anchor = '#' + splits.pop();
}
var fieldset = $(anchor + ' fieldset');
$(fieldset ).removeClass('collapsed');
} catch (e) {}
}
$(document).ready(function() {
uncollapseReferencedFieldSet();
$('a.uncollapse').click(function() {
/* $(this).click(); */
uncollapseReferencedFieldSet($(this).href());
});
});
</script>
jQuery und fieldset
am 29.09.2008 - 17:53 Uhr
Moin!
Hab gerade Urlaub, daher die etwas späte Reaktion ;-)
$('a.uncollapse').click(function() {
/* $(this).click(); */
uncollapseReferencedFieldSet($(this).href());
});
kann dann weg.
schöne Grüsse,
Stefan
Tipp: Beachte die Verhaltensregeln des DrupalCenter.