Wie ändere ich die Position der Taxonomie-Auswahl bei einem content type?
Eingetragen von grieche (71)
am 06.08.2007 - 20:55 Uhr in
am 06.08.2007 - 20:55 Uhr in
Hallo,
ich habe einen eigenen content type erstellt, nutze CCK und habe diverse Felder hinzugefügt.
Nun stört es mich, dass (siehe unter "Manage Fields") die Standard-Felder "title", "taxonomy" und "body" fest auf die Gewichtung -5, -3 und 0 eingestellt sind und sich offenbar nicht ändern lassen. Ich möchte aber die Taxonomy-Auswahl statt bei -3 lieber unten bei etwa +4 haben.
Wie kann ich denn die Reihenfolge/Gewichtung dieser Standardfelder ändern?
Danke.
- Anmelden oder Registrieren um Kommentare zu schreiben
... das würde mich auch
am 07.08.2007 - 10:32 Uhr
... das würde mich auch sehr interessieren.
vielleicht hilft der Patch
am 07.08.2007 - 10:43 Uhr
vielleicht hilft der Patch http://drupal.org/node/157899
Ich habe den Patch eben
am 07.08.2007 - 16:13 Uhr
Ich habe den Patch eben ausprobiert (angewendet auf CCK 1.5, keine dev-Version, richtig?). Auf den ersten Blick ein Fortschritt: Ich kann das Gewicht von "body" ändern, leider aber nur das.
Aber es gäbe eine prinzipielle Lösung, denn nun kann man nämlich body, title und taxonomy zuvor angelegten Feld-Gruppen zuordnen. So könnte man z.B. eine neue Feldgruppe "KategorieWahl" erstellen, das Feld taxonomy dieser Gruppe zuordnen und die Gewichtung dieser Gruppe ändern. Die restlichen Felder ordnet man einer anderen Feldgruppe zu und kann nun über die Gruppen-Gewichtung die Reihenfolge anpassen. Mann-o-Mann, wie umständlich ...
Aaaaaber: Der Patch ist bei mir leider buggy! Wenn ich mehrere Felder derselben Gruppe zuordnen möchte, dann werden Fehler produziert und die Zuordnung wird nicht übernommen (nur für ein Feld).
Insonfern habe ich leider noch keine Lösung - aber es fällt mir schwer zu glauben, dass ich der erste mit diesem Problem bin. Aus Usability-Sicht ist es doch Unfug, zwischen Title und Body eine manchmal ellenlange Taxonomy-Auswahl hinzuklatschen - das möchte man eher zu Beginn oder am Ende haben, oder etwa nicht?
Du könntest ein eigenes
am 07.08.2007 - 16:23 Uhr
Du könntest ein eigenes Template für das Eingabeformular erstellen und darin die Formularelemente beliebig anordnen, z.B. so: http://drupal.org/node/101092
--
bv - drupalcenter.de
Gerade ausprobiert ... aber
am 07.08.2007 - 18:09 Uhr
Gerade ausprobiert ... aber leider scheint das Tutorial veraltet zu sein und nicht mehr mit Drupal 5 zu funktionieren (und es sind Bugs in der Anleitung, alle Screenshots fehlen auch).
Bei Schritt 8. z.B. soll man einen PHP-Code im eigenen *.tpl.php eingeben, der eine "big long list of information describing the fields available to your input form" ausgibt. Leider gibt Drupal an dieser Stelle aber nur den PHP-Code selbst aus, wenn man das eingibt, was im Tutorial steht.
Der Bug hier liegt aber im Tutorial selbst: Da hat der Drupal Input-Filter dem Schreiber offenbar einen Streich gespielt und den code ungültig gemacht. Korrekt wäre:
... print "<code>"; print_r(array_values($form)); print "</code_dashierlöschen_>"; ...
(den letzten Tag musste ich so angeben, sonst wäre es auch hier nicht darstellbar)Hat man das erstmal gemeistert (gibt's noch mehr solcher Überraschungen in Tutorials?), dann erhält man tatsächlich eine ellellange Ausgabe, allerdings konnte ich die Struktur nicht darin wiederfinden, die das Turorial als Basis voraussetzt. Dies nur mal zur Warnung an Nachahmer (aber vielleicht sehe ich da etwas nicht).
In den Kommentaren wird eine alternative Vorgehensweise angerissen, mit der ich leider von meinem derzeitigen Verständnis her wenig anfangen kann - keine Ahnung, wie ich damit die Reihenfolge der Felder geändert kriege (evtl. durch overriding des weight-wertes aller Felder? Nur wo und wie?).
Im Grunde gibt es also noch keine Lösung, die nachvollziehbar und aktuell wäre ...
So scheint's zu gehen
am 07.08.2007 - 21:36 Uhr
Hallo,
ich hab gerade mal folgende Methode versucht, und auf den ersten Blick funktioniert sie:
Man erstellt ein eigenes Modul XYZ und fügt darin folgende Funktion ein:
function xyz_form_alter($form_id, &$form) {
if (isset($form['taxonomy'])) {
$form['taxonomy']['#weight'] = -999;
}
}
Damit ist es mir zumindestens auf meiner Site gelungen, die Taxonomy-Auswahl ganz nach oben (-999) oder ganz nach unten (999) zu bewegen. Allerdings muss man möglicherweise Folgendes beachten (hab ich nicht getestet):
Das Ganze ist ja eine Implementierung des Drupal Hooks hook_form_alter, der natürlich auch im Taxonomy Modul auftaucht, da wird nämlich der Wert "-3" fest eingestellt. Drupal ruft die Hooks aller Module der Reihenfolge nach auf, und zwar vermutlich alphabetisch. Wenn man also das Gewicht des Formularfelds hier ändern will, muss das eigene Modul NACH dem Taxonomy-Modul dran kommen, ergo muss man als Namen irgend etwas nach "TA..." nehmen, z.B. TEST oder WEIGHT oder XYZ, usw.
Für die anderen Felder (Title, Body) müsste das analog gehen.
Falls Drupal die Reihenfolge völlig willkürlich wählt, hat man natürlich Pech.
Aber vielleicht mach ich mir da auch zu viel Gedanken...
Gruß,
Boris
form_alter
am 07.08.2007 - 21:44 Uhr
@bb: du machst dir nicht zu viel Gedanken und hast vollkommen recht. Allerdings kann man mit der Methode nur den gesamten Taxonomy-Bereich verschieben. Wenn man aber für das CCK-Formular ein eigenes Template anlegt, hat man Einfluss auf die Positionierung der Drop-Down Box jedes Vokabulars. Und das ist manchmal auch erforderlich.
vg
--
md - DrupalCenter
mdwp* :: Drupal Services
vg
md - DrupalCenter.de
mdwp* Drupal Consulting & Services
Modul-Skelett?
am 07.08.2007 - 22:41 Uhr
@bb: Danke, klingt vielversprechend, würde ich gerne mal ausprobieren. Wo finde ich ein Modul-Skelett, um den Code hineinzupasten?
@md: Zum Glück reicht es mir schon, wenn ich nur den Taxonomy-Bereich verschieben kann. Zum Thema Template für ein CCK-Formular: Gibt es dazu evtl. irgendwo ein Tutorial oder einen Screencast? Danke.
FAQ
am 07.08.2007 - 22:58 Uhr
Alles hier bei uns im DC: http://www.drupalcenter.de/faq/4468
Ist zwar kein Tutorial oder Screencast, sollte aber trotzdem für den Anfang reichen.
vg
--
md - DrupalCenter
mdwp* :: Drupal Services
vg
md - DrupalCenter.de
mdwp* Drupal Consulting & Services
FAQ - Schlüssel zur Erkenntnis ...
am 08.08.2007 - 10:34 Uhr
Die FAQ hatte ich schon gelesen, erkannte aber nicht, wo es mich konkret bei diesem Problem weiterbringt. Ist es vielleicht dieser Teil hier, von dem aus ich weitersuchen muss?
"... Auch für Formulare lassen sich so eigene Templates erstellen:
comment-form.tpl.php
user-login-form.tpl.php ..."
Ich schliesse daraus, dass ich für meinen Content Type ein eigenes Template schreiben kann (eigenertype-form.tpl.php), habe dann aber immer noch das Problem, wie ich darin konkret die einzelnen CCK-Felder ausgebe ...
Skelett
am 08.08.2007 - 11:35 Uhr
Hallo,
mach einfach unter Modules ein Unterverzeichnis, z.B. XYZ und stell da zwei Dateien rein:
1) Das wirklich völlig abgemagerte Modul xyz.php:
//edit: Sollte heissen XYZ.module --sanduhrs
//edit: Stimmt, hab gepennt - bb
<?php
function XYZ_form_alter ...
}
2) Eine Info für Drupal's Admistration, xyz.info:
name = XYZ
description = Taxonomy Auf und Ab
Beim Modul den abschließenden PHP-Tag ?> weg lassen !
Ach ja, und das Ganze vielleicht unter /sites/all/modules statt /modules, dann hast Du es sauber vom Drupal Kern getrennt...
Gruß,
Boris
CCK-Form
am 08.08.2007 - 13:23 Uhr
Die FAQ hatte ich schon gelesen, erkannte aber nicht, wo es mich konkret bei diesem Problem weiterbringt. Ist es vielleicht dieser Teil hier, von dem aus ich weitersuchen muss?
"... Auch für Formulare lassen sich so eigene Templates erstellen:
comment-form.tpl.php
user-login-form.tpl.php ..."
Ich schliesse daraus, dass ich für meinen Content Type ein eigenes Template schreiben kann (eigenertype-form.tpl.php), habe dann aber immer noch das Problem, wie ich darin konkret die einzelnen CCK-Felder ausgebe ...
Das machst du so:
<?php
//Taxonomy Drop-Down
print drupal_render($form['taxonomy'][1]);
//CCK-Field
print drupal_render($form['field_name_des_felds']);
?>
vg
--
md - DrupalCenter
mdwp* :: Drupal Services
vg
md - DrupalCenter.de
mdwp* Drupal Consulting & Services
Funktioniert auf Anhieb!
am 08.08.2007 - 22:29 Uhr
Hallo Boris,
super, danke - und am Ende recht simpel, aber man muss das erstmal wissen. Ich konnte so auch die Reihenfolge der anderen Felder variieren ...
Am Ende bleibt: Wäre sehr sinnvoll, wenn das Gewicht der Felder generell änderbar wäre - ich gebe das mal an die CCK-Entwickler weiter.
Gruß
- Ilias
Eigenes CCK-Formular
am 08.08.2007 - 22:35 Uhr
@md: Danke für den Tipp, das sieht easy aus - in der Praxis bin ich damit gescheitert, weil mir hier noch das Wissen von A-Z fehlt, um das Termplate tatsächlich zu erstellen und die benötigten Felder an die richtige Position zu setzen ... vielleicht finde ich irgendwo im Netz doch noch ein Tutorial dazu und poste es dann hier.
grieche wrote: @vielleicht
am 09.08.2007 - 07:32 Uhr
@vielleicht finde ich irgendwo im Netz doch noch ein Tutorial dazu und poste es dann hier.
Dazu habe ich Dir doch schon einen Link mit Anleitung gepostet: http://www.drupalcenter.de/node/4543#comment-15334
:)
--
bv - drupalcenter.de
Es funktioniert nun auch damit in Drupal 5.2! + Mini-Tutorial
am 15.08.2007 - 11:55 Uhr
@bv: Danke für den wiederholten Hinweis!
Kurz für alle, die es nachmachen möchten: Man sollte zuerst http://drupal.org/node/101092 UND http://drupal.org/node/98253 (das Originalposting) samt Kommentaren auf beiden Seiten durchlesen.
Grundsätzlich kann man der Anleitung unter http://drupal.org/node/101092 folgen - den Teil unten zur CSS-Formatierung kann man der Einfachheit halber erstmal komplett ignorieren.
Einen Bug im Tutorial habe ich weiter oben erwähnt (daher alle Code-Blöcke bitte kritisch betrachten). Der wesentliche Punkt, um das Ganze unter Drupal 5 zum Laufen zu bringen ist, "form_render( ..." wie im Tutorial nun überall durch "drupal_render( ..." zu ersetzen (laut Hinweis in den Kommentaren).
(Im ersten Kommentar unter http://drupal.org/node/101092 ist von einer alternativen Vorgehensweise die Rede. Mir ist es damit aber _nicht_ gelungen, die Reihenfolge der Felder zu bestimmen - wer's rausfindet, bitte posten).
Und hier mal eine sehr kurze Version des Tutorials zum Überblick:
1: CCK Content Type erstellen und bennenen, z.B. 'reihenfolgetest'
- Dort (mind.) ein eigenes Feld anlegen, z.B. 'testfeld'
- Und nun mindestens einen Inhalt/Node auf Basis dieses Content Types anlegen (nicht vergessen!). Ich nenne es mal 'Testinhalt' - weiter unten nehme ich Bezug dazu.
2: Im Verzeichnis des für die eigene Drupal-Site verwendeten Themes liegt eine Datei 'template.php'. Darin folgenden Block aus dem Tutorial ganz ans Ende einfügen und für den Namen des eigenen Content Types anpassen, in unserem Beispiel (siehe, wo überall 'reihenfolgetest' eingesetzt wurde):
EDIT (13/08/2007), Zeile 2:
Vorher stand dort "if ((arg(0) == 'node') && (arg(1) == 'add') && (arg(2) == 'content_reihenfolgetest')){".
Richtig ist "if ((arg(0) == 'node') && (arg(1) == 'add') && (arg(2) == 'reihenfolgetest')){"
// Add Form Start...........jghyde..
if ((arg(0) == 'node') && (arg(1) == 'add') && (arg(2) == 'reihenfolgetest')){
function phptemplate_node_form($form) {
return _phptemplate_callback('reihenfolgetest_edit', array('user' => $user, 'form' => $form));
}
}
// Add Form End.................
// Edit Form Start...........Dublin Drupaller..
if ((arg(0) == 'node') && (arg(2) == 'edit')){
$node = node_load(array('nid' => arg(1)));
function phptemplate_node_form($form) {
return _phptemplate_callback('reihenfolgetest_edit', array('user' => $user, 'form' => $form));
}
}
// Edit Form End........
3: Nun wieder im Verzeichnis des verwendeten Themes eine Datei 'reihenfolgetest.tpl.php file' erstellen (auf derselben Ebene wie 'template.php').
In dieser Datei definiert man nun, wie das Eingabeformular für diesen Content Type aufgebaut ist und in welcher Reihenfolge die benötigten Felder erscheinen. Im Falle unseres Beispiels könnte z.B. hier stehen:
EDIT (15/08/2007), Zeile 2 im PHP-Codeblock:
Vorher stand dort "print drupal_render($form['field_testfeld']['0']['value']);".
Es reicht, folgendes hinzuschreiben: "print drupal_render($form['field_testfeld']);"
<div id="input_reihenfolgetest">
Einleitungstext ...
<?php
print drupal_render($form['title']);
print drupal_render($form['field_testfeld']);
print drupal_render($form['body_filter']);
print drupal_render($form['taxonomy']);
?>
</div>
<?php print drupal_render($form); ?>
4: Um das Ergebnis der Änderungen des Formulars zu sehen, ruft man z.B. die Edit-Seite von 'Testinhalt' (siehe oben) auf.
In meinem Falle ist das Ergebnis so wie ich es wollte: Die Taxonomy-Eingabe rutscht weiter nach unten an die von mir gewünschte Position. Das Feld 'testfeld' habe ich direkt unter den Titel gesetzt. 'title', 'body_filter' und 'taxonomy' sind von Drupal vorgegebene Feldnamen für Standardelemente. Wie man die Feldnamen und Referenzen auf die eigenen CCK-Felder herausfindet, steht ebenfalls im Original-Tutorial (gibt es einen einfacheren Weg?).
(Die div-Angabe dient dazu, später per CSS die Ausgabe zu formatieren. Kann hier auch weggelassen werden.)
EDIT (15/08/2007): Es gibt einen wesentlich einfacheren Weg, die jeweiligen Feldnamen herauszufinden: Administer > Content management > Content types - dort den eigenen Content Type über "edit" auswählen und dann in der Tab-Leiste "Manage fields" auswählen. Alle benötigten Feldnamen stehen in der zweiten Spalte - das Tutorial unter http://drupal.org/node/101092 enthält einen inzwischen völlig überflüssigen, komplizierten Weg, um die Feldnamen zu identifizieren.
Das war's soweit - für Details sollte man sich die beiden Tutorial-Varianten mal genau und komplett (kritisch) durchlesen.
Eine interessante Ergänzung noch:
Die letzte Funktion 'print drupal_render($form);' führt dazu, dass alle Felder dieses Content Types sowie Standard-Elemente wie die Buttons am Ende eines jeden Formulars ausgegeben werden. Es kann aber sein, dass man manche Felder/Buttons _nicht_ ausgeben möchte. Dazu benutzt man die Funktion 'unset($form['feldname']);' - in unserem Beispiel, um z.B. unser Feld 'testfeld' zu unterdrücken:
<div id="input_reihenfolgetest">
Einleitungstext ...
<?php
print drupal_render($form['title']);
print drupal_render($form['body_filter']);
print drupal_render($form['taxonomy']);
unset($form['field_testfeld']);
?>
</div>
<?php print drupal_render($form); ?>
So, ich hoffe das hilft dem einen oder anderen weiter ...
- Ilias
Reihefolge der Formfelder Drupal 5.2! + Mini-Tutorial
am 09.10.2007 - 11:05 Uhr
Danke für die Zusammenfassung. Anhand Dieser habe ich es auch hinbekommen.
Es gibt nur einen kleine Fehler, der lässt sich aber, wenn man die englischen Anleitungen vorher liest, gut erkennen.
> 3: Nun wieder im Verzeichnis des verwendeten Themes eine Datei 'reihenfolgetest.tpl.php file' erstellen (auf derselben Ebene wie 'template.php').
> 4: Um das Ergebnis der Änderungen des Formulars zu sehen, ruft man z.B. die Edit-Seite von 'Testinhalt' (siehe oben) auf.
Bei 3. muss das Template 'reihenfolgetest_edit.tpl.php' benannt werden, damit man bei 4. auch etwas sieht.
Bei mir hat es so jedenfalls super geklappt.
-jofi