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


10

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

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


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.