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
CONTRE
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?
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');