it-swarm-es.com

¿Cómo llamar a un método modelo desde un complemento del sistema?

Tengo un componente ('com_foo') que tiene un modelo llamado 'foobar'. La declaración de clase es así:

class FooModelbar extends JModelItem

Esta clase tiene un método público llamado getFooBar ().

También tengo un complemento de sistema llamado 'foobar'. Estoy tratando de acceder al método público del componente desde este complemento.

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

Pero recibo algunos errores no relacionados como 'No se puede redeclarar la función x' que ni siquiera está en el complemento o el componente. Y si apago el complemento o elimino la línea de código JLoader :: register, el error desaparece. Claramente, debo estar haciendo algo mal.

¿Cuál es la forma 'correcta' de acceder al método de un componente desde un complemento del sistema?

6
sifu

Esto funcionará con facilidad en 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

Para llamar a un modelo desde cualquier lugar dentro de Joomla, puede usar este método

//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