Script - générer article - Où commencer ?

Réduire
X
 
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [Problème] Script - générer article - Où commencer ?

    Bonjour,

    Je veux créer un script qui me permette générer des articles depuis des fichiers textes sous Joomla 3

    Le souci est que je ne sais pas où commencer et comment agencer ce script pour son intégration avec Joomla.

    Après mes recherches, la voie que j'ai choisi est de créer donc de créer mes objets articles et de les enregistrer en BDD Joomla dans la table prefix_content avec JTable.

    Voici l'état de mon idée :

    - Étant habitué des API comme ceux de JAVA, PHP ou Javascript, je ne m'y retrouve pas et ne comprend pas comment rechercher ce que j'ai besoin.


    # Structure du projet

    Je n'ai pas besoin de composants, de modules ou d'extension Joomla, seulement un script.php.


    # Structure des articles

    J'ai effectivement trouvé certains bouts de codes qui me permettent de construire un article bien que certains champs ne soient pas renseignés.
    Code:
     $article [COLOR=#f92772]= [/COLOR][COLOR=#ffffff]JTable[/COLOR][COLOR=#f92772]::[/COLOR][COLOR=#a7ec21]getInstance[/COLOR][COLOR=#f9faf4]([/COLOR][COLOR=#e6da74]'7cob_content'[/COLOR][COLOR=#f9faf4])[/COLOR][COLOR=#f92772]; [/COLOR] $article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]title [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#e6da74]'This is my super cool title!'[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]alias [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#ffffff]JFilterOutput[/COLOR][COLOR=#f92772]::[/COLOR][COLOR=#a7ec21]stringURLSafe[/COLOR][COLOR=#f9faf4]([/COLOR][COLOR=#e6da74]'This is my super cool title!'[/COLOR][COLOR=#f9faf4])[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]introtext [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#e6da74]'<p>This is my super cool article!</p>'[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]catid [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#ae81ff]9[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]created [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#ffffff]JFactory[/COLOR][COLOR=#f92772]::[/COLOR][COLOR=#a7ec21]getDate[/COLOR][COLOR=#f9faf4]()[/COLOR][COLOR=#f92772]->[/COLOR][COLOR=#a7e22e]toSQL[/COLOR][COLOR=#f9faf4]()[/COLOR][COLOR=#f92772];; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]created_by_alias [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#e6da74]'Super User'[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]state [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#ae81ff]1[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]access [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#ae81ff]1[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]metadata [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#e6da74]'{"page_title":"","author":"","robots":""}'[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]language [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#e6da74]'*'[/COLOR][COLOR=#f92772];[/COLOR]
    Comme je le disais certains champs sont absents comme tags par exemple


    # Vérifier et Enregistrer ma requête

    Code:
    [COLOR=#808080]// Check to make sure our data is valid, raise notice if it's not. [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#a7e22e]check[/COLOR][COLOR=#f9faf4]()[/COLOR][COLOR=#f92772]; [/COLOR] [COLOR=#808080]// Now store the article, raise notice if it doesn't get stored. [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#a7e22e]store[/COLOR][COLOR=#f9faf4]([/COLOR][COLOR=#f92772]TRUE[/COLOR][COLOR=#f9faf4])[/COLOR][COLOR=#f92772];[/COLOR]

    # Gestion des erreurs et log de debug

    Lorsque j'ai essayé ces codes j'ai bien vu que de nombreuses entités étaient indéfinis, à commencer par JTable, c'est pourquoi j'ai include le loader.php qui me permet de ce que j'ai compris d'inclure dynamiquement en fonction de mon code les classes, constantes etc .. nécessaires.
    Mais aucun message d'erreur(echo) ne s'affichent après cette include, JError non plus (deprecated).
    En cherchant j'ai vu la gestion d'erreur se faisait donc avec php maintenant donc avec le catch(Exception $e) mais bon rien ne s'affiche.


    # Code complet testé (ne marche pas)
    Code:
    [COLOR=#f92772]<?php [/COLOR][COLOR=#f92772]require_once[/COLOR][COLOR=#f9faf4]([/COLOR][COLOR=#e6da74]"../libraries/loader.php"[/COLOR][COLOR=#f9faf4])[/COLOR][COLOR=#f92772]; [/COLOR][COLOR=#808080]// require_once ('../libraries/import.legacy.php'); [/COLOR][COLOR=#808080]// use Joomla\CMS\Table\Table as JTable; [/COLOR] [COLOR=#f92772]try [/COLOR][COLOR=#f9faf4]{ [/COLOR][COLOR=#ffffff]JLoader[/COLOR][COLOR=#f92772]::[/COLOR][COLOR=#a7ec21]discover[/COLOR][COLOR=#f9faf4]([/COLOR][COLOR=#e6da74]'scripts'[/COLOR][COLOR=#f92772], [/COLOR][COLOR=#66d9ee]JPATH_LIBRARIES [/COLOR][COLOR=#f92772]. [/COLOR][COLOR=#e6da74]'../scripts'[/COLOR][COLOR=#f9faf4])[/COLOR][COLOR=#f92772]; [/COLOR] [COLOR=#808080]/*if (version_compare(JVERSION, '3.9.3', 'lt')) { [/COLOR][COLOR=#808080]        JTable::addIncludePath(JPATH_PLATFORM . 'joomla/database/table'); [/COLOR][COLOR=#808080]        JTable::addIncludePath(JPATH_ADMINISTRATOR . '/components/com_recipes/tables'); [/COLOR][COLOR=#808080]    }*/ [/COLOR] $article [COLOR=#f92772]= [/COLOR][COLOR=#ffffff]JTable[/COLOR][COLOR=#f92772]::[/COLOR][COLOR=#a7ec21]getInstance[/COLOR][COLOR=#f9faf4]([/COLOR][COLOR=#e6da74]'7cob_content'[/COLOR][COLOR=#f9faf4])[/COLOR][COLOR=#f92772]; [/COLOR] $article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]title [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#e6da74]'This is my super cool title!'[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]alias [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#ffffff]JFilterOutput[/COLOR][COLOR=#f92772]::[/COLOR][COLOR=#a7ec21]stringURLSafe[/COLOR][COLOR=#f9faf4]([/COLOR][COLOR=#e6da74]'This is my super cool title!'[/COLOR][COLOR=#f9faf4])[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]introtext [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#e6da74]'<p>This is my super cool article!</p>'[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]catid [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#ae81ff]9[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]created [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#ffffff]JFactory[/COLOR][COLOR=#f92772]::[/COLOR][COLOR=#a7ec21]getDate[/COLOR][COLOR=#f9faf4]()[/COLOR][COLOR=#f92772]->[/COLOR][COLOR=#a7e22e]toSQL[/COLOR][COLOR=#f9faf4]()[/COLOR][COLOR=#f92772];; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]created_by_alias [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#e6da74]'Super User'[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]state [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#ae81ff]1[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]access [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#ae81ff]1[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]metadata [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#e6da74]'{"page_title":"","author":"","robots":""}'[/COLOR][COLOR=#f92772]; [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#66d9ee]language [/COLOR][COLOR=#f92772]= [/COLOR][COLOR=#e6da74]'*'[/COLOR][COLOR=#f92772]; [/COLOR] [COLOR=#808080]// Check to make sure our data is valid, raise notice if it's not. [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#a7e22e]check[/COLOR][COLOR=#f9faf4]()[/COLOR][COLOR=#f92772]; [/COLOR] [COLOR=#808080]// Now store the article, raise notice if it doesn't get stored. [/COLOR]$article[COLOR=#f92772]->[/COLOR][COLOR=#a7e22e]store[/COLOR][COLOR=#f9faf4]([/COLOR][COLOR=#f92772]TRUE[/COLOR][COLOR=#f9faf4])[/COLOR][COLOR=#f92772]; [/COLOR][COLOR=#f9faf4]} [/COLOR][COLOR=#f92772]catch [/COLOR][COLOR=#f9faf4]([/COLOR][COLOR=#ffffff]Exception  [/COLOR]$t[COLOR=#f9faf4]) [/COLOR][COLOR=#f9faf4]{ [/COLOR][COLOR=#f92772]echo [/COLOR][COLOR=#e6da74]'error = '[/COLOR][COLOR=#f92772].[/COLOR]$t[COLOR=#f92772]; [/COLOR][COLOR=#f9faf4]}[/COLOR]


    J'ai bien sur commencé par ces sites https://api.joomla.fr/joomla3 et https://api.joomla.org/cms-3 mais je vous avoue être un peu perdu en ce qui concerne l'utilisation de cet API et comment charger les entités que j'ai besoin d'utiliser.
    De plus, le code du CMS semble avoir changer https://ordi-genie.com/joomla/develo...partir-de-j3-8 et j'ai encore du mal à différencier le code du Joomla 1.x, 2.5 et 3.


    Bref, si vous auriez quelques indications ou ressources a me conseiller, je suis preneur.


    Cordialement,


    D.Fertane
    Dernière édition par didierf à 07/03/2019, 12h01

  • #2
    Bienvenue !

    Si je comprends bien, tu veux réinventer la roue !

    Enregistrer un article dans Joomla! va faire intervenir plusieurs tables, l’article appartenant à une catégorie qu'il faut définir, et sauf erreur il est aussi répertorié dans la table assets. Son auteur, sa date de création, etc. sont aussi dans cette table "content" comme tu as dû le voir. Ses tags sont dans une table spécifique, pas multipliés dans chaque article...
    Bref, une simple écriture dans la table "#__content" ne suffit pas.

    Tu peux t'inspirer de J2XML pour voir comment son auteur fait, à partir d'un XML contenant les infos structurées de l'article, pour l'insérer dans le site et quelles tables sont concernées.
    "Patience et longueur de temps font plus que force ni que rage..." (La Fontaine : Le Lion et le Rat) - "Il n'y a pas de problèmes; il n'y a que des solutions" (André Gide).
    MoovJla et LazyDbBackup sur www.joomxtensions.com - FaQ sur www.fontanil.info - Site pro : www.robertg-conseil.fr chez PHPNET, sites perso chez PlanetHoster + sites gérés chez PHPNET, PlanetHoster, Ionos et OVH

    Commentaire


    • #3
      merci pour cette réponse qui m'aiguille déjà beaucoup.

      je vais donc étudier cette extension et repasserai si besoin.

      Cordialement,

      D.Fertane

      Commentaire


      • #4
        Hello.

        Joomla est architecturé MVC.

        Ta réponse se trouve donc dans le model qui se trouve en /component/com_content/models/edit.php méthode "save($data)" (ligne 177) qui après quelques bricoles concernant le multilingue que tu peux omettre, appelle sa méthode parente.

        Ce model ContentModelForm hérite de ContentModelArticle situé en /administrator/components/com_content/models/articles.php

        Tu trouveras donc en ligne 539 la methode save($data) parente de la première, méthode que tu dois appeler pour créer un article en laissant Joomla "faire le boulot".

        Il te suffit d'initialiser $data, un array avec 'title', 'introtext', 'fulltext', éventuellement 'alias', et surtout 'catid'.

        Concernant catid, pour des articles dans des catégories ciblées d'avance, tu peux utiliser le champ type "category", par exemple dans tes paramètres de composant (fichier config.xml à la racine de l'admin de ton composant).
        Pour le champ "category" voir : https://docs.joomla.org/Category_form_field_type/fr

        Dans l'attribut "extension" il faut mettre "com_content" bien sûr, vu qu'il s'agit des catégories d'articles.

        Tu récupères ainsi le catid d'un coup de baguette magique grâce au framework (merci Joomla !)

        C'est comme cela que je procède pour toutes mes publications automatiques, ou pour des formulaires de publications ciblés.

        A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
        Rejoignez le Joomla Users Groupe Alsace...
        roland_d_alsace va-t-il devenir roland_du_grand_est ?

        Commentaire


        • #5
          Sinon je n'arrive pas à lire ton code qui est "en vrac" sur une ligne.

          Mais apparemment tu instancies bien Jtable de la sorte ?
          Code PHP:
                  $article JTable::getInstance('content'); 
          Donc si tu complètes bien toutes le propriétés de JTable ensuite le check et le store devraient faire le boulot sans problème (c'est les méthodes de la classe mère de Jtable qui gèrent les liens vers les autres tables #_assets, etc..).

          Moi je procède par une méthode dans une classe statique du type :

          Code PHP:
                  if (!$article->check()) {
                      
          $app->enqueueMessage($article->getError(),'NOTICE');
                      return 
          FALSE;
                  }

                  
          JPluginHelper::importPlugin('content');
                  
          $dispatcher    JEventDispatcher::getInstance();

                  
          $result $dispatcher->trigger('onContentBeforeSave', array('com_content.article', &$articletrue));
                  if (
          in_array(false$resulttrue))
                  {
                      
          // There are some errors in the plugins


                      
          try
                      {

                          
          JLog::add(JText::sprintf('COM_XXX_ARTICLE_NON_ENREGISTRE_ERREUR_PLUGINS',implode(', '$object_file->getErrors())),
                                  
          JLog::INFO,
                                  
          'upload'
                                  
          );
                      }
                      catch (
          RuntimeException $exception)
                      {
                          
          // Informational log only
                      
          }
                      
          $app->enqueueMessage(JText::sprintf('COM_XXX_ARTICLE_NON_ENREGISTRE_ERREUR_PLUGINS',implode(', '$object_file->getErrors())),'ERROR');
                      return 
          false;
                  }

                  if (!
          $article->store()) {
                      
          $app->enqueueMessage($article->getError());
                      return 
          FALSE;
                  }

                  
          // Trigger the onContentAfterSave event.
                  
          $dispatcher->trigger('onContentAfterSave', array('com_content.article', &$articletrue)); 
          La déclaration de la classe JTable de content se trouve en /librairies/src/Tables/Content.php
          et la classe mère en /librairies/src/Tables/Table.php
          Dernière édition par roland_d_alsace à 14/03/2019, 14h43
          A tous les utilisateurs de Joomla du très Grand Est de la France et du Jura suisse
          Rejoignez le Joomla Users Groupe Alsace...
          roland_d_alsace va-t-il devenir roland_du_grand_est ?

          Commentaire

          Annonce

          Réduire
          Aucune annonce pour le moment.

          Partenaire de l'association

          Réduire

          Hébergeur Web PlanetHoster
          Travaille ...
          X