Personnaliser son application

Nous allons maintenant personnaliser notre application.

Pour ce faire, nous allons saisir un jeu de données.

Saisie d’un jeu de donnée

Vous pouvez le faire avec les formulaires, l’incrémentation des séquences étant faite par le framework. Tout comme la création des tables stockant les séquences (méthode setId des objets metier).

Sinon exécutez la requête PostgreSQL suivante :

-- création des tables de séquence déjà faite

-- Selection du schéma

SET search_path TO openexemple;

-- insertion de deux émetteurs avec récupération et incrémentation de la table de séquences

INSERT INTO emetteur (emetteur, nom, prenom) VALUES
(nextval('emetteur_seq'), 'dupont', 'pierre'),
(nextval('emetteur_seq'), 'durant', 'jacques');

-- insertion de deux services avec récupération et incrémentation de la table de séquences

INSERT INTO service (service, libelle) VALUES
(nextval('service_seq'), 'informatique'),
(nextval('service_seq'), 'telephonie');

-- insertion de deux courriers avec récupération et incrémentation de la table de séquences

INSERT INTO courrier (courrier, dateenvoi, objetcourrier, lu, emetteur, service) VALUES
(nextval('courrier_seq'), '2010-12-01', 'Proposition de fourniture de service', false, 1, 1),
(nextval('courrier_seq'), '2010-12-02', 'Envoi de devis pour formation openMairie', true,  2, 1);

Faire un affichage courrier plus convivial

L’affichage des courriers se fait avec des libellés générés automatiquement.

Ainsi dans le fichier gen/sql/pgsql/courrier.inc.php (qui est inclus dans le fichier sql/pgsql/courrier.inc.php que vous pourrez modifier) vous avez la variable $champAffiche.

Vu que ce fichier a été créé par le générateur (et est en lecture seule) et vu que nous souhaitons modifier la variable (pour par exemple avoir le nom et le prénom de l’emetteur au lieu de simplement son nom) il nous faut ouvrir le fichier sql/pgsql/courrier.inc.php où nous allons (après l”include!) réaffecter à la variable $champAffiche la valeur suivante :

$champAffiche = array(
    'courrier.courrier as "'._("courrier").'"',
    'to_char(courrier.dateenvoi ,\'DD/MM/YYYY\') as "'._("dateenvoi").'"',
    'concat(emetteur.nom,\' \',emetteur.prenom) as "'._("emetteur").'"',
    'service.libelle as "'._("service").'"',
    'CASE lu WHEN true then \'Oui\' else \'Non\' END as "'.__("lu").'"',
);

Il est possible que l’opération vous soit refusée (seul www-data ayant les droits d’écriture).

Si tel est le cas échéant il faudra se rajouter les permissions.

Le résultat est le suivant :

Courrier Dateenvoi  Emetteur            Service       lu
    1       01/12/2010      dupont pierre   informatique  Oui
    2       02/12/2010      durant jacques  informatique  Non

De la même manière, toujours dans le même fichier, vous pouvez changer les options de la zone de recherche en réaffectant la variable $champRecherche. Actuellement on peut en plus de Tous faire une recherche sur courrier, emetteur et service.

C’est parce qu’à l’orgine, dans le fichier généré, $champRecherche avait été affectée comme telle :

$champRecherche = array(
'courrier.courrier as "'._("courrier").'"',
'emetteur.nom as "'._("emetteur").'"',
'service.libelle as "'._("service").'"',
);

Supprimez un ou plusieurs élément(s) du tableau et il disparaîtra de la zone de recherche. Par exemple…

$champRecherche = array(
'emetteur.nom as "'._("emetteur").'"',
);

…donnera :

../_images/utilisation_20.png

Nous souhaitons maintenant avoir les derniers courriers au début de la page affichée. Nous n’avons pas besoin d’aller réécrire la requête, il existe une variable texte comprenant l’instruction de tri. Réaffectez cette variable $tri dans votre courrier.inc.php de la manière suivante :

$tri= " order by dateenvoi desc";

Le résultat est le suivant :

../_images/utilisation_29.png

Pour en savoir plus sur ces variables voir framework/affichage.

Rendre obligatoire des champs

Nous avons affiché le courrier avec une jointure de type LEFT JOIN ce qui ne rend pas obligatoire la saisie de l’emetteur et du service (auquel le courrier est affecté).

Nous devons surcharger la méthode verifier().

Dans obj/courrier.class.php la méthode à insérer après le constructeur est celle-ci :

function verifier($val, &$db, $DEBUG) {
    parent::verifier($val, $db, $DEBUG);

    // Les champs service et emetteur sont obligatoires
    if ($this->valF['service'] == "") {
        $this->correct = false;
        $this->addToMessage(_('service')." ".__('obligatoire')." !");
    }
    if ($this->valF['emetteur'] == "") {
        $this->correct = false;
        $this->addToMessage(_('emetteur')." ".__('obligatoire')." !");
    }
}

Par défaut le premier champ (ici dateenvoi) est obligatoire, cette option est modifiable dans le générateur.

La commande parent::verifier($val,$db,$DEBUG); permet de ne pas neutraliser la fonction surchargée (ici dans gen/obj/courrier.class.php)

Pour plus d’informations voir framework/methode.

Valoriser un champ par défaut

Pour simplifier la saisie, nous souhaitons mettre la date du jour dans le champ dateenvoi lors d’un ajout de courrier.

Nous allons surcharger la methode setVal() dans obj/courrier.class.php de la manière suivante :

function setVal(&$form, $maj, $validation, &$db, $DEBUG=null) {
    parent::setVal($form, $maj, $validation, $db, $DEBUG=null);

    if ($validation==0) {
        if ($maj == 0) {
            $form->setVal("dateenvoi", date('Y-m-d'));
        }
    }
}

Le champ dateenvoi contiendra la date système (date(“Y_m-d”)) si la validation est égale à 0 (ce qui signifie que le formulaire n’a pas été validé) et si $maj est égal à 0 (ce qui signifie qu’il s’agit d’un ajout).

Les autres valeurs que peut prendre $maj sont :

  • 1 : modifier
  • 2 : supprimer
  • 3 : consulter

Mettre en majuscule un champ

Nous souhaitons maintenant mettre en majuscule le champ nom de la table emetteur.

Nous allons surcharger la méthode setOnchange() dans obj/emetteur.class.php de la manière suivante :

function setOnchange(&$form, $maj) {
    parent::setOnchange($form, $maj);

    $form->setOnchange("nom", "this.value=this.value.toUpperCase()");
}

A la saisie ou à la modification du nom, le champ se mettra en majuscule.

Mise en place d’action

Les actions permettent de déclencher des traitements, d’afficher une vue ou les deux.

Ces actions sont accessibles depuis les listings (ex : le + vert permettant d’ajouter un élément) ou dans un menu (portlet) au niveau du formulaire (ex : modifier et supprimer).

On va ajouter deux actions, dans les listings et les formulaires. La première servira à marquer un courrier comme lu et la deuxième comme non lu.

Ajout de l’action dans le formulaire

L’ajout de l’action dans les formulaires se fait via la méthode init_class_actions(). Cette méthode consiste à remplir un tableau avec une entrée dédiée pour chaque action.

Pour ajouter nos actions, nous allons surcharger la méthode init_class_actions() dans obj/courrier.class.php de la manière suivante :

function init_class_actions() {
    // On récupère les actions génériques définies dans la méthode
    // d'initialisation de la classe parente
    parent::init_class_actions();

    // ACTION - 005 - marquer comme lu
    $this->class_actions[5] = array(
        "portlet" => array(
            "type" => "action-direct",
            "libelle" => __("Marquer comme lu"),
            "class" => "arrow-right-16",
            "order" => 20,
            "description" => __("Marque un courrier comme lu."),
        ),
        "method" => "marquer_comme_lu",
        "button" => "supprimer",
        "permission_suffix" => "modifier"
    );

    // ACTION - 006 - marquer comme non lu
    $this->class_actions[6] = array(
        "portlet" => array(
            "type" => "action-direct",
            "libelle" => __("Marquer comme non lu"),
            "class" => "arrow-right-16",
            "order" => 21,
            "description" => __("Marque un courrier comme non lu."),
        ),
        "method" => "marquer_comme_non_lu",
        "button" => "supprimer",
        "permission_suffix" => "modifier"
    );
}

Nos deux actions sont maintenant définies et sont visible lorsque l’on consulte un courrier. Il ne reste plus qu’à ajouter les méthodes de traitement marquer_comme_lu et marquer_comme_non_lu paramétrées dans nos actions pour les rendre opérationnelle :

protected function marquer_comme_lu() {
    // Récupération du nom des champs de l'objet et des valeurs associées
    // à ces champs pour en faire un tableau associatif
    $val = array_combine($this->champs, $this->val);
    // Modification pour marquer le fichier comme lu
    $val['lu'] = true;
    // Mise à jour du courrier dans la base de données et vérifie si la
    // mise à jour à fonctionné pour informer l'utilisateur en conséquence
    if (! $this->modifier($val)) {
        $this->addToMessage(__('La modification du courrier à échoué.'));
        return false;
    }
    $this->addToMessage(__('Le courrier a été marqué comme lu.'));
    return true;
}

protected function marquer_comme_non_lu() {
    // Récupération du nom des champs de l'objet et des valeurs associées
    // à ces champs pour en faire un tableau associatif
    $val = array_combine($this->champs, $this->val);
    // Modification pour marquer le fichier comme non lu
    $val['lu'] = false;
    // Mise à jour du courrier dans la base de données et vérifie si la
    // mise à jour à fonctionné pour informer l'utilisateur en conséquence
    if (! $this->modifier($val)) {
        $this->addToMessage(__('La modification du courrier à échoué.'));
        return false;
    }
    $this->addToMessage(__('Le courrier a été marqué comme non lu.'));
    return true;
}

Vous pouvez maintenant consulter un courrier et cliquer sur les actions pour marquer le courrier comme lu ou non lu.

On va maintenant conditionner nos actions pour que seul les courriers lu puissent être marqué comme non lu et inversement.

Modifier le paramétrage des actions pour ajouter des conditions.

Condition pour l’action marquer comme lu :

"condition" => array('courrier_non_lu')

Condition pour l’action marquer comme non lu :

"condition" => array('courrier_lu')

Les conditions font appel à des méthodes qui renvoie des booléens. L’action est affichée uniquement si toutes les conditions définies sont vérifiées (toutes les méthodes renvoie true).

Ajouter les deux méthodes suivantes :

protected function courrier_non_lu() {
    return $this->getVal('lu') == 'f';
}

protected function courrier_lu() {
    return ! $this->courrier_non_lu();
}

Consulter un courrier et vérifier que les actions s’affichent correctement selon l’état du courrier.

Pour en savoir plus, la définition des actions est décrite ici : Définition des actions dans les attributs de la classe de l’objet

Ajout de l’action dans le listing

Pour éviter au futur utilisateur d’avoir à consulter un courrier et à cliquer sur les actions pour changer leur état, on va ajouter maintenant rendre nos actions accessible depuis le listing.

Dans sql/pgsql/courrier.inc.php ajouter le code suivant :

// Ajout d'actions supplémentaires - Afficher et masquer un consultation dans les éditions
$tab_actions['left']['marquer_comme_lu'] =
array('lien' => ''.OM_ROUTE_SOUSFORM.'&obj='.$obj.'&action=5&idx=',
      'id' => '&tri='.$tricolsf.'&objsf='.$obj.'&premiersf='.$premier.'&retourformulaire='.$retourformulaire.'&idxformulaire='.$idxformulaire.'&trisf='.$tricolsf.'&retour=tab',
      'lib' => "<span class=\"om-icon om-icon-16 om-icon-fix unwatch-16\" title=\"".__("Marquer comme lu")."\">".__("Marquer comme lu")."</span>",
      'type' => 'action-direct',
      'rights' => array('list' => array('courrier', 'courrier_modifier'), 'operator' => 'OR'),
      'ordre' => 15
);

$tab_actions['left']['marquer_comme_non_lu'] =
array('lien' => ''.OM_ROUTE_SOUSFORM.'&obj='.$obj.'&amp;action=6&amp;idx=',
      'id' => '&amp;tri='.$tricolsf.'&amp;objsf='.$obj.'&amp;premiersf='.$premier.'&amp;retourformulaire='.$retourformulaire.'&amp;idxformulaire='.$idxformulaire.'&amp;trisf='.$tricolsf.'&amp;retour=tab',
      'lib' => "<span class=\"om-icon om-icon-16 om-icon-fix watch-16\" title=\"".__("Marquer comme non lu")."\">".__("Marquer comme non lu")."</span>",
      'type' => 'action-direct',
      'rights' => array('list' => array('courrier', 'courrier_modifier'), 'operator' => 'OR'),
      'ordre' => 20
);

Modifier la feuille de style et rendre les pages dynamiques

Dans ce qui a été fait précedemment les deux actions sont visible en même temps dans le listing. On souhaite maintenant afficher l’action marquer comme lu si le courrier est non lu et inversement. Pour cela on va modifier la feuille de style afin de masquer l’action non voulu.

Ajouter dans app un répertoire js et y ajouter le fichier script.js.

Ajouter un script servant à récupérer la valeur de la colonne lu et à changer la classe de l’action.

Le code est le suivant :

function app_initialize_content(tinymce_load) {
    $('#tab-courrier tr.tab-data').each(function() {
        lu = $(this).find('td.lastcol a').text();
        if (lu === "Oui") {
            $(this).find('a[id^=action-tab-courrier-left-marquer_comme_lu]').addClass('display-none');
            $(this).find('a[id^=action-tab-courrier-left-marquer_comme_non_lu]').removeClass('display-none');
        } else {
            $(this).find('a[id^=action-tab-courrier-left-marquer_comme_non_lu]').addClass('display-none');
            $(this).find('a[id^=action-tab-courrier-left-marquer_comme_lu]').removeClass('display-none');
        }
    });
}

Ajouter dans app un répertoire css et y ajouter le fichier app.css.

Modifier la feuille de style pour ne pas afficher l’action qui n’a pas a être visible. Le code est le suivant :

.display-none {
display: none;
}

Principe à retenir

Voila quelques exemples des possibilités de modification dans les fichiers sql (répertoire sql/…) et dans les méthodes de l’objet (repertoire obj/…).

En aucun cas il ne faut modifier les fichiers dans gen/ qui est l’espace de travail propre au générateur.

Nous allons dans le prochain chapitre modifier la base et regénérer les écrans sans mettre en danger votre personnalisation.