有谁知道如何以编程方式将新内容类别正确插入数据库?对于 category 表中的每个帖子,在 assets 表中还保存了一个设置了 lft 和 rgt 的帖子。有没有可以用来代替普通 SQL 的本地 Joomla 类?
4 回答
请仅使用本地类,哪些类别将为您无缝处理。一旦您添加类别,整个事情就会自动处理。只要看看任何核心组件,看看如何。
使用 sql 更新 assets 表并不容易,它都是非常专门管理的,并且是一系列复杂的外键表的一部分。
扩展 JTable 或 JTableContent 来处理这个问题。
这是我刚刚整理的一些代码,它们只使用了这个JTableCategory
类,所以它可以简单地在 Joomla 的前端或管理端使用
$table = JTable::getInstance('category');
$data = array();
// name the category
$data['title'] = $title;
// set the parent category for the new category
$data['parent_id'] = $parent_id;
// set what extension the category is for
$data['extension'] = $extension;
// Set the category to be published by default
$data['published'] = 1;
// setLocation uses the parent_id and updates the nesting columns correctly
$table->setLocation($data['parent_id'], 'last-child');
// push our data into the table object
$table->bind($data);
// some data checks including setting the alias based on the name
if ($table->check()) {
// and store it!
$table->store();
// Success
} else {
// Error
}
当然,您会希望正确设置数据片段,但这些是要设置的核心数据片段。
这是我为此目的创建的一个函数,经过一些挖掘和实验。
它使用核心类,因此需要访问它们(对我来说,它基本上是 Joomla 组件的一部分)。
请注意,对于 Joomla 3,对于 Joomla 2.5 及之前的版本,您需要将JModelLegacy更改为JModel。
function createCategory( $name, $parent_id, $note )
{
JTable::addIncludePath( JPATH_ADMINISTRATOR . '/components/com_categories/tables' );
$cat_model = JModelLegacy::getInstance( 'Category', 'CategoriesModel' );
$data = array (
'id' => 0,
'parent_id' => $parent_id,
'extension' => 'com_content',
'title' => $name,
'alias' => '',
'note' => $note,
'description' => '',
'published' => '1',
'access' => '1',
'metadesc' => '',
'metakey' => '',
'created_user_id' => '0',
'language' => '*',
'rules' => array(
'core.create' => array(),
'core.delete' => array(),
'core.edit' => array(),
'core.edit.state' => array(),
'core.edit.own' => array(),
),
'params' => array(
'category_layout' => '',
'image' => '',
),
'metadata' => array(
'author' => '',
'robots' => '',
),
);
if( !$cat_model->save( $data ) )
{
return NULL;
}
$categories = JCategories::getInstance( 'Content' );
$subcategory = $categories->get( $cat_model->getState( "category.id" ) );
return $subcategory;
}
您也许可以使用 category.php 文件中的save()。
文件位置:root\administrator\components\com_categories\models\category.php
它保存提供给它的表单数据!
JOS_assets 表用于存储创建的每个资产的 ACL。
如果您在以编程方式创建类别时不更新此表,则将应用默认 ACL。当您稍后在管理面板中打开并保存类别时,ACL 将被更新,因为它应该由核心 Joomla! 更新。
不过,您可以非常轻松地创建 SQL 查询并更新资产表。一旦您在 phpmyadmin 中打开表格的内容,它就很容易理解。