Créez des catégories, des sous-catégories et des articles à l'aide de php

10

Est-il possible de créer dynamiquement des catégories, sous-catégories et articles Joomla à l'aide de scripts PHP?

Y a-t-il un exemple de lien?

useruseruser
la source
2
Oui, c'est possible mais très difficile et je vous le déconseille à moins que vous ne soyez très familier avec PHP, comme com_contentc'est l'extension intégrée la plus complexe de Joomla. Vous voudrez peut-être aborder cela d'une manière différente, en étendant éventuellement certaines des fonctionnalités actuelles et en écrivant votre propre classe
Lodder
@Lodder merci pour votre réponse. Pour être honnête, j'ai une connaissance de php et j'utilise Joomla en utilisant l'interface backend. Ce que je veux faire, c'est avoir un site dans lequel j'ai ajouté quelques fonctionnalités en utilisant la console d'administration Joomla (menu, pages, etc.) et je veux apporter des modifications mineures en utilisant des scripts php. Existe-t-il une sorte de tutoriel pour le réaliser?
useruseruser

Réponses:

15

C'est un processus assez long pour le faire, mais voici une version réduite du code que j'utilise généralement. Je ne garantis pas nécessairement qu'il fonctionnera comme indiqué depuis que j'ai arraché un tas de trucs internes que nous faisons en cours de route, mais ce sont les pièces dont vous avez besoin pour le faire.

Vous devrez regarder les tables #__categorieset #__contentobtenir tous les champs que vous souhaitez remplir et les ajouter aux données $category_dataet aux $article_datatableaux.

Je dois mentionner que vous pouvez l' accomplir en insérant les enregistrements avec jDatabase ou jTable, mais je ne recommanderais généralement pas cela parce que la chose importante qui vous manque est les règles et la logique Joomla intégrées qui font des choses comme la vérification de l'unicité de l'alias et la gestion de l'ACL pour les nouveaux éléments de contenu.

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;
    }
}
PIB
la source
Joomla doit être chargé bien sûr, donc si vous ne faites pas dans du code existant, vous devez le charger. J'ai mis à jour ma réponse pour y parvenir, vous êtes donc prêt à partir.
PIB du
Pas pour ce code, il utilise les modèles Joomla pour les ajouter comme Joomla le fait lui-même. Vous devriez pouvoir mettre ce code dans un fichier php, compléter le tableau $ data avec les autres champs que vous souhaitez mettre à jour et l'exécuter avec succès. Donnez-moi quelques minutes, et je mettrai à jour ma réponse pour inclure un code 100% fonctionnel.
PIB du
Le code mis à jour crée désormais une catégorie et un article en son sein lorsqu'il est exécuté tel quel. Pour info, si vous spécifiez un ID valide au lieu de 0 pour l'un ou l'autre, il mettra à jour cette catégorie ou cet article au lieu de l'ajouter. De plus, les règles ACL sont facultatives ... J'ai copié cela à partir d'un de mes scripts qui utilise ACL, c'est pourquoi c'est là, mais c'est pratique à savoir également.
PIB
1
Je peux seulement suggérer que vous formuliez ce que vous voulez accomplir sans supposer que les modèles ou MVC en font partie. Les plugins sont généralement le meilleur moyen de personnaliser ce que fait Joomla, mais la clarté de ce que vous voulez faire est la plus importante pour déterminer quelle est la meilleure solution.
PIB du
1
Cette solution fonctionne toujours bien dans Joomla! 3.9.11
AndyGaskell