#php #joomla #joomla1.6
#php #joomla #joomla1.6
Вопрос:
Я внедряю пользовательский компонент MVC, следуя документации Joomla 1.6.
Я сталкиваюсь с проблемой при попытке использовать JCategories::get()
для получения списка категорий и их дочерних элементов из com_component
. Я получаю следующую ошибку:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 125306881 bytes)
Если я не выдаю print_r($this->items);
список элементов, я не получаю ошибку. Если я изменю строку
$categories = JCategories::getInstance('Content');
для чтения
$categories = JCategories::getInstance('banners');
Я не получаю ошибку.
Я включил весь свой пользовательский код компонента ниже. К вашему сведению, я провел последние пару дней в irc.freenode.net/#joomla разговаривая со всеми, кто готов помочь, достигнут очень небольшой прогресс. Любая помощь была бы высоко оценена.
Код контроллера:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import joomla controller library
jimport('joomla.application.component.controller');
$controller = JController::getInstance('CtItem');
$controller->execute(JRequest::getCmd('task'));
$controller->redirect();
Код модели:
<?php
// No direct access to this file
defined('_JEXEC') or die;
// import Joomla Categories library
jimport( 'joomla.application.categories' );
class CtItemModelCtItem extends JModel
{
private $_items = null;
private $_parent = null;
public function getItems($recursive = false)
{
$categories = JCategories::getInstance('Content');
$this->_parent = $categories->get(15);
if(is_object($this->_parent))
{
$this->_items = $this->_parent->getChildren($recursive);
}
else
{
$this->_items = false;
}
return $this->_items;
}
}
Просмотреть код:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import Joomla view library
jimport('joomla.application.component.view');
class CtItemViewCtItem extends JView
{
// Overwriting JView display method
function display($tpl = null)
{
// Assign data to the view
$this->items = $this->get('Items');
if(count($errors = $this->get('Errors')))
{
JError::raiseError(500, implode('<br />', $errors));
return false;
}
// Display the view
parent::display($tpl);
}
}
Код шаблона:
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
$document = JFactory::getDocument();
?>
<div id="Test"><?=print_r($this->items, true)?></div>
Ответ №1:
Я обнаружил, что попытка var_dump()
или print_r()
JCategoryNode приводит к бесконечному циклу. Поэтому я модифицировал свою модель выше следующим образом:
<?php
// No direct access to this file
defined('_JEXEC') or die;
// import Joomla Categories library
jimport( 'joomla.application.categories' );
class CtItemModelCtItem extends JModel
{
private $_items = null;
private $_parent = null;
public function getItems($recursive = false)
{
$categories = JCategories::getInstance('Content');
$this->_parent = $categories->get(15);
if(is_object($this->_parent))
{
$this->_items = $this->_parent->getChildren($recursive);
}
else
{
$this->_items = false;
}
return $this->loadCats($this->_items);
}
protected function loadCats($cats = array())
{
if(is_array($cats))
{
$i = 0;
$return = array();
foreach($cats as $JCatNode)
{
$return[$i]->title = $JCatNode->title;
if($JCatNode->hasChildren())
$return[$i]->children = $this->loadCats($JCatNode->getChildren());
else
$return[$i]->children = false;
$i ;
}
return $return;
}
return false;
}
}