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 = JTable::getInstance('7cob_content');  $article->title = 'This is my super cool title!'; $article->alias = JFilterOutput::stringURLSafe('This is my super cool title!'); $article->introtext = '<p>This is my super cool article!</p>'; $article->catid = 9; $article->created = JFactory::getDate()->toSQL();; $article->created_by_alias = 'Super User'; $article->state = 1; $article->access = 1; $article->metadata = '{"page_title":"","author":"","robots":""}'; $article->language = '*';
    Comme je le disais certains champs sont absents comme tags par exemple


    # Vérifier et Enregistrer ma requête

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

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


    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 hébergés chez PHPNET - +sites gérés chez 1and1 et OVH - Site pro : www.robertg-conseil.fr

    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
          1 sur 2 < >

          C'est [Réglé] et on n'en parle plus ?

          A quoi ça sert ?
          La mention [Réglé] permet aux visiteurs d'identifier rapidement les messages qui ont trouvé une solution.

          Merci donc d'utiliser cette fonctionnalité afin de faciliter la navigation et la recherche d'informations de tous sur le forum.

          Si vous deviez oublier de porter cette mention, nous nous permettrons de le faire à votre place... mais seulement une fois
          Comment ajouter la mention [Réglé] à votre discussion ?
          1 - Aller sur votre discussion et éditer votre premier message :


          2 - Cliquer sur la liste déroulante Préfixe.

          3 - Choisir le préfixe [Réglé].


          4 - Et voilà… votre discussion est désormais identifiée comme réglée.

          2 sur 2 < >

          Assistance au forum - Outil de publication d'infos de votre site

          Compatibilité: PHP 4.1,PHP4, 5, 6DEV MySQL 3.2 - 5.5 MySQLi from 4.1 ( @ >=PHP 4.4.9)

          Support Version de Joomla! : | J!3.0 | J!2.5.xx | J!1.7.xx | J!1.6.xx | J1.5.xx | J!1.0.xx |

          Version française (FR) D'autres versions sont disponibles depuis la version originale de FPA

          UTILISER À VOS PROPRES RISQUES :
          L'exactitude et l'exhaustivité de ce script ainsi que la documentation ne sont pas garanties et aucune responsabilité ne sera acceptée pour tout dommage, questions ou confusion provoquée par l'utilisation de ce script.

          Problèmes connus :
          FPA n'est actuellement pas compatible avec des sites Joomla qui ont eu leur fichier configuration.php déplacé en dehors du répertoire public_html.

          Installation :

          1. Téléchargez l'archive souhaitée : http://afuj.github.io/FPA/

          Archive zip : https://github.com/AFUJ/FPA/zipball/master

          2. Décompressez le fichier de package téléchargé sur votre propre ordinateur (à l'aide de WinZip ou d'un outil de décompression natif).

          3. Lisez le fichier LISEZMOI inclus pour toutes les notes de versions spécifiques.

          4. LIRE le fichier de documentation inclus pour obtenir des instructions d'utilisation détaillées.

          5. Téléchargez le script fpa-fr.php à la racine de votre site Joomla!. C'est l'endroit que vous avez installé Joomla et ce n'est pas la racine principale de votre serveur. Voir les exemples ci-dessous.

          6. Exécutez le script via votre navigateur en tapant: http:// www. votresite .com/ fpa-fr.php
          et remplacer www. votresite .com par votre nom de domaine


          Exemples:
          Joomla! est installé dans votre répertoire web et vous avez installé la version française du fichier FPA:
          Télécharger le script fpa-fr.php dans: /public_html/
          Pour executer le script: http://www..com/fpa-fr.php

          Joomla! est installé dans un sous-répertoire nommé "cms" et vous avez installé la version française du fichier FPA:
          Télécharger le script fpa-fr.php dans: /public_html/cms/
          Pour executer le script: http://www..com/cms/fpa-fr.php

          En raison de la nature très sensible de l'information affichée par le script FPA, il doit être retiré immédiatement du serveur après son utilisation.

          Pour supprimer le script de votre site, utilisez le lien de script de suppression fourni en haut de la page du script. Si le lien de suppression échoue pour supprimer le script, utilisez votre programme FTP pour le supprimer manuellement ou changer le nom une fois que le script a généré les données du site et le message publié sur le forum. Si le script est toujours présent sur le site, il peut être utilisé pour recueillir suffisamment d'informations pour pirater votre site. Le retrait du script empêche des étrangers de l'utiliser pour jeter un oeil à la façon dont votre site est structuré et de détecter les défauts qui peuvent être utilisé à vos dépends.
          Voir plus
          Voir moins

          Partenaire de l'association

          Réduire

          Hébergeur Web PlanetHoster
          Travaille ...
          X