13.6.3.36 Doc::setAttributeValue()

Modifie la valeur d'un attribut de document.

13.6.3.36.1 Description

void setAttributeValue ( string $attributeIdentifier,
                          mixed $value )

Modifie la valeur d'un attribut de l'objet Document. La modification n'est pas enregistrée en base de données.

13.6.3.36.1.1 Avertissements

Pour enregistrer la modification , il est nécessaire d'appeler la méthode Doc::store().

Les résultats fournis par la méthode Doc::getRawValue() ne peuvent pas être utilisés directement par cette méthode.

Les espaces et certains caractères invisibles en début et fin de valeur sont supprimés. La fonction trim est utilisée pour réaliser cette suppression.

13.6.3.36.2 Liste des paramètres

(string) attributeIdentifier
Identifiant de l'attribut à modifier.
(mixed) value

Nouvelle valeur typée. Le type de la valeur est fonction du type de l'attribut (voir les types en fonction de la valeur).

Il est possible d'affecter aussi les attributs de type array avec un tableau à 2 dimensions. La première dimension est l'index de la rangée, la deuxième dimension est l'identifiant de l'attribut.

13.6.3.36.3 Valeur de retour

Void.

13.6.3.36.4 Erreurs / Exceptions

Retourne une exception de type \Dcp\Exception dans les cas suivants :

  • L'attribut n'existe pas;
  • Le type attribut ne peut recevoir de valeur (frame, tab, menu)

Retourne une exception de type \Dcp\AttributeValue\Exception dans les cas suivants :

  • La valeur est incompatible avec le type d'attribut;
  • Une valeur scalaire est donnée pour un attribut multiple.

13.6.3.36.5 Historique

Aucun.

13.6.3.36.6 Exemples

Calcul de la somme des attributs my_numberone et my_numbertwo et enregistrement dans l'attribut my_sum.

Mise à jour de l'attribut my_mail avec l'adresse courriel du rédacteur.

Soit la famille suivante :

BEGIN Ma famille MYFAMILY
CLASS My\MyFamily
// idattr idframe label T A type ord vis phpfunc
ATTR MY_IDENTIFICATION Identification N N frame 10 W
ATTR MY_NUMBERONE MY_IDENTIFICATION nombre 1 Y N int 20 W
ATTR MY_NUMBERTWO MY_IDENTIFICATION nombre 2 N N int 30 W
ATTR MY_REDACTOR MY_IDENTIFICATION rédacteur N N account 30 W
ATTR MY_MAIL MY_IDENTIFICATION Adresse courriel N N text 10 R
ATTR MY_SUM MY_IDENTIFICATION nombre 1+2 N N int 30 R
END

13.6.3.36.6.1 Mise à jour d'attribut après modification du document

Avec la classe :

namespace My;
use \Dcp\AttributeIdentifiers\MyFamily as MyAttributes;
use \Dcp\AttributeIdentifiers\Iuser as Aiuser;
 
class MyFamily extends \Dcp\Family\Document
{
    /**
     * Mise à jour de l'attribut `my_sum` 
     */
    protected function setMySum()
    {
        $n1 = $this->getAttributeValue(MyAttributes::my_numberone);
        $n2 = $this->getAttributeValue(MyAttributes::my_numbertwo);
        $this->setAttributeValue(MyAttributes::my_sum, ($n1 + $n2));
    }
    /**
     * Mise à jour de l'attribut `my_mail` avec l'adresse courriel du rédacteur
     */
    protected function setMyMail()
    {
        $redacId = $this->getAttributeValue(MyAttributes::my_redactor);
        if ($redacId === null) {
            $this->clearValue(MyAttributes::my_mail);
        } else {
            $redacDoc=new_doc($this->dbaccess,$redacId );
            if ($redacDoc->isAlive()) {
                $this->setAttributeValue(MyAttributes::my_mail, $redacDoc->getAttributeValue(AIuser::us_mail));
            } else {
                $this->clearValue(MyAttributes::my_mail);
            }
        }
    }
    public function postStore()
    {
        $err = parent::postStore();
        if (empty($err)) {
                $this->setMySum();
                $this->setMyMail();
        }
        return $err;
    }
}

13.6.3.36.6.2 Exemple avec traitement des exceptions

Calcul de la prochaine échéance dans 7 jours après la dernière modification.

Avec la classe :

namespace My;
use \Dcp\AttributeIdentifiers\MyFamily as MyAttributes;
use \Dcp\AttributeIdentifiers\Iuser as Aiuser;
 
class MyFamily extends \Dcp\Family\Document
{
    /**
     * Prochaine échéance dans 7 jours
     */
    protected function setNextDate()
    {
        $d = new \DateTime('now');
        $d->modify('+7 day');
        $this->setAttributeValue(MyAttributes::my_nextdate, $d);
    }
    public function postStore()
    {
        $err = parent::postStore();
        if (empty($err)) {
            try {
                $this->setNextDate();
            } catch (\Dcp\AttributeValue\Exception $e) {
                $err = sprintf("Valeur erronée %s", $e->getDcpMessage());
            } catch (\Dcp\Exception $e) {
                $err = sprintf("Erreur d'attribut %s", $e->getDcpMessage());
            }
        }
        return $err;
    }
}

13.6.3.36.6.3 Exemple d'affectation de tableau

Soit les familles suivantes :

BEGIN Ma famille MYFAMILY
CLASS My\MyFamily
DFLDID auto
ICON classe.png
// idattr idframe label T A type ord vis
ATTR MY_IDENTIFICATION Identification N N frame 10 W
ATTR MY_REDACTOR MY_IDENTIFICATION Rédacteur N N account 50 W
ATTR MY_MAIL MY_IDENTIFICATION Mail N N text 60 R
ATTR MY_REF MY_IDENTIFICATION référence N N text 70 W
ATTR MY_T_PARTNER MY_IDENTIFICATION Participants N N array 80 W
ATTR MY_COAUTHORS MY_T_PARTNER Co-auteurs N N account 90 W
ATTR MY_COMAIL MY_T_PARTNER Adresse mail N N text 110 W
END
BEGIN Contact MYCONTACT
// idattr idframe label T A type ord vis need link phpfunc ... option
ATTR MY_FR_IDENT État civil N N frame W
ATTR MY_NAME MY_FR_IDENT nom Y N text 30 W Y
ATTR MY_FNAME MY_FR_IDENT prénom Y N text 35 W Y
ATTR MY_MAIL MY_FR_IDENT mail N Y text 40 W mailto:%MY_MAIL%
ATTR MY_ISPARTNER MY_FR_IDENT Partenaire ? N Y enum 45 W no|Pas partenaire, yes|Partenaire system=yes
END

La méthode setMyPartners va rechercher tous les contacts partenaire et va les insérer dans le tableau my_t_partner en renseignant l'identifiant et l'adresse mail de chaque partenaire.

namespace My;
use \Dcp\AttributeIdentifiers\MyFamily as MyAttributes;
use \Dcp\AttributeIdentifiers\MyContact as AMyContact;
 
class MyFamily extends \Dcp\Family\Document
{
    protected function setMyPartners()
    {
        // Recherche des partenaires
        $s = new \SearchDoc($this->dbaccess, \Dcp\Family\Mycontact::familyName);
        $s->setObjectReturn(true);
        $s->addFilter("%s = 'yes'", AMyContact::my_ispartner);
        $dl = $s->search()->getDocumentList();
 
        // On affecte le tableau à 2 dimensions de valeurs
        $partners=array();
        /** @var \Dcp\Family\MyContact $contact */
        foreach ($dl as $contact) {
            $partners[] = array(
                MyAttributes::my_coauthors => $contact->id,
                MyAttributes::my_comail => $contact->getAttributeValue(AMyContact::my_mail));
        }
        $this->setAttributeValue(MyAttributes::my_t_partner, $partners);
    }
 
    public function postStore()
    {
        $this->setMyPartners();
    }
}

13.6.3.36.7 Notes

Pour les attributs de type "numérique" et les types "date", plusieurs types de valeurs sont autorisés.

type valeur autorisé
int (int) 3 OK
int (string)"3" OK
int (float) 3.0 KO
int (string)"a" KO
double (float) 3.0 OK
double (int) 3 OK
double (string) "3.0" OK
double (string)"a" KO
date (DateTime) "2012-03-16" OK
date (string) "2012-03-16" OK
date (string) "2012-03" KO
date (string) "16/03/2012" OK (dépendant de la locale)
timestamp (DateTime) "2012-03-16" OK
timestamp (DateTime) "2012-03-16 12:54:34" OK
timestamp (string) "2012-03-16 12:54:34" OK
timestamp (string) "2012-03-16T12:54:34" OK

13.6.3.36.8 Voir aussi

×