Bonjour,
J'utilise Cakephp 2.4.5 et je fais un traitement lié à un outil de ticketing.
J'ai une fonction dans mon controlleur qui me permet de faire une action automatiquement.
Personnelement je trouve que ce n'est pas optimisé et de plus quand il y a beaucoup de ticket à traiter la page met énormement de temps à s'afficher.
Ma volonté est de permettre un meilleur traitement mais aussi un meilleur rendu utilisateur mais à forc e de regarder le code je vois pas comment faire.
Voici le code de ma fontion présent dans mon controlleur :
public function omico(){
$phase2 = $nbPhase2 = array();
require_once Configure::read('appVendor') . "rt-queries.php";
$ticket = rtQuery("Status = 'new' AND Queue = '34' AND Subject LIKE 'phase' AND Requestor.EmailAddress = 'root@bouh.gsi.giprecia.net'", "id,subject,lastupdated", "id");
$nbTicket = count($ticket);
$this->loadModel('Omico');
$conditions = array('Omico.created >' => date('Y-m-d'));
$lastOmico = $this->Omico->find('all',array('conditions'=>$conditions));
$nbLastOmico = count($lastOmico);
$cacheOmico = Cache::read('Execution', 'ExecuteOmico');
if (!empty($this->request->data)) {
if (!$cacheOmico) {
$cacheOmico = $this->request->data;
Cache::write('Execution', $cacheOmico, 'ExecuteOmico');
}
if ($nbTicket > 0) {
foreach ($ticket as $key => $value) {
$subject = explode("-", $value['Subject']);
preg_match("^\[(.*?)\]^",$subject[0],$fields);
$rne = $fields[1];
if ($subject[1] == " Phase 2 effectuée AVEC rejets") {
$phase2['rejets'][$key]['id'] = $value['id'];
$phase2['rejets'][$key]['Requestors'] = rtPerson($rne);
$phase2['rejets'][$key]['Etablissement'] = $rne;
$phase2['rejets'][$key]['Type'] = "TPNP";
$phase2['rejets'][$key]['Queue'] = "6";
}
if ($subject[1] == " Phase 2 effectuée AVEC erreurs") {
$phase2['erreurs'][$key]['id'] = $value['id'];
$phase2['erreurs'][$key]['Requestors'] = rtPerson($rne);
$phase2['erreurs'][$key]['Etablissement'] = $rne;
$phase2['erreurs'][$key]['Type'] = "TPNP";
$phase2['erreurs'][$key]['Queue'] = "6";
}
if ($subject[1] == " Phase 2 interrompue") {
$phase2['interrompue'][$key]['id'] = $value['id'];
$phase2['interrompue'][$key]['Requestors'] = rtPerson($rne);
$phase2['interrompue'][$key]['Etablissement'] = $rne;
$phase2['interrompue'][$key]['Type'] = "TPNP";
$phase2['interrompue'][$key]['Queue'] = "6";
}
if ($subject[1] == " Phase 2 effectuée sans erreur \o/") {
$phase2['ok'][$key]['id'] = $value['id'];
$phase2['ok'][$key]['Requestors'] = rtPerson($rne);
$phase2['ok'][$key]['Etablissement'] = $rne;
$phase2['ok'][$key]['Type'] = "TPNP";
$phase2['ok'][$key]['Queue'] = "6";
}
}
$nbPhase2['rejets']['total'] = (array_key_exists("rejets", $phase2)) ? count($phase2['rejets']) : 0;
$nbPhase2['erreurs']['total'] = (array_key_exists("erreurs", $phase2)) ? count($phase2['erreurs']) : 0;
$nbPhase2['interrompue']['total'] = (array_key_exists("interrompue", $phase2)) ? count($phase2['interrompue']) : 0;
$nbPhase2['ok']['total'] = (array_key_exists("ok", $phase2)) ? count($phase2['ok']) : 0;
if ($nbPhase2['rejets']['total'] > 0) {
foreach ($phase2['rejets'] as $key => $value) {
if (!is_null($value['Requestors'])) {
$editTicketrejets = rtTicket("edit", $value);
if ($editTicketrejets) {
$nbPhase2['rejets']['traitements_ok'][] = $value['id'];
}else{
$nbPhase2['rejets']['traitements_ko'][] = $value['id'];
}
}else{
$nbPhase2['rejets']['demandeurs_ko'][] = $value['id'];
}
}
}
if ($nbPhase2['erreurs']['total'] > 0) {
foreach ($phase2['erreurs'] as $key => $value) {
if (!is_null($value['Requestors'])) {
$editTicketerreurs = rtTicket("edit", $value);
if ($editTicketerreurs) {
$nbPhase2['erreurs']['traitements_ok'][] = $value['id'];
}else{
$nbPhase2['erreurs']['traitements_ko'][] = $value['id'];
}
}else{
$nbPhase2['erreurs']['demandeurs_ko'][] = $value['id'];
}
}
}
if ($nbPhase2['interrompue']['total'] > 0) {
foreach ($phase2['interrompue'] as $key => $value) {
if (!is_null($value['Requestors'])) {
$editTicketinterrompue = rtTicket("edit", $value);
if ($editTicketinterrompue) {
$nbPhase2['interrompue']['traitements_ok'][] = $value['id'];
}else{
$nbPhase2['interrompue']['traitements_ko'][] = $value['id'];
}
}else{
$nbPhase2['interrompue']['demandeurs_ko'][] = $value['id'];
}
}
}
if ($nbPhase2['ok']['total'] > 0) {
foreach ($phase2['ok'] as $key => $value) {
if (!is_null($value['Requestors'])) {
$editTicketok = rtTicket("edit", $value);
if ($editTicketok) {
$nbPhase2['ok']['traitements_ok'][] = $value['id'];
}else{
$nbPhase2['ok']['traitements_ko'][] = $value['id'];
}
}else{
$nbPhase2['ok']['demandeurs_ko'][] = $value['id'];
}
}
}
$this->loadModel('Omico');
$data = array(
'Omico' => array(
'rejets_total' => $nbPhase2['rejets']['total'],
'rejets_traitements_ok' => (isset($nbPhase2['rejets']['traitements_ok'])) ? serialize($nbPhase2['rejets']['traitements_ok']) : 0,
'rejets_traitements_ko' => (isset($nbPhase2['rejets']['traitements_ko'])) ? serialize($nbPhase2['rejets']['traitements_ko']) : 0,
'rejets_demandeurs_ko' => (isset($nbPhase2['rejets']['demandeurs_ko'])) ? serialize($nbPhase2['rejets']['demandeurs_ko']) : 0,
'erreurs_total' => $nbPhase2['erreurs']['total'],
'erreurs_traitements_ok' => (isset($nbPhase2['erreurs']['traitements_ok'])) ? serialize($nbPhase2['erreurs']['traitements_ok']) : 0,
'erreurs_traitements_ko' => (isset($nbPhase2['erreurs']['traitements_ko'])) ? serialize($nbPhase2['erreurs']['traitements_ko']) : 0,
'erreurs_demandeurs_ko' => (isset($nbPhase2['erreurs']['demandeurs_ko'])) ? serialize($nbPhase2['erreurs']['demandeurs_ko']) : 0,
'interrompue_total' => $nbPhase2['interrompue']['total'],
'interrompue_traitements_ok' => (isset($nbPhase2['interrompue']['traitements_ok'])) ? serialize($nbPhase2['interrompue']['traitements_ok']) : 0,
'interrompue_traitements_ko' => (isset($nbPhase2['interrompue']['traitements_ko'])) ? serialize($nbPhase2['interrompue']['traitements_ko']) : 0,
'interrompue_demandeurs_ko' => (isset($nbPhase2['interrompue']['demandeurs_ko'])) ? serialize($nbPhase2['interrompue']['demandeurs_ko']) : 0,
'ok_total' => $nbPhase2['ok']['total'],
'ok_traitements_ok' => (isset($nbPhase2['ok']['traitements_ok'])) ? serialize($nbPhase2['ok']['traitements_ok']) : 0,
'ok_traitements_ko' => (isset($nbPhase2['ok']['traitements_ko'])) ? serialize($nbPhase2['ok']['traitements_ko']) : 0,
'ok_demandeurs_ko' => (isset($nbPhase2['ok']['demandeurs_ko'])) ? serialize($nbPhase2['ok']['demandeurs_ko']) : 0,
'users' => $this->Auth->user('username')
)
);
if ($this->Omico->save($data)) {
$this->Session->setFlash("Le rapport d'execution a bien été sauvegardé","alert", array(
'plugin' => 'BoostCake',
'class' => 'alert-success autoclose'
));
return $this->redirect($this->referer());
}else {
$this->Session->setFlash("Le rapport d'execution n'a pas été sauvegardé","alert", array(
'plugin' => 'BoostCake',
'class' => 'alert-danger autoclose'
));
}
}else{
$this->Session->setFlash('Pas de Traitement à faire',"alert", array(
'plugin' => 'BoostCake',
'class' => 'alert-danger autoclose'
));
}
}
$this->set(compact('nbTicket','lastOmico','nbLastOmico','cacheOmico'));
}
}
Dans un premier temps, je pensais passer par de l'ajax mais je me dit qu'il faut que j'améliore avant.
Ce code est juste fonctionnel mais n'est clairement pas optimiser et vous coment feriez vous pour ameliorer tous ça ?
Beaucoup, beaucoup trop de code pour une action, Tu devrais essayer de séparer ce code dans une classe dédiée
C'est vrai que tu l'as bien gratinée ton action.
Au passage, pourquoi est-ce que tu charges deux fois le même model ?
Je ne pense pas qu'il soit perdu dès que tu fais une requête.
Effectivement j'avais pas vu que je charge deux fois le model. Je suis d'accord avec vous, mais il faut que j'arrive à comprendre comment mettre ça dans une class et quel traitement faire en sachant que le code est dependant de l'outil de ticketing.
Vous auriez un exemple de comment je peux organiser cette class ?
Créer differentes méthodes qui te permettraient de gérer les differents traitements, ce sera déjà plus lisible.
Il y a beaucooup, beaucoup, beaucoup de répétitions, tu peux concrètement automatiser tout ça, avec des boucles etc.. ^^
Par exemple:
Le traitement des phases => méthode
Le traitement des données => méthode
Les répétitions de codes => méthode
J'ai réécrit ton code chez moi (j'avais du temps à perdre ce matin), viteufé, je l'ai pas testé mais il est vrai qu'il est plus lisible et plus compréhensible avec ces "instructions". ^^
Je pourrai te passer le code, si tu n'y arrives vrmt pas (faudra le tester) mais le but c'est que tu le fasses par toi même sinon c'est pas marrant :p