CMS Automne

Forum de la communauté du CMS Automne
Nous sommes actuellement le Jeu Mai 02, 2024 2:28 pm

Le fuseau horaire est UTC [Heure d’été]




Publier un nouveau sujet Répondre au sujet  [ 14 messages ] 
Auteur Message
MessagePublié: Lun Sep 19, 2011 5:15 pm 
Hors-ligne

Inscrit(e) le : Ven Avr 15, 2011 9:31 am
Message(s) : 60
Bonsoir,

Je souhaites automatiser l'insertion des données dans un module polymod à partir d'un script PHP.

Est ce qu'il est possible de remplir les champs d'un objet puis d'enregistrer ce dernier sans passer par le formulaire d'ajout /modification d'un élément d'objet?

Si c'est possible et si vous avez un exemple de code source; cela m'avancerai dans la compréhension de la solution.

Merci pour votre réponse par avance.


Dernière édition par kae le Mar Sep 27, 2011 9:37 am, édité 2 fois.

Haut
 Profil  
 
MessagePublié: Lun Sep 19, 2011 5:35 pm 
Hors-ligne
Administrateur
Avatar de l’utilisateur

Inscrit(e) le : Jeu Juin 16, 2005 8:05 am
Message(s) : 628
Localisation : Toulouse, France
Salut,

L'import de données n'est pas encore dispo par défaut dans Automne, c'est prévu pour la 4.3
http://www.automne-cms.org/web/fr/477-b ... php?id=544

J'ai pas de code source sous la main là désolé ;)

_________________
Frank
http://www.automne-cms.org


Haut
 Profil  
 
MessagePublié: Mar Sep 20, 2011 10:08 am 
Hors-ligne

Inscrit(e) le : Ven Avr 15, 2011 9:31 am
Message(s) : 60
J'ai identifié record.php, est qu'il est exploitable dans un script php?
J'ai également identifié que je pouvais récupérer un module, puis les objets du modules et enfin les champs d'un module.

Comment est ce que je peux référencer ces classes pour exploiter les objets ....

Je veux pouvoir utiliser certaine données des objets du module pour générer un PDF.


Haut
 Profil  
 
MessagePublié: Mar Sep 20, 2011 1:11 pm 
Hors-ligne
Utilisateur enthousiaste

Inscrit(e) le : Ven Mars 23, 2007 9:07 am
Message(s) : 57
Il est tout à fait possible de travailler directement en PHP pour lister, éditer et supprimer des objets polymod.
Cependant cela demande une connaissance de PHP.
Voici rapidement quelques exemples :

Pour récupérer un objet seul, on peut utiliser :
Code :
$myPolyObject = CMS_poly_object_catalog::getObjectByID($itemID, $returnDefinition = false, $public = false);


Pour effectuer une recherche :
Code :
$search = new CMS_object_search(new CMS_poly_object_definition($objectID),true); // Instanciation
$search->addWhereCondition($fieldID, $myValue); // Recherche par valeur
$search->addWhereCondition('item', $itemID); // Recherche par id
$search->addOrderCondition($fieldID, 'asc'); // Ordonner les résultats en ASC
$search->setAttribute('itemsPerPage', 10); // Limiter les résultats par page
$items = $search->search(); // Renvoie des objets polymod par défaut. Un paramètre permet de spécifier le type de données à retourner. Il existe des types moins gourmands en mémoire. Par exemple retourner uniquement les IDs des objets.


Pour insérer des valeurs à des champs, et enregistre l'objet :
Code :
$myPolyObject = CMS_poly_object_catalog::getObjectByID($itemID, $returnDefinition = false, $public = false); // Instanciation
$myPolyObject->setValues($fieldID, array($fieldID.'_0' => $statusToSet), ''); // Insère une valeur dans le champ. Retourne false en cas d'échec.
$myPolyObject->writeToPersistence(); // Enregistre l'objet. retourne false en cas d'échec.
// Attention, il faut vérifier le fonctionnement de ces fonctions en regardant leur fonctionnement dans les classes. Certains paramètres ou syntaxes sont particulières.


Ceci n'est qu'un aperçu des possibilités via PHP. Il est possible de faire beaucoup mieux...


Haut
 Profil  
 
MessagePublié: Mar Sep 20, 2011 1:21 pm 
Hors-ligne

Inscrit(e) le : Ven Avr 15, 2011 9:31 am
Message(s) : 60
Merci pour cette explication.

Cependant pour accéder à ces objets, je dois inclure des scripits php des classes qui définissent toutes le méthodes que tu utilise dans ton exemple.

C'est la ou je ne visualise pas bien le concept.

Pour mon test, j'ai créé une page php dans le répertoire
Citer:
\web\test\test.php
et je voudrais pouvoir accéder et manipuler les objets d'un module polymod.

Qu'est ce que je référence pour pouvoir manipuler les objets du module ?
Est ce qu'il y a un fichier php particulier à inclure dans mon php?

Merci pour ta réponse.


Haut
 Profil  
 
MessagePublié: Mar Sep 20, 2011 3:05 pm 
Hors-ligne
Administrateur
Avatar de l’utilisateur

Inscrit(e) le : Jeu Juin 16, 2005 8:05 am
Message(s) : 628
Localisation : Toulouse, France
Pour avoir accès aux classes d'Automne il te faut inclure cette ligne en haut de ton script PHP
Code :
require_once($_SERVER["DOCUMENT_ROOT"]."/cms_rc_frontend.php");


Afin de t'assurer que ton script ne puisse être lancé que par un admin Automne, tu peux aussi ajouter ce snippet de code :
Code :
if(!isset($cms_user) || !is_a($cms_user, 'CMS_profile_user') || !$cms_user->hasAdminClearance(CLEARANCE_ADMINISTRATION_EDITVALIDATEALL)){
   header("Location: /403.php");
   exit;
}

_________________
Frank
http://www.automne-cms.org


Haut
 Profil  
 
MessagePublié: Mar Sep 20, 2011 3:31 pm 
Hors-ligne
Utilisateur enthousiaste

Inscrit(e) le : Ven Mars 23, 2007 9:07 am
Message(s) : 57
Citer:
if(!isset($cms_user) || !is_a($cms_user, 'CMS_profile_user') || !$cms_user->hasAdminClearance(CLEARANCE_ADMINISTRATION_EDITVALIDATEALL)){
header("Location: /403.php");
exit;}


Ce code redirige tout visiteur qui n'est pas administrateur vers une 403. Je ne pense pas que cela soit utile ici.


Haut
 Profil  
 
MessagePublié: Mar Sep 20, 2011 3:42 pm 
Hors-ligne

Inscrit(e) le : Ven Avr 15, 2011 9:31 am
Message(s) : 60
merci pour ces précisions.
Je vais faire mes tests.


Haut
 Profil  
 
MessagePublié: Mar Sep 27, 2011 9:36 am 
Hors-ligne

Inscrit(e) le : Ven Avr 15, 2011 9:31 am
Message(s) : 60
Bonjour,
Je ne comprend pas très bien le code source Pour insérer des valeurs à des champs, et enregistrer l'objet :
mon objet Adresse avec les champs qui le compose.
Code :
5 Adresse
   |--26 Rue
   |--27 Code Postal
   |--28 Ville
   |--29 Téléphone
   |--30 Télécopie

Je demande une instance, je remplis les champs de base puis j'enregistre comme suit :
Code :
$PolyObject = CMS_poly_object_catalog::getObjectByID(5, $returnDefinition = false, $public = false); // Instanciation
   $PolyObject->setValue('Rue','198 Rue Exemple');
   $PolyObject->setValue('Code Postal','31000');
   $PolyObject->setValue('Ville','TOULOUSE');
   PolyObject->writeToPersistence();

A l'exécution j'ai l'erreur suivant :
Fatal error: Call to a member function setValue() on a non-object in /var/www/html/web/test/test.php on line 47
Ligne 47 étant la ligne de la Rue dans le fichier test.php


Haut
 Profil  
 
MessagePublié: Mar Sep 27, 2011 9:51 am 
Hors-ligne
Utilisateur enthousiaste

Inscrit(e) le : Ven Mars 23, 2007 9:07 am
Message(s) : 57
Le code devrait plutôt ressembler à ceci :

Code :
<?php
$PolyObject = CMS_poly_object_catalog::getObjectByID(5, false, false); // Instanciation de l'élément $PolyObject. Les deux derniers paramètres sont optionnels
$PolyObject->setValue(26, array('26_0' => '198 Rue Exemple'), ''); // Enregistrement de la valeur pour le champ 26
$PolyObject->setValue(26, array('27_0' => '31000'), ''); // Enregistrement de la valeur pour le champ 27
$PolyObject->setValue(26, array('28_0' => 'TOULOUSE'), ''); // Enregistrement de la valeur pour le champ 28
$PolyObject->writeToPersistence(); // Enregistrement de l'élément $PolyObject
?>


En supposant que les champs 26, 27 et 28 soient des champs "chaîne de caractère".
La syntaxe peut en effet sensiblement varier selon les types de champs.


Haut
 Profil  
 
MessagePublié: Mar Sep 27, 2011 9:58 am 
Hors-ligne
Utilisateur enthousiaste

Inscrit(e) le : Ven Mars 23, 2007 9:07 am
Message(s) : 57
A noter que la fonction writeToPersistence() renvoie un booléen : true si l'enregistrement s'est bien passé, false dans le cas contraire.
On peut ainsi effectuer cette vérification :
Code :
if($PolyObject->writeToPersistence()){
echo 'Enregistrement OK';
} else {
echo 'Enregistrement KO';
}


La fonction setValue() retourne également un booléen. false si la valeur du champ n'est pas correcte et ne peut pas être enregistrée.
De la même manière :
Code :
if($PolyObject->setValue(26, array('26_0' => '198 Rue Exemple'), '')){
echo 'Champ 26 : OK';
} else {
echo 'Champ 26 : KO';
}


Il faut savoir que l'enregistrement retournera false si l'utilisateur ne possède pas les droits suffisants.
On peut consulter le journal d'erreurs d'Automne pour avoir des précisions.


Haut
 Profil  
 
MessagePublié: Jeu Oct 06, 2011 11:30 am 
Hors-ligne

Inscrit(e) le : Ven Août 12, 2011 9:17 am
Message(s) : 55
Bonjour,

Je teste l'import d'éléments dans un module Polymod existant, mais ça ne fonctionne pas. (J'ai peut être tout compris de travers... Est-ce que c'est bien le but recherché par kae ?)

Voici le code que j'utilise :
Code :
require_once($_SERVER["DOCUMENT_ROOT"]."/cms_rc_frontend.php");

$fichier = "liste_centres.csv";
$fic = fopen($fichier, 'rb');

for ($ligne = fgetcsv($fic, 1024); !feof($fic); $ligne = fgetcsv($fic, 1024))
{
   $j = sizeof($ligne);
   for ($i = 0; $i < $j; $i++)
   {
      $row = explode(';',$ligne[$i]);
    
      $PolyObject = CMS_poly_object_catalog::getObjectByID(12, false, false); // Instanciation de l'élément $PolyObject, 12 étant l'ID de mon module.

      $PolyObject->setValue(30, array('30_0' => $row[0]), ''); // Enregistrement de la valeur pour le champ 30 => Nom du centre
      $PolyObject->setValue(31, array('31_0' => $row[1]), ''); // Enregistrement de la valeur pour le champ 31 => Adresse
      $PolyObject->setValue(40, array('40_0' => $row[4]), ''); // Enregistrement de la valeur pour le champ 40 => Email
      
      if($PolyObject->writeToPersistence())// Enregistrement de l'élément $PolyObject
      {
         echo 'Enregistrement OK';
      }
      else
      {
         echo 'Enregistrement KO';
      }
   }
}



À l'exécution, j'ai "Enregistrement KO", je suis donc allé dans le journal des erreurs et voici ce qui est indiqué :

    2011-10-06 11:47:58|http|/php/import_centres.php (line 19) : Unknown method 'setValue' for object CMS_poly_object in this version of Automne
    2011-10-06 11:47:58|http|/php/import_centres.php (line 20) : Unknown method 'setValue' for object CMS_poly_object in this version of Automne
    2011-10-06 11:47:58|http|/php/import_centres.php (line 25) : Unknown method 'setValue' for object CMS_poly_object in this version of Automne
    2011-10-06 11:47:58|http|CMS_poly_object->writeToPersistence (line 974) : Can't write object with error

Après vérification dans le manuel (http://www.automne-cms.org/api/), il me semble que la méthode setValue n'est pas déclarée pour la classe CMS_poly_object_catalog


Haut
 Profil  
 
MessagePublié: Mer Oct 12, 2011 2:00 pm 
Hors-ligne
Administrateur
Avatar de l’utilisateur

Inscrit(e) le : Mer Juin 15, 2005 8:28 am
Message(s) : 759
Localisation : Sophia Antipolis
Il y a des erreurs dans ton code, voila quelque chose qui devrait marcher :
Code :
require_once($_SERVER["DOCUMENT_ROOT"]."/cms_rc_frontend.php");

$fichier = "liste_centres.csv";
$fic = fopen($fichier, 'rb');

for ($ligne = fgetcsv($fic, 1024); !feof($fic); $ligne = fgetcsv($fic, 1024))
{
   $j = sizeof($ligne);
   for ($i = 0; $i < $j; $i++)
   {
      $row = explode(';',$ligne[$i]);
     
      $PolyObject = new CMS_poly_object(5); // Instanciation de l'élément $PolyObject, 5 étant l'ID du type d'objet (adresse).

      $PolyObject->setValues(30, array('30_0' => $row[0]), ''); // Enregistrement de la valeur pour le champ 30 => Nom du centre
      $PolyObject->setValues(31, array('31_0' => $row[1]), ''); // Enregistrement de la valeur pour le champ 31 => Adresse
      $PolyObject->setValues(40, array('40_0' => $row[4]), ''); // Enregistrement de la valeur pour le champ 40 => Email
     
      if($PolyObject->writeToPersistence())// Enregistrement de l'élément $PolyObject
      {
         echo 'Enregistrement OK';
      }
      else
      {
         echo 'Enregistrement KO';
      }
   }
}


Haut
 Profil  
 
MessagePublié: Jeu Oct 13, 2011 11:17 am 
Hors-ligne

Inscrit(e) le : Ven Août 12, 2011 9:17 am
Message(s) : 55
Bonjour Sébastien et merci pour ta réponse,

je viens de tester, ça a effectivement fonctionné ! Mes éléments ont bien été créés. Par contre, ça a créé des entrées vides (je cherche toujours pourquoi), que j'ai rapidement supprimés.

Merci pour ton aide !


Haut
 Profil  
 
Afficher les messages publiés depuis :  Trier par  
Publier un nouveau sujet Répondre au sujet  [ 14 messages ] 

Le fuseau horaire est UTC [Heure d’été]


Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 12 invité(s)


Vous ne pouvez pas publier de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas insérer de pièces jointes dans ce forum

Recherche de:
Aller vers :  
cron
Powered by phpBB® Forum Software © phpBB Group
Traduit par Maël Soucaze et Elglobo © phpBB.fr