[PHP + JS] Modulemanager: Module wird nicht an Position geladen

nchristoph

Erfahrenes Mitglied
Hallo zusammen,

Ich schreibe gerade an einem Modulemanager um Module übers ACP aus und an zuschalten, installieren und deinstallieren und Positionieren zu können.

An/Ausschalten, Installieren und Deinstallieren im ACP funktioniert, das Positionieren auf der Frontpage allerdings nicht.

mit diesen Code möchte ich das Module Positionieren:
Module_manager.php

PHP:
public function get_position($position,$code)
{
    echo '<script type=\"text/javascript\">getPosition("'.$position.'", "'.$code.'");</script>';
}

public function LoadModules()
{
 /* $_start_dir = 'modules';
  $_dir_array = array($_start_dir);
  $_file_array = array();
  
  while(count($_dir_array) > 0) $this->get_files(array_shift($_dir_array),'/^[^\.]+\.xml$/');
 */
  $sql = ("SELECT name, position FROM modules WHERE `status` = 1 ");
  $qry = mysql_query($sql);
  while($row = mysql_fetch_array($qry)){
      
  $this->get_position($row['position'],include ('modules/mod_'.$row['name'].'/front_'.$row['name'].'.php')); 
  }
              /*foreach($_file_array as $file){ 
    $content_batch = simplexml_load_file($file); 
    $type = $content_batch->type;
    $name = $content_batch->name;
    $version = $content_batch->version;
    $author = $content_batch->author;
    $releasedate = $content_batch->releasedate;*/
//echo     
}

Javascriptfunktion im Header der index.php
Java:
function getPosition(position, code) {
    document.getElementById(position).innerHTML = code;
  }

Der Code wird ausgeführt, allerdings nicht an der Postion, die ich übers ACP angegeben habe.

Die $row['position'] gibt mir die Position aus wenn ich var_dump, im Quelltext allerdings wirds mir so angezeigt:

Code:
<li>
<h2>Suche</h2>
					<div id="search" >
						<form method="post" action="index.php?p=suche">
							<div>
								<input type="text" name="search-text" id="search-text" value="" />
								<input type="submit" id="search-submit" value="GO" />
							</div>
						</form>
					</div>
					<div style="clear: both;">&nbsp;</div>
				</li><script type=\"text/javascript\">getPosition("sidebar", "1");</script>

Ich sitze schon seit vorgestern an dem Problem, komme allerdings auf keinen grünen Zweig.
 
Zuletzt bearbeitet:
Ich durchblicke dein genaues Problem noch nicht ganz.
Wird das Script-Tag an der falschen Stelle im HTML-Code platziert?
Oder stimmt der übergebene Parameter deiner Meinung nach nicht?

Wie sollte es denn eigentlich aussehen?
Wie sieht denn der Code-Kontext aus, in dem die Modul-Ausgabe erfolgt (wo die Methode getPosition() deiner Modul-Instanz ausgeführt wird)?

Gruß
 
Also ich hab mal weitergebastelt, bin mit dem Ergebnis nicht wirklich zufrieden.

PHP:
class Module_Manager{

    public function __construct(){

    }
    //noch nicht benutzte Funktion für Ordner durchsuchen
    public function get_files($_dir,$_filename_regex){

        global $_dir_array, $_file_array;

        $_scan = scandir($_dir);
        foreach($_scan as $_value){

          if(!preg_match('/^\.+$/',$_value)){
            if(is_dir($_dir.'/'.$_value)) $_dir_array[] = $_dir.'/'.$_value;
            elseif(preg_match($_filename_regex,$_value)) $_file_array[] = $_dir.'/'.$_value;
          }

        }

      }
    //get_position wird an die Javascriptfunktion getPosition übergeben, wird nicht benutzt weil es nicht funktioniert
    public function get_position($position,$code)
    {
         //  echo ('<script type="text/javascript">getPosition("'.$position.'", "'.$code.'");</script>');
    }

    //LoadModules($side), hier werden die Templates aus der DB geladen.

    public function LoadModules($side)
    {
      $sql = ("SELECT name, position FROM modules WHERE `status` = 1 AND position = '".$side."' ORDER BY ordernr ASC");
      $qry = mysql_query($sql);
      while($row = mysql_fetch_object($qry)){
          $module =  ('modules/mod_'.$row->name.'/front_'.$row->name.'.php');
      }
     return $module;
    }
    public function __destruct(){

    }

}

Die Loadmodules rufe ich jetzt in den entsprechenden Divs auf und zwar so:

PHP:
<?php include $modules->LoadModules("divname");?>

Es wird zwar ein Modul geladen, allerdings nur 1 und nicht alle, die in der DB existent sind.

Mein ursprüngliches Vorhaben war, die Module mittels JS zu platzieren:

Java:
function getPosition(position, code) {
    document.getElementById(position).innerHTML = code;
  }

Das funktioniert leider nicht weil entweder:
1. Das Modul doppelt geladen wurde
2. Es vor jeglichem HTML Code ausgegeben wird.

Den JS Code habe ich im Head platziert, wo die Script tags hingehören.

Ich bin also schon weiter wie am Anfang, gleichzeitig allerdings wieder komplett am Anfang, weil mein Lösungsansatz nicht funktioniert.

Ich habe schon versucht, die Module mittels einer Forschleife zu laden, dies brachte aber keine verbesserung. Auch eine ForEach-Schleife und Array brachten keine Änderung.

Entweder ist mein Code in der Version völliger Blödsinn oder ich seh den Fehler vor lauter Fehlern nicht.

Ich hoffe, das war Ausführlich genug erklärt.
 
Deine while-Schleife in LoadModules läuft zwar komplett durch, überschreibt aber die Variable immer wieder neu. Wenn du
PHP:
$modules = array();
while($row = mysql_fetch_object($qry)){
    $modules[] =  ('modules/mod_'.$row->name.'/front_'.$row->name.'.php');
}
return $modules;
nutzt, liefert dir die Funktion alle Modul-Pfade zurück, die du dann weiterverarbeiten kannst, zum Beispiel zum Einbinden mittels include().
 
Danke für die Hilfe,

jetzt kriege ich allerdings diesen Fehlernotice: Array to string conversion.

Wenn ich versuche, mit Implode den String in einen Array umzuwandeln kriege ich diese Warnung

Warning: implode(): Invalid arguments passed

Hier meine geänderte Whileschleife
PHP:
        $modules = array();
        while($row = mysql_fetch_object($qry)){
            $path = ('modules/mod_'.$row->name.'/front_'.$row->name.'.php');
            $modules[] =  implode($path); //lt einer Seite bei Google
        }
        return $modules;
 
Zuletzt bearbeitet:
Ups, kaum liest man mal nicht in der Manual nach, nimmt man schon die falsche funktion.

Explode funktioniert in diesem fall auch nicht.

Was muss ich in diesem Fall dann anders machen?
 
Ich verstehe den Sinn hinter deinem Vorhaben nicht. Wieso willst du $path in ein Array konvertieren? $modules ist ein Array und enthält dann die Pfade zu den Modulen. Du kannst das Array mittels einer foreach-Schleife durchlaufen und alle Pfade einbinden.
 
ACH SO funktioniert das, wieder was gelernt.

Jetzt werden alle Module geladen und sie funktionieren sogar.

UND ich habe sogar noch meinen Einzeiler zum Aufrufen.

Jetzt bleibt nur noch die Ausgabe an einem bestimmten Punkt im Template.

Ich habe das vor wie bei Joomla, das ich übers ACP die Position festlegen kann.

Gibt es da eine schönere Lösung als meinen Ansatz mit Javascript(der leider wie zuvor gepostet nicht funktioniert)?
 
Zurück