Beim Speichern eines Nodes den Inhalt von einem Taxonomy-Feld in ein anderes Taxonomy-Feld kopieren/verschieben
am 12.11.2015 - 20:26 Uhr in
Gegeben ist ein Inhaltstyp mit 2 Felden:
- Feld1 "Neuer Tag", Typ: Referenz auf Taxonomy-Begriffe, Element: Autovervollständigen-Feld
- Feld2: "Tags", Typ: Referenz auf Taxonomy-Begriffe, Element: Ankreuzfelder/Auswahlknöpfe (also Checkboxes)
Beim Speichern (nach Erstellen oder Ändern) eines Nodes sollen alle im Feld1 mittels Autovervollständigen-Feld eingegebene Werte in das Feld2 kopiert werden.
--> Dazu suche ich die Codestellen (z. Bsp. in tempplate.php) bzw. ungefähre Codesnippets, wie das funktonieren könnte. Test und genaue Umsetzung kann ich selbst machen, nur der erste Ansatz fehlt mir noch.
Nach dem Speicher wird also dieser (zu progammierende) Code aufgerufen und damit werden die unter "Neuer Tag" eingegebene Begriffe zu den normalen Begriffen im Feld "Tags" kopiert bzw. dorthin verschoben.
Öffnet man nach dem Speicher die Node wieder, dann ist das Feld "Neuer Tag" leer und das Feld "Tags" erweitert um die kopierten Werte. Beim Kopieren wurde darauf geachtet, dass es keine Doppel-Begriffe im Vokabular gibt. (Das Taxonomy-Vokabular wurde ebenfals um diese Werte erweitert.)
Weiters sollten dabei auch die dem Node zugeordneten Begriff alphabetisch sortiert werden.
Wie kann man das realisieren?
Entweder mit eigenem Code, der an der richtigen Stelle nach dem Speichern eines Nodes eingreift ...
... oder gibt es eine ganz andere Lösung?
DANKE!
- Anmelden oder Registrieren um Kommentare zu schreiben
ich verstehe zwar den Sinn dieser Redundanz nicht
am 12.11.2015 - 21:47 Uhr
aber mit Rules solltest du das gemanaged bekommen
Grüße
Ronald
Wirklich mit Rules?
am 12.11.2015 - 22:00 Uhr
Wieso, warum soll das mit Rules gehen?
Nach dem Kopieren der neuen Begriffe aus dem Feld "Neue Tags" zu den Taxonomy-Tags müsste für jeden neuen Begriff auch ein Url-Alias angelegt werden.
Ich glaube im Moment noch nicht, dass das alles mit Rules geht.
Geht das nicht viel einfacher mit ein paar Zeilen Code?
Nur wo setzt man an?
Der Sinn des ganzen ist es, das Verhalten von Taxonomy Super Select, welches nur für Drupal 6 gibt, nachzubauen. Oder kennst Du jemanden der Taxonomy Super Select nach Drupal 7 portieren kann?
DrupalFan schriebGegeben ist
am 12.11.2015 - 23:43 Uhr
Gegeben ist ein Inhaltstyp mit 2 Felden:
Beim Speichern (nach Erstellen oder Ändern) eines Nodes sollen alle im Feld1 mittels Autovervollständigen-Feld eingegebene Werte in das Feld2 kopiert werden.
--> Dazu suche ich die Codestellen (z. Bsp. in tempplate.php) bzw. ungefähre Codesnippets, wie das funktonieren könnte. Test und genaue Umsetzung kann ich selbst machen, nur der erste Ansatz fehlt mir noch.
Nach dem Speicher wird also dieser (zu progammierende) Code aufgerufen und damit werden die unter "Neuer Tag" eingegebene Begriffe zu den normalen Begriffen im Feld "Tags" kopiert bzw. dorthin verschoben.
Öffnet man nach dem Speicher die Node wieder, dann ist das Feld "Neuer Tag" leer und das Feld "Tags" erweitert um die kopierten Werte. Beim Kopieren wurde darauf geachtet, dass es keine Doppel-Begriffe im Vokabular gibt. (Das Taxonomy-Vokabular wurde ebenfals um diese Werte erweitert.)
1. Eigenes Modul mit hook_form_FORM_ID_alter und hook_node_presave! Darüber kommt man an die Form-Values ran und kann sie ins andere Feld kopieren - danach über die hooks Feld1 "Neuer Tag" leeren (Feld1 zu leeren, geht auch mit Rules).
2. Wenn der Node zum editieren geöffnet wird, kann man die Werte aus Feld2: "Tags" wieder auslesen und das Formfeld von Feld1 "Neuer Tag" vorfüllen (danach kommt wieder 1 - sodass die Werte von Feld1 niemals in der Datenbank gespeichert werden)!
Weiters sollten dabei auch die dem Node zugeordneten Begriff alphabetisch sortiert werden.
Das weiß ich nicht!
Drupal rockt!!!
Genauer
am 12.11.2015 - 23:55 Uhr
Danke.
Dein Punkt 2 ist aber nicht gewünscht. Wenn Du die Funktionen von Taxonomy Super Select (D6) kennst, dann weißt Du, dass die Begriffe über die vielen Checkboxes ausgewählt werden können und über das Autocomplete-Feld neue Begriffe hinzugefügt werden können, die dann aber übernommen werden in die Datenbank. Dein Punkt 2 passt also nicht.
Beim nächsten Editieren ist also Feld 1 (Neuer Tag) immer leer, weil die dort das letzte Mal eingegebenen Werte ja in Feld2 verschoben wurden und dort gespeichert wurden und vollständige Taxonomy-Begriffe dieses Vokabulars geworden sind und in diesem Node auch hinzugefügt wurden.
hook_form und hook_node_presave sind schon gute Ansätze, aber ich bräuchte es etwas genauer, um es umsetzen zu können.
DrupalFan schrieb .... Wenn
am 13.11.2015 - 00:09 Uhr
.... Wenn Du die Funktionen von Taxonomy Super Select (D6) kennst ...
Nein - ich kenne das nicht!
Dein Punkt 2 ist aber nicht gewünscht. Wenn Du die Funktionen von Taxonomy Super Select (D6) kennst, dann weißt Du, dass die Begriffe über die vielen Checkboxes ausgewählt werden können und über das Autocomplete-Feld neue Begriffe hinzugefügt werden können, die dann aber übernommen werden in die Datenbank. Dein Punkt 2 passt also nicht.
Beim nächsten Editieren ist also Feld 1 (Neuer Tag) immer leer, weil die dort das letzte Mal eingegebenen Werte ja in Feld2 verschoben wurden und dort gespeichert wurden und vollständige Taxonomy-Begriffe dieses Vokabulars geworden sind und in diesem Node auch hinzugefügt wurden.
Dann lässt Du Punkt 2 halt weg oder passt ihn so an, dass Du Du beim editieren des fertigen Nodes halt die Values aus Feld1 ausliest und mit den bestehenden Values in Feld2 vergleichst - wenn etwas neues in Feld1 vorhanden ist, "hängst" Du die Values dann einfach an Feld2 ran.
hook_form und hook_node_presave sind schon gute Ansätze, aber ich bräuchte es etwas genauer, um es umsetzen zu können.
So etwas ähnliches habe ich vor 3 Wochen gemacht aber ich habe jetzt keine Muße das rauszusuchen. Über die hook-Namen findest Du bei Google zahlreiche Beispiele (wie Du auf die Pre-Savevalues der Form zugreifen kannst und sie in andere Felder schreibst).
Drupal rockt!!!
Bsp-Code
am 13.11.2015 - 00:15 Uhr
Ja, so ähnlich.
Bräuchte noch ein kleines Beispiel oder einen Code-Ansatz.
<?php function
am 13.11.2015 - 00:49 Uhr
<?php
function MODULNAME_form_DEIN_CONTENT_TYPE_MASCHINNAME_node_form_alter(&$form, &$form_state, $form_id) {
#Formfeld vorfüllen
$form['field_em_telefon']['und']['0']['value']['#default_value'] = '1234567';
$form['field_agentur_model_adresse']['und']['0']['#default_value']['street'] = $street;
#nur ausfuehren wenn Node neu ist und noch keine NID hat
if (is_null($form['nid']['#value'])) {
...
}
#nur ausfuehren wenn Node NICHT neu ist und schon eine NID hat
if (!is_null($form['nid']['#value'])) {
....
}
}
#dieser Hook ist die letzte Möglichkeit Daten zu ändern bevor die Daten in die Datenbank geschrieben werden
function MODULNAME_node_presave($node) {
if ($node->type =='DEIN_CONTENT_TYPE_MASCHINNAME') {
$node->field2['und']['0']['value'] = $node->field1['und']['0']['value'];
#danach Field1 leeren - das musst du mal testen
$node->field1['und']['0']['value'] = '';
}
}
?>
Wie Du bestehende Multivalue-Fields handelst und dort neue Values anhängst, musst Du selbst nachschauen (dazu wird es sicherlich auch enstprechende Hooks geben).
Drupal rockt!!!
DANKE! Modul selbst geschrieben
am 29.11.2015 - 02:00 Uhr
Habe das Modul jetzt selbst geschrieben.
Ähnlich wie Du es vorgeschlagen hat, allerdings doch in einigen Details anders. Diese Details kommt man erst immer beim Programmieren drauf und am Ende schaut es dann doch um einiges anders aus. Aber das Prinzip ist vergleichbar und DANKE für die HILFE!