⇧
Editer Ressource Composant - 31/05/2025 16:21:58
#DECLARE($objet : Object; $attribut : Text; $chemin : Text; $typeValeur : Integer)
// Lire / écrire une ressource application
// par principe la donnée est éditée dans un formulaire
// $objet = objet où lire / écrire, $attribut = nom propriété de $objet, $chemin = chemin dans la ressource du composant {, $4 type valeur}
var $ptr : Pointer
var $result : cs._Trace
var $fct : cs.xSDK.ResourceALV
$fct:=cs.xSDK.ResourceALV.me
$result:=cs._Trace.me.Initialiser(Current method name)
dataTexte:=""
dataEntierLong:=0
// la données est typée dans le fichier .xml : trouver son type
// pas trouvé la commande 4D pour lire le type dans les propriétés formulaire
If (Count parameters=3)
$typeValeur:=Is text // par défaut
End if
Case of
: ($typeValeur=Is text)
$fct.SetVariable(Est ressource MAIL; $chemin; Is text; ->dataTexte)
$ptr:=->dataTexte
: (($typeValeur=Is integer) | ($typeValeur=Is longint))
$fct.SetVariable(Est ressource MAIL; $chemin; Is longint; ->dataEntierLong)
$ptr:=->dataEntierLong
Else
$result.Error:=-3 // autre type
$result.ErrorDescription:="type de donnée non testé"
End case
Case of
: ($result.Error#0)
: ($objet=Null)
$result.Error:=-15086
$result.ErrorDescription:="$objet est nul"
: (Form event code=On Load)
$objet[$attribut]:=$ptr->
: (Form event code=On Data Change)
$ptr->:=$objet[$attribut]
$result.Error:=-16003*Num(Not($fct.SetResourceALV(Est ressource MAIL; $chemin; $ptr)))
End case
$result.LeverException([msgk_event; msgk_log])
⇧
initProcess - 09/02/2026 10:20:06
Capable de process préemptif
var ErrorNum : Integer
ErrorNum:=0
ON ERR CALL(Formula(traceHandler).source)
// init variables des méthodes renvoyant $0 typé (pour le mode interprété)
dataTexte:=""
dataEntierLong:=0
dataDate:=!00-00-00!
dataBooléen:=False
⇧
Bac à sable MAIL - 02/06/2025 12:40:31
var $o; $oo : Object
var $x; $y : Text
var $commande; $i; $j : Integer
var $bool : Boolean
initProcess
$bool:=True
$o:=New object
$oo:=New object
$commande:=4
//$bool:=Afficher Evenement ALV
//cs.$eMail.new().LireParametresSMTP($oo)
//$oo:=$o.wwwUtilisateurs.query("LogIn = :1";"auteur")
//$oo:=$o.wwwUtilisateurs.query("ID = :1";1000)
If ($commande ?? 0)
// ouvrir l'éditeur des traductions
cs.xSDK.TraductionsEditeur.new().ModifierTraductions()
End if
If ($commande ?? 1)
$o:=New object
$o.host:="ssl0.ovh.net" //Obligatoire
$o.port:=465
$o.user:="contact@ainsilavie.fr"
$o.password:="9PbbCtV4-alv"
$o.logFile:="LogTest.txt" // Historique étendu à sauvegarder dans le dossier Logs
$o:=SMTP New transporter($o)
End if
If ($commande ?? 2)
$oo:=New object
$oo.subject:="mon premier e-mail "
$oo.from:="contact@ainsilavie.fr"
$oo.to:=""
cs.$eMail.new().FixerAdresse($oo; "to")
$oo.textBody:="Hello World"
$oo.htmlBody:="<h1>Hello World</h1><h4>'Neque porro quisquam est qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit...'</h4>"+\
" <p>There are many variations of passages of Lorem Ipsum available."\
+"The generated Lorem Ipsum is therefore always free from repetition, injected humour, or non-characteristic words etc.</p>"
cs.$eMail.new().EnvoyerQuickMail($oo)
End if
⇧
traceHandler - 23/12/2024 09:40:05
Capable de process préemptif
cs._Trace.me.Intercepter()
⇧
COMPILER - 09/02/2026 10:19:58
//••••• gestion de erreurs •••••
// variables des méthodes renvoyant $0 typé
var dataTexte : Text
var dataEntierLong : Integer
var dataDate : Date
var dataBooléen : Boolean
⇧
[class]_composant - 06/02/2026 17:57:32
property trace : cs._Trace
Class constructor()
This.trace:=cs._Trace.me
Function InitVariablesMAIL()
// status
// bit 0 : exécution dans base hote
// bit 1 : est serveur Web
var $data : Object
Use (Storage)
Storage["System"]:=New shared object
End use
Use (Storage.System)
// sert, rapidement, dans initExtensions
Storage.System.Status:=0
// sert, en particulier, pour les process de type monitoring
Storage.System.ArrêtAPP:=False
Storage.System.estExecuteDansHote:=False
End use
// partager des ressources
$data:=New object
// fichier de ressources
$data.chemin:=Get 4D folder(Current resources folder)+"DataMAIL.xml"
// accès au worker du composant
$data.nomWorker:="WK_Composant_MAIL"
$data.méthodeWorker:="Installer eCourrier"
// mémoriser
cs.xSDK.ResourceALV.me.Inscrire(Est ressource MAIL; $data)
Function Installer()
Use (Storage.System)
Storage.System.estExécutéDansAPP:=cs.xSDK.EnvironnementALV.new().estExecuteDansAPP()
End use
This.IntegerDansHote()
Function IntegerDansHote()
// intégrer le composant dans la base hôte, pour les interfaces :
If (Storage.System.estExecuteDansHote)
// dans cette version rien à faire
cs._Trace.me.EnvoyerMessages([msgk_event; msgk_log]; "Démarrage"; "Installer Courrier"; "Intégration dans base hôte")
CALL WORKER("WK_Composant_MAIL"; Formula(initProcess); "[OK]")
End if
⇧
[class]$eMail - 02/06/2025 13:58:18
property rsc : cs.xSDK.ResourceALV
Class extends _composant
Class constructor()
Super()
This.rsc:=cs.xSDK.ResourceALV.me
Function EnvoyerQuickMail($data : Object)
var $hébergement; $identifiant; $MotDePasse; $attribut : Text
var $smtp; $email; $status : Object
var $transporter : 4D.SMTPTransporter
var $c : Collection
var $result : cs._Trace
This.trace.Initialiser(Current method name)
// information du serveur SMTP
$hébergement:=""
$identifiant:=""
$MotDePasse:=""
Case of
: (Asserted(This.rsc.SetVariable(Est ressource MAIL; "mail/adresseServeur"; Is text; ->$hébergement); "EnvoyerQuickMail : adresse mail serveur inconnue")=False)
: (Asserted(This.rsc.SetVariable(Est ressource MAIL; "mail/authentificationUtilisateur"; Is text; ->$identifiant); "EnvoyerQuickMail : user authentification inconnu")=False)
: (Asserted(This.rsc.SetVariable(Est ressource MAIL; "mail/authentificationMdP"; Is text; ->$MotDePasse); "EnvoyerQuickMail : mot de passe authentification inconnu")=False)
Else
// c'est ok
$smtp:=New object
$smtp.host:=$hébergement // Obligatoire
$smtp.port:=465
$smtp.user:=$identifiant
$smtp.password:=$MotDePasse
$smtp.logFile:="LogTest.txt" // Historique étendu à sauvegarder dans le dossier Logs
$transporter:=SMTP New transporter($smtp)
// tester la présence des infos
$email:=New object
$c:=New collection("from"; "to"; "subject"; "textBody"; "htmlBody")
This.trace.ErrorDescription:=""
For each ($attribut; $c)
If (OB Is defined($data; $attribut))
// recopier
$email[$attribut]:=$data[$attribut]
Else
// initialiser
$email[$attribut]:=""
This.trace.Error:=-16502
This.trace.ErrorDescription:=This.trace.ErrorDescription+"'"+$attribut+"'"+" est manquant - "
End if
End for each
This.FixerAdresse($email; "from")
This.FixerAdresse($email; "to")
// en principe on a tout
// on y va
$status:=$transporter.send($email)
This.trace.Error:=-16502*Num(Not($status.success))
This.trace.ErrorDescription:=$status.statusText
End case
This.trace.LeverException([msgk_event; msgk_log])
Function FixerAdresse($emailData : Object; $attribut : Text)
// fixer les adresses Mail de la propriété $attribut de $emailData
var $adresseEmail; $adresse; $identifiant : Text
var $result : cs._Trace
$result:=cs._Trace.me.Initialiser(Current method name)
Case of
: (Not(OB Is defined($emailData; $attribut)))
$result.Error:=-16501
$result.ErrorDescription:="la propriété $attribut de $emailData n'existe pas"
: (OB Get type($emailData; $attribut)=Is text)
// calculer l'adresse Mail
$adresse:=$emailData[$attribut]
Case of
// contact du serveur Web
: ($adresse="")
This.rsc.SetVariable(Est ressource MAIL; "mail/contactServeur"; Is text; ->$identifiant)
This.rsc.SetVariable(Est ressource MAIL; "mail/adresseMail"; Is text; ->$adresseEmail)
$adresseEmail:=$identifiant+"@"+$adresseEmail
// LogIn d'un UtilisateurALV
: (Position("@"; $adresse)=0)
// ajouter l'adresse hébergement
This.rsc.SetVariable(Est Ressource APP; "mail/adresseMail"; Is text; ->$adresseEmail)
$adresseEmail:=$adresse+"@"+$adresseEmail
Else
// recopier
$adresseEmail:=$adresse
End case
$emailData[$attribut]:=$adresseEmail
//: (OB Get type($emailData; $attribut)=Is object)
//If ($emailData.getDataClass().getInfo().name="")
//$result.ErrorDescription:="$emailData.$attribut n'est pas une entité de UtilisateursALV"
//Else
//// on a une entité, normalement de UtilisateursALV
//$adresseEmail:=$emailData[$attribut].Adresse_eMail
//// remplacer par l'adresse
//$emailData[$attribut]:=$adresseEmail
//$result.Error:=0
//End if
Else
$adresseEmail:=""
$result.ErrorDescription:="type de $emailData.$attribut non reconnu"
End case
$result.LeverException([msgk_event; msgk_log])
Function LireParametresSMTP($params : Object)
var $hébergement; $identifiant; $MotDePasse : Text
$hébergement:=""
$identifiant:=""
$MotDePasse:=""
Case of
: (Asserted(This.rsc.SetVariable(Est ressource MAIL; "mail/adresseServeur"; Is text; ->$hébergement); Current method name+" : adresse mail serveur inconnue")=False)
: (Asserted(This.rsc.SetVariable(Est ressource MAIL; "mail/authentificationUtilisateur"; Is text; ->$identifiant); Current method name+" : user authentification inconnu")=False)
: (Asserted(This.rsc.SetVariable(Est ressource MAIL; "mail/authentificationMdP"; Is text; ->$MotDePasse); Current method name+" : mot de passe authentification inconnu")=False)
Else
// c'est ok
$params.smtp:=New object
$params.smtp.host:=$hébergement // Obligatoire
$params.smtp.port:=465
$params.smtp.user:=$identifiant
$params.smtp.password:=$MotDePasse
End case
⇧
[class]_Trace - 30/12/2024 13:54:22
property cible : cs.xSDK.Traces
property success : Boolean
singleton Class constructor()
This.cible:=cs.xSDK.Traces.new()
This.success:=False
Function set Error($numError : Integer)
This.cible.Error:=$numError
Function get Error()->$result : Integer
$result:=This.cible.Error
Function set ErrorDescription($description : Text)
This.cible.ErrorDescription:=$description
Function get ErrorDescription()->$result : Text
$result:=This.cible.ErrorDescription
Function Intercepter()
ErrorNum:=This.cible.Intercepter("MAIL"; Error; Error method; Error line; Error formula)
Function Initialiser($nomMethode : Text)->$result : Object
This.cible.CréerErreur("MAIL"; 0; $nomMethode; "")
$result:=This
Function Créer($Error : Integer; $nomMethode : Text; $ErrorDescription : Text)->$result : Object
This.cible.CréerErreur("MAIL"; $Error; $nomMethode; $ErrorDescription)
$result:=This
Function FixerSuccess()
This.cible.FixerSuccess()
This.success:=This.cible.success
Function LeverException($options : Collection)
// renseigner le label de l'erreur
This.cible.ErrorLabel:=Localized string(String(This.cible.Error))
// lancer le traitement de l'erreur
This.cible.LeverException($options)
Function EnvoyerMessages($options : Collection; $libellé : Text; $source : Text; $description : Text)
This.cible.EnvoyerMessages($options; "MAIL"; $libellé; $source; $description)
⇧
[ ]SF_Messagerie - 03/02/2023 14:33:48
Pas de code
⇧
[ ]SF_Messagerie - objet ID connexion Messagerie - 07/12/2021 18:01:00
Editer Ressource Composant(Form; "IDconnexionMessagerie"; "mail/authentificationUtilisateur")
⇧
[ ]SF_Messagerie - objet adresseServeur - 03/02/2023 14:50:11
Editer Ressource Composant(Form; "adresseServeur"; "mail/adresseServeur")
⇧
[ ]SF_Messagerie - objet MdP connexion Messagerie - 07/12/2021 18:01:00
Editer Ressource Composant(Form; "MdPconnexionMessagerie"; "mail/authentificationMdP")
⇧
onStartup - 29/03/2025 17:19:43
// ************
// Status
// bit 8 : exécution du serveur Web
// ************
// ne s'exécute pas dans une base hôte
ON ERR CALL(Formula(traceHandler).source; ek global)
// pour les tests hors base hôte
cs._composant.new().InitVariablesMAIL()
// pour les tests hors base hôte
CALL WORKER("WK_Composant_MAIL"; "initProcess")
⇧
onExit - 01/04/2025 19:51:37
// ne s'exécute pas dans une base hôte
// exporter le code du composant si pas compilé
ON ERR CALL(Formula(traceHandler).source; ek local)
cs.xSDK.ExportCode4D.new().DémarrerComposant()
⇧
onHostDatabaseEvent - 06/02/2026 17:57:22
#DECLARE($numEvent : Integer)
Case of
: ($numEvent=On before host database startup)
ON ERR CALL(Formula(ErrorHandler).source; ek local)
cs._composant.new().InitVariablesMAIL()
Use (Storage.System)
Storage.System.estExecuteDansHote:=True
End use
// installer les ressources du composant
Partager Ressources("Installer Ressources Composant"; New object("dossier"; Get 4D folder(Current resources folder); "IDnom"; "MAIL"))
// déactiver les ASSERT si le composant est compilé (réactivable par les options d'appel du composant)
SET ASSERT ENABLED(Not(Is compiled mode))
CALL WORKER("WK_Composant_MAIL"; "initProcess")
: ($numEvent=On after host database startup)
// placer ici le code à exécuter après le "Sur ouverture" de la base hôte
// à faire ici (storage.ressourcesALV est initialisé)
ON ERR CALL(Formula(ErrorHandler).source; ek global)
cs._composant.new().Installer()
: ($numEvent=On before host database exit)
// placer ici le code à exécuter avant le "Sur fermeture" de la base hôte
: ($numEvent=On after host database exit)
// placer ici le code à exécuter après le "Sur fermeture" de la base hôte
End case