4

新しい記事を作成し、その記事をメニュー項目に追加する joomla 2.5 のコンポーネントを作成しました。

記事の作成はうまくいっていますが、メニュー項目の作成に問題があります。

次のコードがあります。

                //add the article to a menu item
                $menuTable = JTable::getInstance('Menu', 'JTable', array());

                    $menuData = array(
                    'menutype' => 'client-pages',
                    'title' => $data[name],
                    'type' => 'component',
                    'component_id' => 22,                  
                    'link' => 'index.php?option=com_content&view=article&id='.$resultID,
                    'language' => '*',
                    'published' => 1,
                    'parent_id' => '1',
                    'level' => 1,
                );

                // Bind data
                if (!$menuTable->bind($menuData))
                {
                    $this->setError($menuTable->getError());
                    return false;
                }

                // Check the data.
                if (!$menuTable->check())
                {
                    $this->setError($menuTable->getError());
                    return false;
                }

                // Store the data.
                if (!$menuTable->store())
                {
                    $this->setError($menuTable->getError());
                    return false;
                }

エラーは、parent_id と level の設定にあるようです。libraries/joomla/database/tablenested.php のデバッグ時に、parent_id とレベルを 0 に設定します。これにより、管理者ページで次のエラーが発生しました。

警告: str_repeat() [function.str-repeat]: 2 番目の引数は、/Applications/MAMP/htdocs/joomla_2_5/administrator/components/com_menus/views/items/tmpl/default.php で 0 以上でなければなりません129行目

4

4 に答える 4

3
$table->setLocation($parent_id, 'last-child');

新しいメニュー項目の左右の値が正しく作成されるようにするために必要なのは、これだけです。これは JTableMenu の store メソッドによって処理されるようになったため、パスを再構築する必要はありません。

さらに、便利なメソッド「保存」を使用して、メニュー項目をバインド、チェック、および保存できます。

$menuItem = array(
            'menutype' => 'client-pages',
            'title' => $data[name],
            'type' => 'component',
            'component_id' => 22,                  
            'link' => 'index.php?option=com_content&view=article&id='.$resultID,
            'language' => '*',
            'published' => 1,
            'parent_id' => $parent_id,
            'level' => 1,
        );

$menuTable = JTable::getInstance('Menu', 'JTable', array());

$menuTable->setLocation($parent_id, 'last-child');

if (!$menuTable->save($menuItem)) {
    throw new Exception($menuTable->getError());
    return false;
}
于 2016-04-07T15:59:16.987 に答える
1

どういう$menutableわけか更新parent_idされずlevel、データベース テーブル内にあるため、これら 2 つのフィールドを joomla クエリで手動で更新する必要があります。

$menuTable = JTable::getInstance('Menu', 'JTable', array());

        $menuData = array(
            'menutype' => 'client-pages',
            'title' => $data[name],
            'type' => 'component',
            'component_id' => 22,                  
            'link' => 'index.php?option=com_content&view=article&id='.$resultID,
            'language' => '*',
            'published' => 1,
            'parent_id' => '1',
            'level' => 1,
        );

        // Bind data
        if (!$menuTable->bind($menuData))
        {
            $this->setError($menuTable->getError());
            return false;
        }

        // Check the data.
        if (!$menuTable->check())
        {
            $this->setError($menuTable->getError());
            return false;
        }

        // Store the data.
        if (!$menuTable->store())
        {
            $this->setError($menuTable->getError());
            return false;
        }

        $db   = $this->getDbo();
        $qry = "UPDATE `#__menu` SET `parent_id` = 1 , `level` = 1 WHERE `id` = ".$menuTable->id;
        $db->setQuery($qry);
        $db->query();
于 2015-11-03T10:15:02.123 に答える
0

このコードは私のために働いた

 JTable::addIncludePath(JPATH_ADMINISTRATOR.'/components/com_menus/tables/');

                $menuTable =& JTable::getInstance('menu', 'menusTable');

                $menuData = array(
                        'menutype' => 'client-pages',
                        'title' => 'mytrialmenu',
                        'type' => 'component',
                        'component_id' => 22,
                        'link' => 'index.php?option=index.php?                    option='com_content&view=article&id='.$resultID,
                        'language' => '*',
                        'published' => 1,
                        'parent_id' => 'choose some parent',
                        'level' => 1,
                );
                // Bind data
                if (!$row->bind($menuData))
                {
                    $this->setError($menuTable->getError());
                    return false;
                }

                // Check the data.
                if (!$row->check())
                {
                    $this->setError($menuTable->getError());
                    return false;
                }

                // Store the data.
                if (!$row->store())
                {
                    $this->setError($menuTable->getError());
                    return false;
                }

その理由は、メニュー テーブルの lft および rgt フィールドを操作するために必要な menusTable extends JnestedTable だと思います

于 2013-03-21T05:53:18.353 に答える