Modul mit unterschiedlichen Konfigurationen einbinden

am 31.01.2014 - 15:47 Uhr in
Hallo zusammen,
ich bin seit einigen Wochen begeisteter Drupal 7 Anfänger - leider eben auch nur Anfänger.
Ich schreibe gerade mein erstes Modul und möchte dieses Modul mit unterschiedlichen Konfigurationen auf unterschiedlichen Seiten integrieren.
Das Ziel hierbei ist, dass ich nur ein Modul habe, welches eine parametrisierte Business Logik implementiert, die ich auf unterschiedlichen Seiten mit unterschiedlichen Konfigurationen ansprechen kann.
Zur Veranschaulichung habe ich folgenden Aufbau in meinem Modul - bereits mit einigen Hooks implementiert:
Die folgenden beiden Funktionen stellen meine Business Logik da, die ich gerne wiederverwenden möchte:
getContent($parameter) legt nur ein DIV um das HTML Snippet und
getContentAsHTMLUsing($parameter) liefert entweder HTML Snippet A oder HTML Snippet B
<?php
function getContent($parameter) {
$pageResults = '';
$pageResults .= getContentAsHTMLUsing($parameter);
$output = '<div>'. $pageResults;
$output .= '</div>';
return $output;
} // function
function getContentAsHTMLUsing($parameter) {
// If value of $parameter == 1 then doA();
// If value of $parameter == 2 then doB();
return $results;
} // function
?>
Darüber hinaus habe ich noch folgende Hooks implementiert:
hook_block_view() liest den Parameter aus und ruft getContent($parameter) bzw. getContentAsHTMLUsing($parameter) auf.
hello_world_block_configure() für die Konfiguration des Parameters.
hello_world_block_save() zum Speichern der Konfiguration.
<?php
/**
* Implements hook_block_view().
*/
function hello_world_block_view($delta = '') {
$block = array();
if ($delta == 'hello_world') {
// Assign Configuration to Variables
$parameter = variable_get('hello_world_block_parameterID', '1');
$block['subject'] = t('My Subject');
$block['content'] = getContent($parameter);
}
return $block;
}
/**
* Implements hook_block_configure().
*
*
*/
function hello_world_block_configure($delta = '') {
$form = array();
if ($delta == 'hello_world') {
$form['hello_world'] = array(
'#type' => 'fieldset',
'#title' => t('Hello World Module Options'),
);
// Parameter 1
$form['hello_world']['hello_world_block_parameterID'] = array(
'#type' => 'textfield',
'#title' => t('Parameter'),
'#default_value' => variable_get('hello_world_block_parameterID', '1'),
);
}
return $form;
}
/**
* Implements hook_block_save().
*
*
*/
function hello_world_block_save($delta = '', $edit = array()) {
if ($delta == 'hello_world') {
variable_set('hello_world_block_parameterID', $edit['hello_world_block_parameterID']);
}
}
?>
Bis hierhin ist alles gut - nun möchte ich aber auf unterschiedlichen Seiten dieses Modul integrien, jedoch mit unterschiedlichen Konfigurationen:
Seite 1: Modul mit Parameter Wert 1 -> liefert dann das HTML Snippet A
Seite 2: Modul mit Parameter Wert 2 -> liefert dann das HTML Snippet B
Ich habe schon eine ganze Weile in Foren gesucht und bin mir auch nicht sicher, ob dies überhaupt der richtige Ansatz ist,
um das Problem zu lösen.
Hat jemand vielleicht eine Idee, einen Link, etc.? Gerne auch Kritik, daß ich auf dem totalen Holzpfad bin oder den Wald vor lauter Bäumen nicht mehr sehe.
Cheers,
Chris@Drupal
- Anmelden oder Registrieren um Kommentare zu schreiben
ich bin kein Programmierer, aber
am 31.01.2014 - 17:21 Uhr
welches Modul von der gefühlten halben Million Module käme denn am nächsten? Was ist denn die Aufgabe?
Modul mit unterschiedlichen Konfigurationen einbinden
am 01.02.2014 - 11:44 Uhr
Hallo silvestered,
in der
<?php
function getContentAsHTMLUsing($parameter) {
// If value of $parameter == 1 then doA();
// If value of $parameter == 2 then doB();
return $results;
} // function
?>
möchte ich einen WebService aufrufen - vereinfacht gesagt ein HTTP Request, der unterschiedliche Parameter hat.
Die einzelnen Parameter möchte ich aber nicht "hard coden", sondern über konfigurierbare Parameter gestalten.
Das funktioniert auch soweit gut und der WebService liefert dann auch die entsprechenden Ergebnisse.
Ich glaube, dass man von der Webservice Thematik auch abstrahieren kann und einfach sagt:
doA() liefert HTML Snippet A und
doB() liefert HTML Snippet B.
Das Problem ist, dass ich derzeit nicht weiss, wie man unterschiedliche Aufrufe eines Moduls auf Seiten integrieren kann.
Vielleicht ist das auch ein Problem, der Verwendung der falschen Hooks an dieser Stelle.
Was ich möchte skizziere ich einfach mal:
Ich habe zwei Seiten: Basic Page A und Basic Page B.
Der Content auf den beiden Seiten soll ein einziges Modul liefern -> eben über die funktion getContentAsHTMLUsing($parameter).
Auf der Seite A soll der Parameter-Wert 1 sein und auf der Seite B soll der Parameter-Wert 4711 sein.
Die beiden unterschiedlichen Paramter 1 & 4711 möchte ich aber konfigurierbar halten, damit ein nicht WebService Programmierer diesen Aufruf über das Backend einstellen kann.
Verwende ich möglicherweise die falschen Hooks?
Cheers,
Chris
Abstrakt
am 31.01.2014 - 21:10 Uhr
Hi Chris,
das ist hübsch abstrakt und so gar nicht mein Tisch. Vor einigen Jahren hatte ich mal begonnen, eine Installation und eine Datenbank für zwei Websites zu verwenden. Prinzipiell ist das möglich, war mir dann aber zu unübersichtlich. Der Vorteil lag nur daran, weniger Webressourcen zu verwenden und nicht doppelten Wartungsaufwand zu haben. Stünde ich heute vor einer ähnlichen Aufgabe wie der von dir geschilderten, würde ich im Kopf mit Modul-Begriffen wie Reference und Context jonglieren und die passenden Module suchen.
Dir wünsche ich, dass sich noch jemand mit den passenden Kenntnissen meldet und bin gespannt auf die Fortschritte.
Viel Glück!
Zitat: Das Problem ist, dass
am 31.01.2014 - 23:26 Uhr
Das Problem ist, dass ich derzeit nicht weiss, wie man unterschiedliche Aufrufe eines Moduls auf Seiten integrieren kann.
Schreibe ein Stück Adminkode mit dem man eine Systemvariable konfigurieren kann. Mit dieser Variable ruft man Sitebezogen eine Funktion auf.
quiptime schrieb Zitat: Das
am 01.02.2014 - 12:20 Uhr
Das Problem ist, dass ich derzeit nicht weiss, wie man unterschiedliche Aufrufe eines Moduls auf Seiten integrieren kann.
Schreibe ein Stück Adminkode mit dem man eine Systemvariable konfigurieren kann. Mit dieser Variable ruft man Sitebezogen eine Funktion auf.
Hallo quiptime,
Danke für Dein Feedback - aber ich befürchte, daß hier ein kleines Missverständis vorliegt. Ich habe inzwischen den Content überarbeitet, damit das Problem etwas klarer wird.
Ich möchte gar nicht zwei unterschiedliche (Web-) Sites konfigurieren können und ich hoffe, daß sich das Problem trivialer lösen lässt.
Hier noch einmal die Motivation:
Eine WebSite mit zwei Instanzen vom Content Type Basic Page >> Page A und Page B.
Zusätzlich ein HelloWorld Modul, mit einem Parameter, der konfigurierbar sein soll.
Dieser Parameter entscheidet, ob im HelloWord Modul function A() oder funktion B() aufgerufen wird (siehe oben).
Die beiden Funktionen A() und B() liefern jeweils HTML-Code, der nun angezeigt werden soll.
Auf der Basic Page A das Ergebnis des Modulaufrufes mit dem Ergebnis von Funktion A() und
auf der Basic Page B das Ergebnis des Modulaufrufes mit dem Ergebnis von Funktion B()
Verwende ich vielleicht die falschen Hooks oder ist schon mein Ansatz, dies über einen Block abzubilden nicht der richtige Weg?
Cheers,
Chris
Hallo, vielleicht hilft Dir
am 01.02.2014 - 12:42 Uhr
Hallo,
vielleicht hilft Dir das hier weiter: http://stackoverflow.com/questions/5908473/howto-output-html-from-drupal...
Gruß
Christian
Was grundsätzliches zur Modul
am 01.02.2014 - 12:53 Uhr
Was grundsätzliches zur Modul Programmierung. Wenn Du drupallike arbeiten willst, das solltest Du, dann lies Dich in die Codingstandards von Drupal ein.
Bsp.: Deine Funktion
getContent
Besser ist: mymodulename_get_content() oder _mymodulename_get_content()
Funktionsnamen mit beginnendem Unterstrich kann man für Modulinterne (Hilfe)Funktionen verwenden die auch nicht von ausserhalb des Modules angesprochen werden.
Zitat: Verwende ich
am 01.02.2014 - 13:04 Uhr
Verwende ich vielleicht die falschen Hooks oder ist schon mein Ansatz, dies über einen Block abzubilden nicht der richtige Weg?
Das kann man in dieser Situation nicht wirklich beantworten.
Es kommt darauf an was Dein Modul realisieren soll.
Bei einem Modul mit Blockfunktionalität bewegst Du Dich mit den obigen Hooks erst Mal richtig.
Dein Code. Warum willst Du
am 01.02.2014 - 13:20 Uhr
Dein Code.
Warum willst Du zur Laufzeit der Website, Anzeige einzelner Inhalte, den Block umkonfigurieren?
Eigentlich brauchst Du doch nur den hook_block_view().
Bedeutet, der angezeigte Inhalt des Block wird zur Laufzeit verändert (oder auch nicht). Der Block selbst aber mit seiner (Grund)Konfiguration wird nicht verändert.
quiptime schrieb Was
am 01.02.2014 - 13:36 Uhr
Was grundsätzliches zur Modul Programmierung. Wenn Du drupallike arbeiten willst, das solltest Du, dann lies Dich in die Codingstandards von Drupal ein.
Bsp.: Deine Funktion
getContent
Besser ist: mymodulename_get_content() oder _mymodulename_get_content()
Funktionsnamen mit beginnendem Unterstrich kann man für Modulinterne (Hilfe)Funktionen verwenden die auch nicht von ausserhalb des Modules angesprochen werden.
Danke für den Hinweis - Codingstandards sind extrem wichtig. getContent() soll auch nur eine interne Methode ein, die aus dem block_view hook aufgerufen wird,
daher werde ich diese in _getContent() ändern. okay? & thx.
quiptime schrieb Dein
am 01.02.2014 - 13:59 Uhr
Dein Code.
Warum willst Du zur Laufzeit der Website, Anzeige einzelner Inhalte, den Block umkonfigurieren?
Eigentlich brauchst Du doch nur den hook_block_view().
Bedeutet, der angezeigte Inhalt des Block wird zur Laufzeit verändert (oder auch nicht). Der Block selbst aber mit seiner (Grund)Konfiguration wird nicht verändert.
Hallo quiptime,
Danke für den Hinweis. Mittlerweilse glaube ich, daß ich ein falsches Verständnis von Blocks habe und glaube, daß die richtige Lösung nicht mehr weit entfernt ist - Dank Deiner Kommentare.
Vielleicht noch mal zum Hintergrund:
Mein HelloWorld Modul ruft einen WebService auf, der ein HTML Snippet liefert. In der funktion _A() wird dieser Webservice Call ein HTML Snippet A liefern und in der Funktion _B() ein anderes. Gesteuert soll das ganze über einen Parameter werden, der aber nicht hardcoded werden soll, da auch Anwender mit keinen PHP / WebService Kenntnissen diesen konfigurieren können. Daher kam ich erst einmal auf die Idee, block hooks zu verwenden mit configure & save.
Anschließend habe ich dann eine Node bzw. Instanz von Basic Page >> MyFirstPage angelegt, den Block in die Area Content/Inhalt gelegt und zum Schluss noch konfuguriert, daß der Inhalt des Blocks HelloWorld nur auf MyFirstPage erscheinen soll. Daher glaube ich auch, daß dieser Ansatz schon nicht richtig ist.
Was ich benötige ist einfach die Möglichkeit, Content von einem Modul auf eine bzw. mehere Seiten (nodes) zu bringen. Und einen Mechanismus, mit dem ich sagen kann:
Seite (Node) A: zeige mir den Inhalt des Modulausrufes HelloWorld mit dem Parameter ('1") an und
Seite (Node) B: zeige mir den Inhalt des Modulausrufes HelloWorld mit dem Parameter ('4711') an
wobei der Wert des Parameters von einem Redakteur bzw. NICHT PHP Experte konfiguriert werden kann.
Cheers & Thx for great comments!
Chris
Warum willst Du unbedingt an
am 01.02.2014 - 16:22 Uhr
Warum willst Du unbedingt an Drupal vorbei arbeiten? Wozu dann noch Drupal?
Ich würde das mit hook_menu lösen und echte Unterseiten definieren. Der Redakteur ist ohnehin mit dem Code überfordert.
Willst Du aber viele Stückchen vom Redakteur zusammensetzen lassen, solltest Du Dich mit Panelizer befassen.
Beste Grüße
Werner
Bis hierher dachte ich zu
am 01.02.2014 - 20:46 Uhr
Bis hierher dachte ich zu verstehen was Du willst.
Dann kommt dieser Satz:
Was ich benötige ist einfach die Möglichkeit, Content von einem Modul auf eine bzw. mehere Seiten (nodes) zu bringen.
Das kapiere ich absolut nicht. Und so lange mir das nicht klar ist kann ich Dir wohl nicht wirklich helfen.
quiptime schrieb Bis hierher
am 01.02.2014 - 21:27 Uhr
Bis hierher dachte ich zu verstehen was Du willst.
Dann kommt dieser Satz:
Was ich benötige ist einfach die Möglichkeit, Content von einem Modul auf eine bzw. mehere Seiten (nodes) zu bringen.
Das kapiere ich absolut nicht. Und so lange mir das nicht klar ist kann ich Dir wohl nicht wirklich helfen.
Hallo quiptime,
Danke für Dein Feedback. Sorry, aber was genau verstehst Du an diesem Satz nicht? Bisher war das Problem doch klar oder ist die Lösung vielleicht zu trivial?
Cheers,
Chris