doutongxuan1614 2012-12-13 11:46
浏览 48
已采纳

Joomla 3.0菜单致命错误

After trying to add a menu item to a menu in the backend of Joomla 3.0 that failed due to a duplicate alias accessing the menu section of the backend no longer works. Menu items disappear from the frontend. Trying to add further menu items results in a fatal error

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

deleting the erroneous menu item in the database returns the frontend menu items, but the backend is still not working.

this is the method highlighted in the above error: with ** highlighting the row

/**
 * 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;
}

does anyone have a fix?

the docs article linked in the method details is effectively non-existent.

edit1: Notes:

  • This is on IIS on localhost for dev purposes
  • set memory limit to 256m and 512m but no change.
  • changed several other time/size limit settings in PHP.ini but still no joy
  • restarted server.
  • no cookies
  • rebuilt menus and modules - fixes front end display - backend still broken.

edit2: Current settings:

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: db row content in the #_menu table:

  '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: further discovery:

If for example alias is 'abc123' every other record in the #_menu table has its path field updated to abc123/existing-alias, whilst path remains empty on new row added by trying to add menu item with alias abc123, this row has an id of 0.

  • 写回答

1条回答 默认 最新

  • doumowu7371 2013-01-03 14:13
    关注

    apparently the primary key was missing from the menu_type and menu tables and this was causing the timeout - fatal error

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化
  • ¥15 Mirare PLUS 进行密钥认证?(详解)
  • ¥15 物体双站RCS和其组成阵列后的双站RCS关系验证
  • ¥20 想用ollama做一个自己的AI数据库
  • ¥15 关于qualoth编辑及缝合服装领子的问题解决方案探寻
  • ¥15 请问怎么才能复现这样的图呀