it-swarm.com.de

Das Speichern von JTable (in Component) schlägt fehl, wenn es von einem Modul aus aufgerufen wird

Folgendes versuche ich zu tun. Ich bin mir nicht sicher, welche Teile des Codes ich hier kopieren muss. Lassen Sie mich also mit einem vereinfachten Pseudocode beginnen, um loszulegen.

Ich habe eine Hauptkomponente (com_main) mit Modell, Tabelle usw. alles funktioniert. Aus meiner Sicht.html kann ich anrufen

$modelTU = $this->getModel('TimeUnits');
$modelTU->GetSchedule($date,...);

Das TU Modell

public function GetSchedule($date,...){
    $query = self::getQuery();
    $items = $this->_getList((string) $query...);

    if (empty($items)){  //if non found, create new from template
        $templateModel = $this->getModel('Templates');
        $templateModel->createFromTemplate($date);   //create TU's from a tempalte

     }
     return $items;
}

Die öffentliche Funktion "Template Model ..." createFromTemplate ($ date, ...) {

    //****THIS fails (or =FALSE) if called from module
    //This works fine when called from the component!!
    $modelTU =  JModelLegacy::getInstance('TimeUnit', COM_MODEL_PREFIX); //THIS FAILS

    $query = self::getQueryTempalte(....);
    $items = $this->_getList((string) $query...);
    foreach ($items as $item){
       $valTimeUnit = array(
            'duration' => $item->duration,
            'price' => $item->price
             ...
        );
        $modelTU->save($valTimeUnit);   
        //I also tried store bind here
        $tblTu = $modelTU->getTable();
        $tblTu->bind(valTimeUnit);  //table = False !!!

    }
 }

Ich weiß nicht, wie ich das sonst erklären soll. Das Fazit: Ich lade Zeiteinheiten (TU) ... und wenn es für das angegebene Datum keine gibt, rufe ich ein Vorlagenmodell auf, um eine Reihe von Vorlageneinheiten zu laden, die in TUs geklont werden sollen

Dies funktioniert einwandfrei, wenn der Aufruf innerhalb der Komponente erfolgt

Wenn ich die Modelle über in das Modul require_once importiere (JPATH_ROOT. '/Components/com_main/models/timeunit.php'); etc

es funktioniert, ich kann LADEN Timeunits, wenn sie gerade existieren, finden

Es ruft auch das templateModel auf, um neu zu klonen, bis ich meinen Marker **** Das endgültige TimeUnit-Modell -> Speichern, oder -> getTable (); scheitert

Aber nur beim Aufruf aus dem Modul

Was mache ich falsch/verstoße gegen Regeln? Namespace-Importe Ich verstehe nicht, wie es die ersten beiden Modellebenen laden und bearbeiten kann, und kann dann die letzte nicht laden. Ich habe bereits angenommen, dass ich JPATH_COMPONENT_SITE nicht verwenden kann, um Dateien in meiner Komponente anzufordern, wenn sie von meinem Modul aus funktionieren sollen. Ich verwende JPATH_ROOT. '/ components/com_byteitbooking /'.

Irgendwelche Hinweise, was ich vermisse?

Vielen Dank

BEARBEITEN: zusätzlicher Code Ich habe diesen Test in meinem Zeiteinheitsmodell durchgeführt, das JModelAdmin erweitert

public function getTable($type = self::THIS_CLASS_NAME, $prefix = COM_TABLE_PREFIX,   $config = array()) {
    dumpMessage("-> admin.MODEL.TimeUnit.getTable()");
    dumpMessage("-> $type,$prefix");
    dump($config,'$config');
    $tb = JTable::getInstance($type, $prefix, $config);
    dump($tb,'$tb');
    return $tb;
    //return JTable::getInstance($type, $prefix, $config);
}

ergebnisse 1. Aufruf von Komponente, 2. Aufruf von Modul ... Die Variablen werden korrekt aufgelöst

  • admin.MODEL.TimeUnit.getTable ()
  • TimeUnit, ByteitBookingTable
  • [array] $ config = (leer)
  • [ByteitBookingTableTimeUnit-Objekt] $ tb

VS

  • admin.MODEL.TimeUnit.getTable ()
  • TimeUnit, ByteitBookingTable
  • [array] $ config = (leer)
  • [Boolean] $ tb = FALSE

Muss ich die Modelle/Tabellen in das Modul kopieren, um sie zu verwenden? Gibt es irgendeine Einschränkung in Joomla, die ich vermisse?

2
Andreas

Ich denke, Sie müssen die Pfade für Modell und Tabelle einschließen:

JModelLegacy::addIncludePath(JPATH_SITE . '/components/com_main/models', 'ByteitBookingModel');

$modelTU = JModelLegacy::getInstance('TimeUnit', 'ByteitBookingModel');
$modelTU->addTablePath(JPATH_ADMINISTRATOR . '/components/com_main/tables');
2
Dmitry Rekun