Fremdanwendungen ins APF integrieren

Das Forum soll der Ablage von Lösungen für immer wieder auftauchende Problemstellungen dienen. // This forum contains solutions to problems that frequently occur.
Antworten
Eska
Beiträge: 15
Registriert: 05.08.2008, 19:51:36

Fremdanwendungen ins APF integrieren

Beitrag von Eska » 18.07.2009, 19:30:33

Hallo,
nachdem ich mit vielen Mühen eine Galerie in's APF integriert habe, stellte ich an den Doc folgende Frage:
Gibt es eine relativ einfache Möglichkeit Fremdanwendungen ins APF zu integrieren, z.B. Galeriesysteme, Blogs oder Foren? Du öffnest dein Forum ja extern, ich habe eine (bereits vorhandene) Galerie in ein Modul integriert, war ´ne heiden Arbeit. Aber womöglich hab ich mich nur doof angestellt?
Die Antwort kam fast schon unheimlich schnell (schläft und arbeitet denn der nie??) und war einem positiven Bescheid gleichzusetzen; es geht wohl recht einfach und das Thema wäre wohl auch für andere User interessant und ich solle doch die frage noch mal im Forum, Rubrik FAQ, stellen.
Dies habe ich hiermit getan... ;)

LG
Eska

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Fremdanwendungen ins APF integrieren

Beitrag von dr.e. » 18.07.2009, 19:54:48

Hi Eska,
es geht wohl recht einfach und das Thema wäre wohl auch für andere User interessant und ich solle doch die frage noch mal im Forum, Rubrik FAQ, stellen.
Richtig. Und dazu gibt es mehrere Möglichkeiten, die sich nach dem Typ der Anwendung richten.

1. "Smarty"-Applikationen
Hierfür hatte ich unter Smarty und das APF eine Möglichkeit gepostet, die darauf aufsetzt, dass in einem Document-Controller "normaler" PHP-Code steht und die Ausgabe des Smarty-Templates einfach dort injiziert werden kann. Für die Migration muss einfach der relevante Code in eine Controller-Klasse kopiert und die Ausgabe in die Variable $this->__Content geschrieben werden.

2. Bestehende Script-Anwendung
Um eine Anwendung, die aus mehreren Scripten besteht zu migrieren empiehlt es sich im ersten Schritt, diese einfach mit Hilfe der ob_*()-Funktionen an die relevante Stelle einzubinden. Auch dies kann über einen Document-Controller passieren, der die besagte Applikation einbindet und die Ausgabe in den aktuellen DOM-Knoten schreibt. Hierzu kann folgender Code genutzt werden:

Code: Alles auswählen

class my_controller extends baseController {

   function transformContent(){
      ob_start();
      include('/path/to/my/app.php');
      $this->__Content = ob_get_content();
      ob_end_clean();
   }

}
Sollte es notwendig sein, die Anwendung mit einer Konfiguration zu versehen, kann das vor dem include() platziert werden. Da zur Zeit der Einbindung das URL-Rewriting bereits ausgeführt ist, sollte es ohne Probleme möglich sein auf dieses innerhalb der bestehenden Applikation zuzugreifen. Hier kann es u.U. notwendig sein, das $_GET-Array mit den Inhalten des $_REQUEST zu befüllen, sollte die bestehende Anwendung dieses nutzen.

Noch ein Hinweis: sollte die bestehende Applikation URLs erzeugen, die nicht zum URL-Rewrite-Schema des APF kompatibel sind, können diese im Document-Controller oder über einen eigenen OutputFilter übersetzt werden.

Alternativ dazu könnte man noch über die Möglichkeit nachdenken, die Applikation über einen HTTP-Aufruf einzubinden. Das ist jedoch aus Performance-Gründen nicht zu empfehlen. Diesbezüglich macht es ohnehin Sinn über Kurz oder Lang die Applikation auf das APF zu adaptieren. Dies kann bei Anwendungen mit Templates oft schon per Copy&Paste plus einigen Ersetzungen bewerkstelligt werden.

Ich hoffe das hilft dir weiter!

Viele Grüße,
Christian
Viele Grüße,
Christian

Eska
Beiträge: 15
Registriert: 05.08.2008, 19:51:36

Re: Fremdanwendungen ins APF integrieren

Beitrag von Eska » 13.08.2009, 01:51:06

Tjaaaaa...
Vielen DAnk erstmal für den Lösungsvorschlag, ich konnte mich leider erst jetzt wieder damit beschäftigen. Und sofort tritt natürlich ein Problem zu Tage:

Ich möchte eine Forensoftware in eine APF-basierende Anwendung integrieren. Dies wollte ich mit der beschriebenen Methode

Code: Alles auswählen

ob_start();
include('/path/to/my/app.php');
$this->__Content = ob_get_content();
ob_end_clean();
erreichen. Die meisten Foren, oder besser gesagt, alle die ich getestet habe, arbeiten ebenfalls mit der Ausgabesteuerung ob_start usw.. Ich bin mir jetzt nicht sicher, ob man das schachteln kann, ich hatte jedoch nicht den Eindruck. :cry:
Muss ich jetzt die gesamte Forensoftware zerlegen und versuchen ein Modul draus zu basteln??

Grüße

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Fremdanwendungen ins APF integrieren

Beitrag von dr.e. » 13.08.2009, 07:59:19

Hallo Eska,

schön dich mal wieder zu lesen. :)

An sich sollte man das schachteln können, so lange die Schachtelung auch konsistent ist. Das Manual spricht ebenfalls von einem "nesting level" bei der Funktion ob_get_level().

Lokal habe ich mir dazu folgendes Konstrukt gebaut:

Template einer bestehenden Anwendung:

Code: Alles auswählen

<@controller namespace="sites::***::pres" file="inc_controller" class="inc_controller" @>
...
<html:placeholder name="external" />
Document-Controller:

Code: Alles auswählen

class inc_controller extends baseController {
   public function transformContent(){
      ob_start();
      include('module.php');
      $content = ob_get_contents();
      ob_end_clean();
      $this->setPlaceHolder('external',$content);
   }
}
Externes Modul:

Code: Alles auswählen

ob_start();
echo 'my external module';
ob_end_flush();
Die zusätzliche Ausgabe war wie erwartet my external module. Ich vermute daher eher, dass sich Probleme aus der Definition der Umgebung des Moduls ergeben. Wenn ich z.B. das phpbb3 einbinden, meckert es, weil Dateien nicht gefunden werden. Hier muss u.U. das $_REQUEST-Array manipuliert werden, damit dort der absolute Pfad zum Modul steht, den auch eine "normale" Installation beinhalten würde. Bei mir hilft beispielsweise die Zeile

Code: Alles auswählen

define('PHPBB_ROOT_PATH','***htdocs/www/phpbb3/de/');
vor dem Einbinden des Forums einzufügen.

Ich hoffe, das hilft dir weiter.

Viele Grüße,
Christian
Viele Grüße,
Christian

Eska
Beiträge: 15
Registriert: 05.08.2008, 19:51:36

Re: Fremdanwendungen ins APF integrieren

Beitrag von Eska » 13.08.2009, 11:03:11

Hmmm, irgendwie werden die als global definierten Variablen nicht in die Classenmethoden durchgereicht?? Seltsam...
Wenn ich das Forum "direkt" aufrufe ist alles gut, via ob_start etc. gibts keine globalen Variablen. :?

Hast du `ne Idee??

Grüße
Eska

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Fremdanwendungen ins APF integrieren

Beitrag von dr.e. » 13.08.2009, 12:10:52

Hi,

welche globalen Variablen braucht das Forum denn, bzw. was für ein Forum verwendest du? Grundsätzlich sind Variablen ausserhalb von Klassen innerhalb nicht sichtbar. Sofern du in der index.php deines Projektes solche für die Einbindung setzt, musst du diese in die Klasse und die Methode umziehen, wo du die Einbindung platzierst. Weiterhin musst du sicher stellen, dass bei URL-Rewriting die Parameter richtig zurückübersetzt werden.

Kannst du für eine genauere Analyse ein paar Code-Snippets und Angaben zum Forum posten, dann kann ich besser helfen.

Viele Grüße,
Christian
Viele Grüße,
Christian

Eska
Beiträge: 15
Registriert: 05.08.2008, 19:51:36

Re: Fremdanwendungen ins APF integrieren

Beitrag von Eska » 13.08.2009, 13:32:31

Okay, dann gehe ich mal ins Detail ;) :

Ich versuche das phpBB Version 3 via Documentcontroller in eine APF-Anwendung (1.10) zu integrieren. Die Forendateien sind dabei im Unterordner ./forum des Stammverzeichnisses der Anwendung untergebracht.

In der Datei index.php wird gleich zu Anfang der Anwendungspfad des Forums festgelegt:

Code: Alles auswählen

$phpbb_root_path = (defined('PHPBB_ROOT_PATH')) ? PHPBB_ROOT_PATH : './';
das habe ich, wie von dir vorgeschlagen, mittels der Codezeile

Code: Alles auswählen

define('PHPBB_ROOT_PATH','***htdocs/forum/');
richtig voreingestellt. Die Latte der Fehlermeldung zog sich auch sofort zugunsten eines einzigen, unformatierten Meldungsfitzes zurück. Schade eigendlich...
APF hat geschrieben: Fatal error: Call to a member function sql_query() on a non-object in F:\xampp\htdocs\vexirtuermer\forum\includes\cache.php on line 56 Call Stack: 0.0027 66720 1. {main}() ***\htdocs\index.php:0 0.7367 1990720 2. Frontcontroller->start() ***\htdocs\index.php:31 1.0784 3417544 3. Page->transform() ***\htdocs\core\frontcontroller\Frontcontroller.php:361 1.0784 3417984 4. Document->transform() ***\htdocs\core\pagecontroller\pagecontroller.php:1158 1.0812 3424008 5. Document->transform() ***\htdocs\core\pagecontroller\pagecontroller.php:1638 1.0819 3426936 6. Document->transform() ***\htdocs\core\pagecontroller\pagecontroller.php:1638 1.0826 3430424 7. Document->transform() ***\htdocs\core\pagecontroller\pagecontroller.php:1638 1.0867 3436056 8. phorum_controller->transformContent() ***\htdocs\core\pagecontroller\pagecontroller.php:1625 1.0899 3532360 9. include('***\htdocs\forum\index.php') ***\htdocs\modules\mod.phorum\pres\documentcontroller\phorum_controller.php:17 1.0936 3611272 10. include('***\htdocs\forum\common.php') ***\htdocs\forum\index.php:21 1.4659 7335392 11. cache->obtain_config() ***\htdocs\forum\common.php:218
Der geneigte Leser stellt fest, das der Aufruf des documentcontrollers aus einem Modul namens mod.phorum heraus stattfindet, die Namensgebung des Moduls - und damit auch des Controllers und der Klasse - liegt in vorherigen Versuchen mit einer anderen Forensoftware begründet (welche wohl?).

Zurück zum Eigendlichen:
Bald nach festlegen des Forum-Basisverzeichnisses wird die common.php geladen

Code: Alles auswählen

include($phpbb_root_path . 'common.' . $phpEx);
und dort passiert folgendes (gekürzt):

Code: Alles auswählen

// Include files

[...]
require($phpbb_root_path . 'includes/cache.' . $phpEx);
[...]
require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx);
[...]

// Instantiate some basic classes
[...]
$cache		= new cache();
$db			= new $sql_db(); // <-- HIER wird DB-objekt in Variable geschrieben

// Connect to DB
$db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false, defined('PHPBB_DB_NEW_LINK') ? PHPBB_DB_NEW_LINK : false);

// We do not need this any longer, unset for safety purposes
unset($dbpasswd);

// Grab global variables, re-cache if necessary
$config = $cache->obtain_config(); // <-- DB-objekt wird NICHT mit übergeben
Die obtain_config - Methode (in der Datei ./includes/cache.php) nimmt sich das DB-objekt via global:

Code: Alles auswählen

function obtain_config()
    {
        global $db;
        [...]
    }
Rufe ich das Forum via www.meinedomain.de/forum auf, klappt das abholen des DB-Objektes via global prima, rufe ich das Forum via www.meinedomain.de/?page=forum (documentcontroller) auf, ist das DB-Objekt in der Cache-Klasse einfach NULL. Und dann klappts natürlich auch nicht mit dem Nachbarn :cry: .

Ich hoffe ich war nicht ZU umfangreich?!
LG
Eska

Benutzeravatar
dr.e.
Administrator
Beiträge: 4527
Registriert: 04.11.2007, 16:13:53

Re: Fremdanwendungen ins APF integrieren

Beitrag von dr.e. » 13.08.2009, 14:01:42

Hallo Eska,

es scheint mir dann tatsächlich so zu sein, dass der globale Gültigkeitsbereich in einem Script ein anderer ist, als in einer Methode. Ich frage mich zwar warum, aber es scheint so zu sein.

Eine mögliche Lösung sehe ich im Aufruf von

Code: Alles auswählen

extract($GLOBALS);
vor dem Einbinden. Falls auch das nichts hilft, muss ich mir das an Hand des PHPBB3 nochmal genauer am Wochenende ansehen und auch in der PHP-Doku nochmal nachlesen, die Globale Variablen in einer Output-Buffer-Umgebung behandelt werden. Hast du das im Document-Controller mal ohne ob_*() versucht?

Viele Grüße,
Christian
Viele Grüße,
Christian

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast