web-dev-qa-db-fra.com

L'enregistrement de JTable (dans Component) échoue lorsqu'il est appelé depuis un module

Voici ce que je suis essayer de faire. Je ne sais pas exactement quelles parties du code je dois copier ici, alors laissez-moi commencer par un pseudo-code trop simplifié pour commencer.

J'ai un composant principal (com_main) avec le modèle, la table, etc. tout fonctionne. De mon point de vue.html je peux appeler

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

Le modèle TU

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

Le modèle de modèle ... fonction publique 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 !!!

    }
 }

Je ne sais pas comment expliquer cela autrement. La ligne du bas: je charge timeunits (TU) ... et si pour la date donnée inexistante, j'appelle un modèle de modèle pour charger un ensemble d'unités de modèle à cloner dans les TU

Cela fonctionne bien lorsqu'il est appelé depuis le composant.

Si j'importe les modèles via dans le module require_once (JPATH_ROOT. '/Components/com_main/models/timeunit.php'); etc

ça marche, je peux CHARGER des Timeunits s’ils existent il suffit de trouver

Il appelle également le templateModel pour qu'il clone new une fois, jusqu'à ce que mon marqueur soit venu. **** Le dernier modèle TimeUnit -> Save, ou -> getTable (); échoue

Mais seulement quand appelé depuis le module

Qu'est-ce que je fais mal/enfreint les règles? Importations d'espace de noms, je ne comprends pas comment il peut charger et utiliser les deux premiers niveaux de modèle, puis ne pas charger le dernier. Je pensais déjà que je ne pouvais pas utiliser 'JPATH_COMPONENT_SITE' pour exiger des fichiers dans mon composant si je voulais qu'ils fonctionnent à partir de mon module, j'utilise 'JPATH_ROOT. '/ components/com_byteitbooking /'.

Tous les indicateurs qui me manquent?

Merci

EDIT: code supplémentaire j'ai fait ce test, dans mon modèle timeunit étendant 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);
}

résultats 1er appelé depuis le composant, 2e du module ... les vars sont résolus correctement

  • admin.MODEL.TimeUnit.getTable ()
  • TimeUnit, ByteitBookingTable
  • [tableau] $ config = (vide)
  • [Objet ByteitBookingTableTimeUnit] $ tb

CONTRE

  • admin.MODEL.TimeUnit.getTable ()
  • TimeUnit, ByteitBookingTable
  • [tableau] $ config = (vide)
  • [booléen] $ tb = FALSE

Dois-je copier les modèles/tableaux dans le module pour pouvoir les utiliser? Y a-t-il une sorte de restriction dans Joomla qui me manque?

2
Andreas

Je pense que vous devez inclure les chemins à la fois pour model et table:

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