it-swarm-eu.dev

Il salvataggio di JTable (in Component) non riesce quando viene chiamato da un modulo

Ecco cosa sto cercando di fare. Non sono sicuro di quali parti del codice sia necessario copiare qui, quindi vorrei iniziare con alcuni pseudo-codice semplificati per iniziare.

Ho un componente principale (com_main) con modello, tabella, ecc. Tutto funzionante. Dal mio view.html posso chiamare

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

Il TU modello

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;
}

Il modello di modello ... funzione pubblica 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 !!!

    }
 }

Non so come altro spiegarlo. La linea di fondo: carico timeunits (TU) ... e se per la data specificata non esiste, chiamo un modello di modello per caricare un set di unità modello da clonare in TU

Funziona bene quando viene chiamato dall'interno del componente

Se importare i modelli tramite in nel modulo request_once (JPATH_ROOT. '/Components/com_main/models/timeunit.php'); eccetera

funziona, LOAD Timeunits LOAD se esistono basta trovare

Chiama anche il templateModel per clonare il nuovo una volta fino a quando non ho il mio marker **** Il modello TimeUnit finale -> Salva o -> getTable (); non riesce

Ma solo quando chiamato dal modulo

Cosa sto facendo di sbagliato/violare le regole? Importazioni di spazi dei nomi Non capisco come possa caricare e lavorare i primi due livelli del modello, quindi non riesco a caricare l'ultimo. Ho già pensato di non poter utilizzare "JPATH_COMPONENT_SITE" per richiedere file all'interno del mio componente se voglio che funzionino dal mio modulo, utilizzo "JPATH_ROOT. '/ Componenti/com_byteitbooking /'.

Qualche suggerimento su cosa mi manca l'acaro?

Grazie

EDIT: codice aggiuntivo Ho fatto questo test, nel mio modello di unità di tempo che estende JModelAdmin

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);
}

risultati 1 ° chiamato dal componente, 2 ° dal modulo ... le variabili vengono risolte correttamente

  • admin.MODEL.TimeUnit.getTable ()
  • TIMEUNIT, ByteitBookingTable
  • [array] $ config = (vuoto)
  • [Oggetto ByteitBookingTableTimeUnit] $ tb

VS

  • admin.MODEL.TimeUnit.getTable ()
  • TIMEUNIT, ByteitBookingTable
  • [array] $ config = (vuoto)
  • [booleano] $ tb = FALSO

Devo copiare i modelli/le tabelle nel modulo per poterli usare? C'è qualche tipo di restrizione in Joomla che mi manca?

2
Andreas

Penso che devi includere i percorsi sia per il modello che per la tabella:

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