Startseite
  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche
Startseite › Forum › Drupalcenter.de › Module › Modul-Entwicklung ›

hook_form() und Nichtform-Seitenelemente

Eingetragen von quiptime (4972)
am 05.12.2007 - 12:29 Uhr in
  • Modul-Entwicklung
  • Drupal 5.x

Thema eigenes Modul mit eigenem Nodetype.

In Normalfall werden mit dem Gespann hook_form(), hook_nodeapi(), hook_view() die einzelnen Elemente des Nodetypes "behandelt". In hook_form() definierte Formelemente erscheinen im Bearbeitenformular. Im einfachsten Fall wird dabei das Formelement 'body' auch in der Nodeansicht verwendet. Dieses Formelement ist beim Bearbeiten eine Textarea und in der Nodeansicht ein div/p.

Nun ergeben sich fuer mich die 2. Fragen.

1.
Wie definiere ich weitere (Formel)Emente (Textareas) um sie bei der Nodeansicht angezeigt zu bekommen?
'body' ist ja schon belegt.

2.
Wie definiere ich Elemente, die bei der Nodeansicht angezeigt werden aber beim Bearbeiten kein Formelement wie bspw. eine Textarea sind?
Normalerweise kann ich ja in hook_form() nur Formelemente definieren.Ich muesste quasi ein Nichtformelement definieren. Mein Ziel ist die Verwendung eines div beim Bearbeitenformular welches dann auch in der Nodeansicht angezeigt wird. Im Bearbeitenformular soll dieses div einfach nur gezeigt werden.

Man kann sich zwar mit Tricksen behelfen indem man der '#description' ein div unterjubelt aber insgesamt funktioniert das nicht - wie mein Thread deutlich macht.

Hier stosse ich momentan an Grenzen. Scheinbar ist auch nichts dokumentiert bzw. es ist nicht machbar.

---------------------------
quiptime

‹ Welche Funktionen kann man überschreiben? theme_node_preview() aendern? ›
  • Anmelden oder Registrieren um Kommentare zu schreiben

hook_nodeapi ist nicht für dich gedacht

Eingetragen von traxer (1009)
am 05.12.2007 - 13:39 Uhr
quiptime schrieb

In Normalfall werden mit dem Gespann hook_form(), hook_nodeapi(), hook_view() die einzelnen Elemente des Nodetypes "behandelt".

hook_nodeapi ist eigentlich für Module gedacht, die das Verhalten von Inahltstypen verändern, die sie nicht selbst bereitstellen. Für Inhaltstypen, die ein Modul selbst bereitstellt gibt es die Hooks

  • hook_form
  • hook_validate
  • hook_submit
  • hook_insert
  • hook_update
  • hook_load
  • hook_view
  • hook_delete
quiptime schrieb

Wie definiere ich weitere (Formel)Emente (Textareas) um sie bei der Nodeansicht angezeigt zu bekommen?

  1. In hook_form das Formularelement definieren.
  2. In hook_validate prüfen ob der Benutzer gültige Daten eingetragen hat.
  3. In hook_insert und hook_update Daten in die Datenbank schreiben
  4. In hook_load die aus der Datenbank laden
  5. In hook_view die Daten in das $node->content Array eintragen
quiptime schrieb

Wie definiere ich Elemente, die bei der Nodeansicht angezeigt werden aber beim Bearbeiten kein Formelement wie bspw. eine Textarea sind?

Du kannst eigene Formularelemente definieren. Vielleicht reicht aber auch eine markup'-, 'item'- oder 'value'-Element. Siehe Forms API Reference

--
XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Mit dem Verweis auf

Eingetragen von quiptime (4972)
am 05.12.2007 - 14:23 Uhr

Mit dem Verweis auf hook_view in hook_nodeapi habe ich also einen ueberfluessigen Schritt realisiert.

Nun zum Anlegen weiterer Formelemente. Um 'body' muss ich mich nicht kuemmern - wird bereits ohne eigene Statements in hook_insert, hook_update und hook_load ueber die Tabelle node_revisions erledigt.
Wenn ich nun weitere Formelemente anlege muss ich mich ja wohl selbst um Statements fuer hook_insert, hook_update und hook_load kuemmern. D. h., der Inhalt dieser Formelemente wird nicht automatisch in node_revisions abgelegt?
Zumindest ist es momentan so, das der Inhalt eines weiteren Formelementes (Textarea), in hook_form als $form['foo'] definiert, nicht in node_revisions landet.

Ich muss also den Inhalt weiterer Formelemente in der zum Nodetype des Modules gehoerenden Tabelle durch eigene Aktionen speichern, aendern und laden.?

Sehe ich das richtig so?

Naja, und die Forms API Reference werde ich mir genau ansehen.

-------------
quiptime

Nur tote Fische schwimmen mit dem Strom.

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Richtig

Eingetragen von traxer (1009)
am 05.12.2007 - 16:28 Uhr
quiptime schrieb

Ich muss also den Inhalt weiterer Formelemente in der zum Nodetype des Modules gehoerenden Tabelle durch eigene Aktionen speichern, aendern und laden.?

Richtig. Eigene Tabellen legst du in hook_install an. Die Tabelle sollte die Spalte vid haben. Oft haben sie noch eine Spalte nid, ich weiß nicht wozu, eigentlich ist sie redundant; auf die nid kannst du mittel INNER JOIN {node_revisions} USING(vid) zugreifen.

--
XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

verdammte Form API

Eingetragen von quiptime (4972)
am 05.12.2007 - 23:31 Uhr

Das Hantieren mit der DB hatte ich schon so geloest.

Nun versuche ich immer noch ein zusaetzliches Formelement zu verwenden. Bsp. Textarea. Im Bearbeitenformular ist es da und Daten/Aenderungen im Textbereich werden gespeichert.
Aber ich kann machen was ich will, dieses Formelement erscheint nicht in der Nodeansicht und deswegen wohl auch nicht in der Preview. Ich sehe den Inhalt mit print_r().
Muss ich in hook_view() noch irgend was unternehmen damit es angezeigt wird? Oder mache ich schon beim Erstellen in hook_form() was falsch? Oder vergesse ich irgendwas?

So erstelle ich:

<?php
$form
['blubber']['foo'] = array(
 
'#type' => 'textarea',
 
'#default_value' => $node->foo ? $node->foo : 'Hallo',
);
?>

-------------
quiptime

Nur tote Fische schwimmen mit dem Strom.

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Du mußt Forms API Elemente in $node->content eintragen

Eingetragen von traxer (1009)
am 06.12.2007 - 09:00 Uhr
quiptime schrieb

Muss ich in hook_view() noch irgend was unternehmen damit es angezeigt wird?

Ja. Du mußt die Daten in das $node->content Array eintragen. Ein Beispiel gibt's im Quelltext von node_example.module. Im Endefekt läuft es meistens darauf hinaus, das du Formularelemente des Typs 'markup' definierst und dort die Eigenschaft '#value' setzt.

--
XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

@traxer, if ($page) ?

Eingetragen von quiptime (4972)
am 06.12.2007 - 13:32 Uhr

1.
Wenn ich es so mache werden alle definierten Formelemente angezeigt.

<?php
function node_example_view($node, $teaser = FALSE, $page = FALSE) {
 
$node = node_prepare($node, $teaser);
 
$node->content['myfield'] = array(
   
'#value' => $node->myfield,
  );
  return
$node;
}
?>

Preview beim Bearbeiten zeigt die zusaetzlich zum body definierten Formelemente - ok. Aber, wenn ich den Term aufrufe der einen solchen Node listet werden alle Formelemente angezeigt obwohl nur der Teaser zu sehen sein sollte - nicht ok.
 

2.
Wenn ich es so mache werden nicht immer alle definierten Formelemente angezeigt.

<?php
function node_example_view($node, $teaser = FALSE, $page = FALSE) {
 
$node = node_prepare($node, $teaser);
  if (
$page) {
   
$node->content['myfield'] = array(
     
'#value' => $node->myfield,
    );
  }
  return
$node;
}
?>

Wenn ich den Term aufrufe der einen solchen Node listet wird nur der Teaser angezeigt - ok. Preview beim Bearbeiten zeigt nur den Teaser - nicht ok.

Also muesste ich eigentlich Variante 1. verwenden und dabei zusaetzlichen Formelementen sagen das sie bei Termansichten nicht angezeigt werden. Aehnlich wie wie man es mit CCK Feldern machen kann - denn die Verhalten sich korrekt.
Gibt es ausser if ($page) weitere Schalter?
Gibt es fuer Formelemente einen "Taeser-Parameter"?

-----------------------------------------------------------------------
Und genau an dieser Stelle schweigt sich node_example aus. Auch alle sonstigen Dokus zum Thema hook_view() gehen nicht auf diese Problematik ein.

-------------
quiptime

Nur tote Fische schwimmen mit dem Strom.

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Preview: $teaser == false && $page == false;

Eingetragen von traxer (1009)
am 06.12.2007 - 14:17 Uhr

In der API-Referenz von hook_view steht ja:

Zitat:

$teaser Whether we are to generate a "teaser" or summary of the node, rather than display the whole thing.

$page Whether the node is being displayed as a standalone page.

Ich verstehe das so:

Anzeige auf eigener Seite
$teaser == false; $page == true;
Anzeige in Listen
$teaser == true; $page == false;
Anzeige als Preview
$teaser == false; $page == false;

Ein Preview ist weder ein Teaser, noch eine eigene Seite.

--
XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Preview: $teaser = true; $page = true;

Eingetragen von quiptime (4972)
am 06.12.2007 - 15:01 Uhr

Ein Preview ist $teaser und $page zugleich. So gesehen keine eigene Seite, aber er zeigt die Inhalte Beider zugleich. Damit ist

Zitat:

Anzeige als Preview
$teaser == false; $page == false;

nicht richtig.
Denn in der Preview sehe ich ja $easer und $page. Aber leider $page nicht mit allen Formelementen sondern nur mit $form['body'] - mein Problem.

Aber diese Erkenntnis bring mich kein Stueck weiter.

-------------------------------------------------------------------------

1. Anzeige auf eigener Seite
$teaser = false; $page = true;
2. Anzeige in Listen
$teaser = true; $page = false;
3. Anzeige als Preview
$teaser = true; $page = true;

Das waere aus meiner Sicht richtig. Die Fragen sind:

Wie erreiche ich bei 1. das nur der Teaser angezeigt wird?
Wie erreiche ich das Formelemente ausser 'body' nicht dem Teaser zugeordnet werden?

Wie erreiche ich bei 3. das auch weitere Formelemente ausser 'body' angezeigt werden?

Um Missverstaendnisse auszuschliessen. Ich meine keine CCK Formelemente sondern nur mit einem Modul erzeugte.

-------------
quiptime

Nur tote Fische schwimmen mit dem Strom.

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

$page == true heißt "als eigene Seite", nicht "kompletter Node"

Eingetragen von traxer (1009)
am 06.12.2007 - 15:29 Uhr
quiptime schrieb

Damit ist

Zitat:

Anzeige als Preview
$teaser == false; $page == false;

nicht richtig. Denn in der Preview sehe ich ja $easer und $page.

Drupal argumentiert da anders. Drupal meint: "Ich will im Preview den Teaser anzeigen, also rufe ich hook_view($node, true, false) auf."

Drupal argumentiert weiter: "Ich will im Preview auch den kompletten Node anzeigen, aber nicht als eigene Seite. Also rufe ich hook_view($node, false, false) auf."

Für einen Preview ruft theme_node_preview als zwei mal hook_view auf, mit unterschiedlichen Argumenten.

Ich hoffe damit sind auch die in deinem Beitrag weiter unten stehenden Fragen geklährt.

--
XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

@traxer, Groschen ist gefallen

Eingetragen von quiptime (4972)
am 07.12.2007 - 00:25 Uhr

@traxer,

Danke Dir für Deine Geduld. Hat 'ne Weile gedauert aber jetzt ist der Groschen gefallen.

Übrigens,
für das Formelement der Googlemap verwende ich nun hook_elements().

Für Nachleser

Anzeigen weiterer, zusätzlich zu $form['body'], definierter Formelemente bei der Preview:

<?php
function mymodule_view($node, $teaser = FALSE, $page = FALSE) {
 
$node = node_prepare($node, $teaser);
  if (
$teaser == 0 && !$page) {
   
$node->content['extra_foo'] = array(
     
'#value' => $node->extra_foo,
    );
  }
  if (
$page) {
   
$node->content['extra_foo'] = array(
     
'#value' => $node->extra_foo,
    );
  }
  return
$node;
}
?>

Die beiden if kann man auch zusammenlegen aber wegen der besseren Verständlichkeit habe ich es mal so geschrieben.

-------------
quiptime

Nur tote Fische schwimmen mit dem Strom.

XING

  • Anmelden oder Registrieren um Kommentare zu schreiben

Benutzeranmeldung

  • Registrieren
  • Neues Passwort anfordern

Aktive Forenthemen

  • Medien und andere Daten mit Feeds von Drupal 7 auf Drupal 10 migrieren
  • für drupal11 ein Slider Modul
  • [gelöst] W3CSS Paragraphs Views
  • Drupal 11 neu aufsetzen und Bereiche aus 10 importieren
  • Wie erlaubt man neuen Benutzern auf die Resetseite zugreifen zu dürfen.
  • [gelöst] Anzeigeformat Text mit Bild in einem Artikel, Drupal 11
  • Social Media Buttons um Insteragram erweitern
  • Nach Installation der neuesten D10-Version kein Zugriff auf Website
  • Composer nach Umzug
  • [gelöst] Taxonomie Begriffe zeigt nicht alle Nodes an
  • Drupal 11 + Experience Builder (Canvas) + Layout Builder
  • Welche KI verwendet ihr?
Weiter

Neue Kommentare

  • Inzwischen sind wir bei
    vor 1 Tag 11 Stunden
  • Migrieren von D7 auf D8/ D10/ D11
    vor 2 Tagen 3 Stunden
  • melde mich mal wieder, da ich
    vor 7 Wochen 6 Tagen
  • Hey danke
    vor 8 Wochen 2 Stunden
  • Update: jetzt gibt's ein
    vor 8 Wochen 20 Stunden
  • Hallo, im Prinzip habe ich
    vor 8 Wochen 5 Tagen
  • Da scheint die Terminologie
    vor 8 Wochen 5 Tagen
  • Kannst doch auch alles direkt
    vor 9 Wochen 2 Tagen
  • In der entsprechenden View
    vor 9 Wochen 2 Tagen
  • Dazu müsstest Du vermutlich
    vor 9 Wochen 2 Tagen

Statistik

Beiträge im Forum: 250235
Registrierte User: 20462

Neue User:

  • marouane.blel
  • capilclinic
  • Quabzibboter

» Alle User anzeigen

User nach Punkten sortiert:
wla9461
stBorchert6003
quiptime4972
Tobias Bähr4019
bv3924
ronald3857
md3717
Thoor3678
Alexander Langer3416
Exterior2903
» User nach Punkten
Zur Zeit sind 0 User und 30 Gäste online.

Hauptmenü

  • » Home
  • » Handbuch & FAQ
  • » Forum
  • » Übersetzungsserver
  • » Suche

Quicklinks I

  • Infos
  • Drupal Showcase
  • Installation
  • Update
  • Forum
  • Team
  • Verhaltensregeln

Quicklinks II

  • Drupal Jobs
  • FAQ
  • Drupal-Kochbuch
  • Best Practice - Drupal Sites - Guidelines
  • Drupal How To's

Quicklinks III

  • Tipps & Tricks
  • Drupal Theme System
  • Theme Handbuch
  • Leitfaden zur Entwicklung von Modulen

RSS & Twitter

  • Drupal Planet deutsch
  • RSS Feed News
  • RSS Feed Planet
  • Twitter Drupalcenter
Drupalcenter Team | Impressum & Datenschutz | Kontakt
Angetrieben von Drupal | Drupal is a registered trademark of Dries Buytaert.
Drupal Initiative - Drupal Association