web-dev-qa-db-fra.com

Comment appeler une méthode de modèle depuis un plugin système?

J'ai un composant ('com_foo') qui a un modèle appelé 'foobar'. La déclaration de classe est comme ceci:

class FooModelbar extends JModelItem

Cette classe a une méthode publique appelée getFooBar ().

J'ai aussi un plugin système appelé 'foobar'. J'essaie d'accéder à la méthode publique du composant à partir de ce plugin.

JLoader::register('FooModelBar', JPATH_SITE . '/components/com_foo/models/bar.php');
$foobarInstance = new FooModelBar();
$baz = $foobarInstance->getFoobar();

Mais je reçois des erreurs sans rapport, comme "Impossible de redéclarer la fonction x", qui ne figurent même pas dans le plug-in ou le composant. Et si j'éteins le plugin ou supprime la ligne de code JLoader :: register, l'erreur disparaît. Si clairement que je dois faire quelque chose de mal.

Quelle est la manière "correcte" d'accéder à la méthode d'un composant à partir d'un plugin système?

6
sifu

Cela fonctionnera facilement dans Joomla 3.x

//load model
JModelLegacy::addIncludePath(JPATH_SITE . DIRECTORY_SEPARATOR . 'components' . DIRECTORY_SEPARATOR . 'com_foo' . DIRECTORY_SEPARATOR . 'models');

//get instance of model class, where class name will be fooModelBar
$model = JModelLegacy::getInstance('bar', 'fooModel');

//call model method
$baz = $model->getFoobar();
4
Piero Marsilio

Pour appeler un modèle de n'importe où dans Joomla, vous pouvez utiliser cette méthode.

//Load the Joomla Model framework
jimport('joomla.application.component.model');

//Load com_foo's foobar model. Remember the file name should be foobar.php inside the models folder
JModelLegacy::addIncludePath(JPATH_SITE.'/components/com_foo/models', 'FooModelBar');

//Get Instance of Model Object
$foobarInstance = JModelLegacy::getInstance('foobar', 'FooModelBar');

//Now you can call the methods inside the model
$baz = $foobarInstance->getFoobar();
4
Amit Ray