Создавайте категории, подкатегории и статьи, используя php

10

Можно ли динамически создавать категории, подкатегории и статьи Joomla с помощью сценариев PHP?

Есть ли пример ссылки?

useruseruser
источник
2
Да, это возможно, но очень сложно, и я бы предложил против этого, если вы не очень хорошо знакомы с PHP, так как com_contentэто самое сложное встроенное расширение в Joomla. Возможно, вы захотите подойти к этому по-другому, возможно, расширив некоторые текущие функции и написав свой собственный класс
Lodder
@ Лоддер спасибо за ваш ответ. Если честно, у меня есть знания php, и я использую Joomla, используя бэкэнд-интерфейс. Я хочу, чтобы у меня был сайт, на котором я добавил некоторые функции с помощью консоли администратора Joomla (меню, страницы и т. Д.), И я хочу внести незначительные изменения, используя php-скрипты. Есть ли какой-нибудь учебник, чтобы сделать это?
useruseruser

Ответы:

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 должна быть загружена, поэтому, если вы не используете какой-либо существующий код, вам нужно загрузить его. Я обновил свой ответ, чтобы выполнить это, так что вы готовы.
ВВП
Не для этого кода, он использует модели Joomla, чтобы добавить их точно так же, как это делает сам Joomla. Вы должны иметь возможность поместить этот код в php-файл, заполнить массив $ data другими полями, которые вы хотите обновить, и успешно запустить его. Дайте мне несколько минут, и я обновлю свой ответ, чтобы включить 100% функциональный код.
ВВП
Обновленный код теперь создает категорию и статью внутри нее, когда выполняется как есть. К вашему сведению, если вы укажете действительный идентификатор вместо 0 для любого из них, он будет обновлять эту категорию или статью, а не добавлять их. Кроме того, правила ACL являются необязательными ... Я скопировал это из одного из моих сценариев, использующих ACL, поэтому он есть, но его также удобно знать.
ВВП
1
Я могу только предложить вам сформулировать, чего вы хотите достичь, не предполагая, что шаблоны или MVC являются его частями. Плагины - это, как правило, лучший способ настроить то, что делает Joomla, но четкость того, что вы хотите сделать, важнее всего, чтобы определить, какое решение лучше.
ВВП
1
Это решение все еще хорошо работает в Joomla! 3.9.11
AndyGaskell