Joomla 1.6 JCategories:: get() метод выдает «PHP Fatal error: исчерпана разрешенная память» в пользовательском компоненте MVC

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

    }

}