Mise A jour equipement => modifier le nom et logical id

Bonjour à tous,

Je dois mettre à jour les équipements covidAttest du plugin éponyme.

Pour plus de cohérence, je modifie dans le presave de l’équipement une commande avec :

un logicalid = « logicID_ini » et un nom « nom logicID_ini »

vers

un logicalid = « logicID_new » et un nom « nom logicID_new »

lo logical id se met bien à jour, mais pas le nom.

le script est tel que (dans la fonction presave) pour une commande et une info :

 // modif des commandes déjà renseignée
      // modif sport animaux => animaux
      $motifType = $this->getCmd(null, 'motif_SPORT_ANIMAUX');
		if (is_object($motifType)) {
			$motifType->setLogicalId('motif_ANIMAUX');
			$motifType->setName(__('motif ANIMAUX', __FILE__));
          	$motifType->save();
		}
      //commande motif sport animaux => animaux
       $motif = $this->getCmd(null, 'send_motif_SPORT_ANIMAUX');
		if (is_object($motif)) {
			$motif->setLogicalId('send_motif_ANIMAUX');
			$motif->setName(__('Envoi motif ANIMAUX', __FILE__));
          	$motif->setEqLogic_id($this->getId());
          	$motif->save();
		}

j’ai l’impression que le setName n’est pas pris en compte.

Comment faire du coup? ou foire-je?

[Edit]

et quand j’insère un :
log::add('CovidAttest', 'debug', '------ rename motif SPORT ANIMAUX to '.$motifType->getName());

je retrouve bien dans le log :


[2021-03-20 17:29:31][DEBUG] : ------ rename motif SPORT ANIMAUX to motif ANIMAUX
[2021-03-20 17:29:31][DEBUG] : ------ rename send motif SPORT ANIMAUX to motif ANIMAUX

mais j’ai toujours d’affiché SPORT_ANIMAUX…

[Note Soluce]
POur ma problématique, il est plus judicieux de passer par le script d’update de l’équipement.
pour modifier une configuration de commande lors de la sauvegarde de l’équipement , voir la réponse : Mise A jour equipement => modifier le nom et logical id - #16 par Bben

bizarre ton histoire …

je parts de cette config :

image

j’execute en scenario, quasi copier/coller de ton code

$eqLogic = eqLogic::byId(1504);
if (is_object($eqLogic)) {
  $scenario->setLog("eqLogic : " .$eqLogic->getName() );
  $motifType = $eqLogic->getCmd(null, 'motif_SPORT_ANIMAUX');
  if (is_object($motifType)) {
    $scenario->setLog("on a une cmd // id : " . $motifType->getId() ) ;
    $motifType->setLogicalId('motif_ANIMAUX');
	$motifType->setName(__('motif ANIMAUX', __FILE__));
    $motifType->save();
  }
  else{
    $scenario->setLog("pas de cmd...");
  }
}
else{
  $scenario->setLog("pas de eqLogic...");
}

la log me donne

------------------------------------
[2021-03-20 17:45:13][SCENARIO] Start : Scenario lance manuellement.
[2021-03-20 17:45:13][SCENARIO] Exécution du sous-élément de type [action] : code
[2021-03-20 17:45:13][SCENARIO] Exécution d'un bloc code
[2021-03-20 17:45:13][SCENARIO] eqLogic : Test
[2021-03-20 17:45:13][SCENARIO] on a une cmd // id : 1824
[2021-03-20 17:45:13][SCENARIO] Fin correcte du scénario

et en résultat :
image

M**** alors

Je reproduis totalement, dans uns scénario, ça fonctionne, mais dans la classe… pas moyen de modifier, je dois faire un truc alakon dans la suite du code

tu ré-écrases pas dans le postSave !?

même pas, je viens de test en ne laissant que çça ds le présave, et rien dans le post…

Tu es dans la fonction preSave(), l’équipement sera donc sauvegardé à la suite. Il faut enlever tes $motifType->save(); à mon avis

je vais test !merci salvuiaf,*

mais quan je log getName dans le postSave, tout est en ordre.

[Edit] nop, sans le save, je me retrouve avec la création de la commande dans le postsave

Faudrait voir les 2 (preSave et postSave), à priori le postSave change ce qui est écrit en preSave… Pourquoi ne pas tout faire en postSave ?

j’ai essayé de le mettre en post save, même combat.

Le truc, c’est que le log en fin du post save avec le getName me donne bien le nom modifié…?!

[Edit] j’ai test de passé le paramètre à true du save ($_direct) qui a priori est utilisé pour la mise en DB, aucune idée de l’impact,
mais pas mieux.

Merci pour la relocalisation des post sur le Sujet!

Alors résolu en mettant les modif dans le script d’install => à la mise à jour du plugin ça modifie les noms, mais je n’ai pas pu le faire dans les équipements directement :

function CovidAttest_update() {
	
  // [ les truc sfait avant]


 log::add('CovidAttest','debug','=============  mise à jour des equipements suite à update plugin =============');


 foreach (eqLogic::byType('CovidAttest', true) as $eqLogic) {
	log::add('CovidAttest','debug', 'mise à jour de '.$eqLogic->getHumanName());
		// modif des commandes déjà renseignée
		// modif sport animaux => animaux
		$motifType = $eqLogic->getCmd(null, 'motif_SPORT_ANIMAUX');
		if (is_object($motifType)) {
			$motifType->setName(__('motif ANIMAUX', __FILE__));
			$motifType->setLogicalId('motif_ANIMAUX');
			
			log::add('CovidAttest', 'debug', '------ rename motif SPORT ANIMAUX from'.$eqLogic->getHumanName().' to '.$motifType->getName()); 
			$motifType->save(true);
		}else{
			log::add('CovidAttest', 'debug', '------ motif SPORT ANIMAUX not found in '.$eqLogic->getHumanName());

		}
	//commande motif sport animaux => animaux
	$motif = $eqLogic->getCmd(null, 'send_motif_SPORT_ANIMAUX');
		if (is_object($motif)) {
			$motif->setName(__('Envoi motif ANIMAUX', __FILE__));
			$motif->setLogicalId('send_motif_ANIMAUX');
			
			log::add('CovidAttest', 'debug', '------ rename send motif SPORT ANIMAUX from'.$eqLogic->getHumanName().' to '.$motifType->getName()); 
			//$motif->setEqLogic_id($this->getId());
			$motif->save(true);
		}else{
			log::add('CovidAttest', 'debug', '------ send motif SPORT ANIMAUX not found in '.$eqLogic->getHumanName());

		}
		$eqLogic->save();
 }
}

je laisse ouvert un peu voir si quelqu’un à l’explication du pourquoi.

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.

Merci Salviaf pour la réouverture!

Pour apporter de l’eau au moulin de la reflexion,
y’a un truc chelou dans le workflow de sauvegarde de l’equipement .

Pour rappel je cherche à modifier le nom d’une commande sur un logicalId spécifique d’un équipement par :

$motifType = $this->getCmd(null, 'motif_ANIMAUX');
      log::add("CovidAttest", 'debug', __FUNCTION__.' - test nom motif : '.$motifType->getName());
		if (is_object($motifType)) {
			$motifType->setName(__('motif ANIMAUX2', __FILE__));	
			log::add('CovidAttest', 'debug', '------ rename motif ANIMAUX from'.$this->getHumanName().' to '.$motifType->getName()); 
			$motifType->save(true);  
		}else{
			log::add('CovidAttest', 'debug', '------ motif ANIMAUX not found in '.$this->getHumanName());
		}

j’ai essayé de mettre dans pré/post save/update de l’équipement.

pour l’exemple, j’ai loggé le nom dans chacune de ces fonctions par :


$motif = $this->getCmd(null, 'motif_ANIMAUX');
       log::add("CovidAttest", 'debug', __FUNCTION__.' - test nom motif : '.$motif->getName());

j’ai override la fonction save de la commande qui etend CMD :


public function save($_direct = false) {
     	parent::save($_direct);
      
      if($this->getLogicalId()=='motif_ANIMAUX'){
        	log::add("CovidAttest", 'debug', __FUNCTION__.' COMMANDE - test nom motif : '.$this->getName());
      }

a noter que je n’ai rien mis dans ces méthode autre que les logs et le setName.

je me retrouve avec le log :

[2021-03-24 14:12:21][DEBUG] : preSave - test nom motif : motif ANIMAUX
[2021-03-24 14:12:21][DEBUG] : ------ rename motif ANIMAUX from[test][Attest_test] to motif ANIMAUX2
[2021-03-24 14:12:21][DEBUG] : save COMMANDE - test nom motif : motif ANIMAUX2
[2021-03-24 14:12:21][DEBUG] : preUpdate - test nom motif : motif ANIMAUX2
[2021-03-24 14:12:21][DEBUG] : postUpdate - test nom motif : motif ANIMAUX2
[2021-03-24 14:12:21][DEBUG] : postSave - test nom motif : motif ANIMAUX2
[2021-03-24 14:12:21][DEBUG] : save COMMANDE - test nom motif : motif ANIMAUX

Donc l’enchaienement est :

  1. presave equipement : motif nom initial
  2. presave equip : modif du nom
  3. fct save de la commande => sur nouveau nom
  4. preupdate equip. : nouveaux nom ok
  5. postupdate : nouveaux nom ok
  6. postsave : nouveaux nom ok
  7. => une nouvelle sauvegarde de la commande (et non de l’équipement) avec l’ancien nom est lancé APRES le postSave de l’équipement !!! d’ou est ce que ça sort???

Mon hypothèse est que je suis sur la page de l’équipement avec le champs du formulaire renseigné avec la valeur courante, et que la soumission du formulaire intervient je ne sais comment au reload de la page?? [edit] si je met encore un troisième nom dans le champs de la commande, je me retrouve en étape « 7 » avec ce nouveau nom [/edit]

=> comment outrepasser la soumission du formulaire qui intervient même après le postsave…?

au pifomètre, je dirais que ça téléscope le pb de @hugoKs3 dans Update command dans postSave equipement

1 « J'aime »

Je ne comprend pas vos interrogations: si vous êtes sur la page équipement et faite un save, l’équipement entier, commandes comprises, est envoyé et sauvé (heureusement sinon on ne peut pas modifier les commandes depuis l’interface)
Le save n’est pas différent entre le premier tab (équipement) et le deuxième (commandes).
Lors de cet appel, l’équipement et toutes ses commandes sont sauvé, d’abord l’eqlogic et ensuite les cmds

Donc si vous modifiez et sauvez les commandes dans le pre/postsave de l’équipement, le save de la commande viendra après (si elle existe déjà dans la liste des commandes)

Regardez le code de core\ajax\eqLogic.ajax.php, init('action') == 'save' (autour de la ligne 427)

1 « J'aime »

Bonjou rMips,
Merci pour les info, je vais aller jeter un oeil sur l’ajax.

Je m’attendais à ce que le save de l’équipement encapsule le save des commandes.

Donc pour conclure, pour modifier une commande/valeur de configuration il faut que je créer la commande postSave dans la classe qui etend CMD.

Je test et reviens vous dire quoi.

1 « J'aime »

Dans ma classe de commande qui étend cmd, j’ai implémenter une méthode preSave qui execute la modification souhaitée :

class CovidAttestCmd extends cmd {
// execute masqué ici

  public function preSave(){

     if($this->getLogicalId()=='motif_ANIMAUX'){
        	log::add("CovidAttest", 'debug', __FUNCTION__.' COMMANDE - test nom motif : '.$this->getName());
      		$this->setName(__('motif ANIMAUX2', __FILE__));
       log::add('CovidAttest', 'debug', '------ rename motif ANIMAUX from'.$this->getHumanName().' to '.$this->getName());
      }
  }
  
}

fonctionne parfaitement,
et effectivement, le nom de la commande ne sera jamais modifibale par l’utilsateur

1 « J'aime »

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.