Joomla 1.6 JCategories :: get()方法在自定义MVC组件中产生"PHP致命错误:允许的内存耗尽" [英] Joomla 1.6 JCategories::get() method produces 'PHP Fatal error: Allowed memory exhausted' in custom MVC component
问题描述
我正在按照 Joomla 1.6文档.
尝试使用JCategories::get()
从com_component
获取类别及其子类别的列表时遇到问题.我收到以下错误:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 125306881 bytes)
如果我 not 发出print_r($this->items);
列出项目,则我 not 收到错误消息.如果我更改行
$categories = JCategories::getInstance('Content');
阅读
$categories = JCategories::getInstance('banners');
我不收到错误.
我在下面包含了我所有的自定义组件代码.就像FYI一样,过去的几天我在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>
我发现尝试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;
}
}
I'm implementing a custom MVC component following the Joomla 1.6 Documentation.
I am running into a problem when trying to use JCategories::get()
to obtain a list of categories and their children from com_component
. I receive the following error:
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 125306881 bytes)
If I do not issue a print_r($this->items);
to list the items, I do not receive an error. If I change the line
$categories = JCategories::getInstance('Content');
to read
$categories = JCategories::getInstance('banners');
I do not receive the error.
I have included all of my custom component code below. Just as an FYI, I've spent the past couple of days in irc.freenode.net/#joomla speaking with anyone willing to help with very little progress made. Any help would be much appreciated.
Controller code:
<?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();
Model code:
<?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;
}
}
View code:
<?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);
}
}
Template code:
<?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>
I found that attempting to var_dump()
or print_r()
JCategoryNode results in an endless loop. Therefore, I modified my model above to the following:
<?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;
}
}
这篇关于Joomla 1.6 JCategories :: get()方法在自定义MVC组件中产生"PHP致命错误:允许的内存耗尽"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!