使用php创建类别,子类别和文章


10

是否可以使用PHP脚本动态创建Joomla类别,子类别和文章?

有示例链接吗?


2
是的,这是可能的,但是非常困难,除非您对PHP非常熟悉,因为它com_content是Joomla中最复杂的内置扩展,否则我建议您不要这样做。您可能想以不同的方式来处理,可以扩展一些当前功能并编写自己的类
Lodder 2014年

@Lodder谢谢您的回答。说实话,我对php有一定的了解,并且我在后端接口上使用Joomla。我想做的是拥有一个网站,在其中我使用Joomla管理控制台添加了一些功能(菜单,页面等),并且希望使用php脚本进行较小的更改。有什么教程可以做吗?
useruseruser14年

Answers:


15

这是一个相当广泛的过程,但这是我通常使用的精简版本。由于我撕掉了我们在此过程中所做的一堆内部工作,因此我不一定保证它会按所示运行,但是这些是您需要做的。

您需要查看表#__categories#__content获取要填充的所有字段,并将它们添加到给定的$category_data$article_data数组中。

我应该提到您可以通过jDatabase或jTable插入记录完成此操作,但是我一般不建议您这样做,因为您可能会错过的重要事情是内置的Joomla规则和逻辑,这些规则和逻辑可以执行诸如检查唯一性之类的操作别名,并管理新内容项的ACL。

if (!defined('_JEXEC')) {
    define( '_JEXEC', 1 );
    define('JPATH_BASE', realpath(dirname(__FILE__)));
    require_once ( JPATH_BASE .'/includes/defines.php' );
    require_once ( JPATH_BASE .'/includes/framework.php' );
    defined('DS') or define('DS', DIRECTORY_SEPARATOR);
}
$app = JFactory::getApplication('site');

$category_data['id'] = 0;
$category_data['parent_id'] = 0;
$category_data['title'] = 'My Category Title';
$category_data['alias'] = 'my-categegory-title-alias';
$category_data['extension'] = 'com_content';
$category_data['published'] = 1;
$category_data['language'] = '*';
$category_data['params'] = array('category_layout' => '','image' => '');
$category_data['metadata'] = array('author' => '','robots' => '');

$category_id = createCategory($category_data);
if(!$category_id){
    echo "Category create failed!";
}else{
    $article_data = array(
        'id' => 0,
        'catid' => $category_id,
        'title' => 'My article title',
        'alias' => 'my-article-alias',
        'introtext' => 'My intro text',
        'fulltext' => '<p>My full text</p>',
        'state' => 1,
        'language' => '*'
    );
    $article_id = createArticle($article_data);
    if(!$article_id){
        echo "Article create failed!";
    }
}

function createCategory( $data )
{
    $data['rules'] = array(
        'core.edit.state' => array(),
        'core.edit.delete' => array(),
        'core.edit.edit' => array(),
        'core.edit.state' => array(),
        'core.edit.own' => array(1=>true)
    );

    $basePath = JPATH_ADMINISTRATOR.'/components/com_categories';
    require_once $basePath.'/models/category.php';
    $config  = array('table_path' => $basePath.'/tables');
    $category_model = new CategoriesModelCategory($config);
    if(!$category_model->save($data)){
        $err_msg = $category_model->getError();
        return false;
    }else{
        $id = $category_model->getItem()->id;
        return $id;
    }
}
function createArticle($data)
{
    $data['rules'] = array(
        'core.edit.delete' => array(),
        'core.edit.edit' => array(),
        'core.edit.state' => array(),
    );

    $basePath = JPATH_ADMINISTRATOR.'/components/com_content';
    require_once $basePath.'/models/article.php';
    $config = array();
    $article_model = new ContentModelArticle($config);
    if(!$article_model->save($data)){
        $err_msg = $article_model->getError();
        return false;
    }else{
        $id = $article_model->getItem()->id;
        return $id;
    }
}

当然必须要加载Joomla,因此,如果您不使用某些现有代码,则需要加载它。我已经更新了答案以实现这一目标,所以您很高兴。
GDP

并非针对此代码,它使用Joomla模型来添加它们,就像Joomla本身一样。您应该能够将此代码放入php文件中,并使用要更新的其他字段完成$ data数组并成功运行它。请给我几分钟,然后我将更新答案以包含100%的功能代码。
GDP

现在,更新的代码按原样执行时会在其中创建一个类别和其中的文章。仅供参考,如果您指定一个有效的ID而不是0,则它将更新该类别或商品,而不是添加它。此外,ACL规则是可选的...我从使用ACL的一个脚本中复制了此规则,这就是为什么要使用ACL的原因,但也很容易知道。
GDP

1
我只能建议您在不假定模板或MVC是其中一部分的情况下,阐明要完成的工作。通常,插件是自定义Joomla功能的最佳方法,但是,要确定最佳解决方案,最重要的是要明确您想做什么。
GDP

1
该解决方案在Joomla中仍然运行良好!3.9.11
AndyGaskell,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.