Joomla 3.0菜单致命错误

时间:2012-12-13 11:46:35

标签: php joomla joomla3.0

尝试将菜单项添加到Joomla 3.0后端的菜单后,由于重复别名访问后端的菜单部分而失败,该菜单项不再有效。 菜单项从前端消失。 尝试添加其他菜单项会导致致命错误

PHP Fatal error:  Allowed memory size of 134217728 bytes exhausted (tried to allocate 36324 bytes) in \libraries\joomla\table\nested.php on line 1251

删除数据库中的错误菜单项会返回前端菜单项,但后端仍无法正常工作。

这是上述错误中突出显示的方法: * *突出显示行

/**
 * Method to recursively rebuild the whole nested set tree.
 *
 * @param   integer  $parentId  The root of the tree to rebuild.
 * @param   integer  $leftId    The left id to start with in building the tree.
 * @param   integer  $level     The level to assign to the current nodes.
 * @param   string   $path      The path to the current nodes.
 *
 * @return  integer  1 + value of root rgt on success, false on failure
 *
 * @link    http://docs.joomla.org/JTableNested/rebuild
 * @since   11.1
 * @throws  RuntimeException on database error.
 */
public function rebuild($parentId = null, $leftId = 0, $level = 0, $path = '')
{
    // If no parent is provided, try to find it.
    if ($parentId === null)
    {
        // Get the root item.
        $parentId = $this->getRootId();
        if ($parentId === false)
        {
            return false;
        }
    }

    // Build the structure of the recursive query.
    if (!isset($this->_cache['rebuild.sql']))
    {
        $query = $this->_db->getQuery(true);
        $query->select($this->_tbl_key . ', alias')
            ->from($this->_tbl)
            ->where('parent_id = %d');

        // If the table has an ordering field, use that for ordering.
        if (property_exists($this, 'ordering'))
        {
            $query->order('parent_id, ordering, lft');
        }
        else
        {
            $query->order('parent_id, lft');
        }
        $this->_cache['rebuild.sql'] = (string) $query;
    }

    // Make a shortcut to database object.

    // Assemble the query to find all children of this node.
    $this->_db->setQuery(sprintf($this->_cache['rebuild.sql'], (int) $parentId));

    $children = $this->_db->loadObjectList();

    // The right value of this node is the left value + 1
    $rightId = $leftId + 1;

    // Execute this function recursively over all children
    foreach ($children as $node)
    {
        /*
         * $rightId is the current right value, which is incremented on recursion return.
         * Increment the level for the children.
         * Add this item's alias to the path (but avoid a leading /)
         */
   ****
        $rightId = $this->rebuild($node->{$this->_tbl_key}, $rightId, $level + 1, $path . (empty($path) ? '' : '/') . $node->alias);
   ****

        // If there is an update failure, return false to break out of the recursion.
        if ($rightId === false)
        {
            return false;
        }
    }

    // We've got the left value, and now that we've processed
    // the children of this node we also know the right value.
    $query = $this->_db->getQuery(true);
    $query->update($this->_tbl)
        ->set('lft = ' . (int) $leftId)
        ->set('rgt = ' . (int) $rightId)
        ->set('level = ' . (int) $level)
        ->set('path = ' . $this->_db->quote($path))
        ->where($this->_tbl_key . ' = ' . (int) $parentId);
    $this->_db->setQuery($query)->execute();

    // Return the right value of this node + 1.
    return $rightId + 1;
}

有人有修复吗?

方法详细信息中链接的文档文章实际上是不存在的。

edit1:注意:

  • 这是在localhost上用于开发目的的IIS上
  • 将内存限制设置为256m和512m但没有变化。
  • 在PHP.ini中更改了其他几个时间/大小限制设置但仍然没有快乐
  • 重启服务器。
  • 没有饼干
  • 重建菜单和模块 - 修复前端显示 - 后端仍然坏了。

edit2:当前设置:

max_execution_time: 3000 3000
max_file_uploads: 200 200
max_input_nesting_level 64 64
max_input_time 600 600
max_input_vars 1000 1000
memory_limit -1 512M

edit3:#_menu表中的db行内容:

  '0', 'menutype', 'title', 'alias', '', '', '', 'separator', '1', '1', '1', '0', '0', '0000-00-00 00:00:00', '0', '1', '', '0', '{\"menu_image\":\"\",\"menu_text\":1}', '223', '224', '0', '*', '0'

edit4:进一步发现:

例如,如果别名是' abc123' #_menu表中的每个其他记录的路径字段都更新为abc123 / existing-alias,而路径在添加的新行上保持为空,尝试添加别名为abc123的菜单项,此行的ID为0。

1 个答案:

答案 0 :(得分:0)

显然,menu_type和menu表中缺少主键,导致超时 - 致命错误