Drupal 6.x - Osztály létrehozása adatbázisból

A feladat az, hogy Drupal-ban hozzunk létre dinamikusan osztályokat úgy, hogy paraméter alapján legyen megadva melyik osztályt kell létrehozni, és a függvények törzse is adatbázisban van tárolva.

Az alább közölt megoldás nem teljeskörű, mert nincsenek benne függvény input paraméterek, se attribútumok stb, de az alábbi alapokra lehet tovább építeni.

VIGYÁZAT! Ez csak elvi megoldás, erős biztonsági kockázattal jár, és ebben a formában a munkamenet kezelések során is léphetnek fel gondok, mert egy hívás során a többször include-olt modul fájl már nem ugyanazokat az URL paramétereket kapja meg, és az osztály ezért nem lesz elérhető.

<?php
// Az osztály definícióját (PHP kód) előállító függvény
// A függvény akkor ad vissza soztály definíciós kódot, ha az URL-ben
//   az első paraméter = "make_class"
//   a második pedig a létrehozandó osztály adatbázis beli azonosítója
//   Például: http://mydomain/make_class/3
function _mymodule_class_code() {
  // Ha az URL első paramétere nem az osztály létrehozásáról szól, akkor nem kell semmit létrehozni
  if (arg(0) !== "make_class") return "";
  // Az URL második paraméteréből olvassuk ki, hogy melyik osztályt kell létrehozni
  $class_id = arg(1);
  // Ha nincs megadva, vagy nem egész szám, akkor nem kell osztályt létrehozni
  if (!$class_id || !is_int($class_id)) return "";
  // Az osztály nevének kiolvasása az adatbázisból
  $class_sql  = "SELECT name FROM {my_classes} WHERE id = '$class_id'";
  $class_name = db_result(db_query($class_sql));
  // Ha nem található az osztály, akkor sem kell semmit létrehozni
  if (!$class_name) return "";
  // Az osztály metódusok neveinek és függvénytörzsének kiolvasása
  $func_sql   = "SELECT name, func FROM {my_functions} WHERE class_id = '$class_id'";
  $query_result = db_query($func_sql);
  // Az osztálydefiníció eleje
  $func_str = "class $class_name {";
  while ($row = db_fetch_array($query_result)) {
    // A metódusok neve és törzse
    $func_str .= "
    public function {$row["name"]}() {
      {$row["func"]}
    }";
  };
  // Az osztálydefiníció lezárása
  $func_str .= '}';
  // Visszaadjuk az osztály definícióját (PHP kód)
  return $func_str;
}
// Az eval() függvénnyel előállítjuk a szövegből a PHP kódot.
eval(_mymodule_class_code());
?>