web-dev-qa-db-fra.com

Un rappel d'action peut-il empêcher le parent de poursuivre l'exécution?

Je travaille sur un plug-in qui interagit avec Gravity Forms et, dans certaines conditions, je souhaite empêcher la suppression d'un formulaire. Voici la méthode dans Gravity Forms qui gère la suppression d'un formulaire:

public static function delete_form($form_id){
    global $wpdb;

    if(!GFCommon::current_user_can_any("gravityforms_delete_forms"))
        die(__("You don't have adequate permission to delete forms.", "gravityforms"));

    do_action("gform_before_delete_form", $form_id);

    $form_meta_table = self::get_meta_table_name();
    $form_table = self::get_form_table_name();

    //Deleting form Entries
    self::delete_leads_by_form($form_id);

    //Delete form meta
    $sql = $wpdb->prepare("DELETE FROM $form_meta_table WHERE form_id=%d", $form_id);
    $wpdb->query($sql);

    //Deleting form Views
    self::delete_views($form_id);

    //Delete form
    $sql = $wpdb->prepare("DELETE FROM $form_table WHERE id=%d", $form_id);
    $wpdb->query($sql);

    do_action("gform_after_delete_form", $form_id);
}

Est-il possible de se connecter à gform_before_delete_form et ensuite de faire quelque chose pour que delete_form () retourne à ce point sans continuer? par exemple.,

public function preventGravityFormDeletion()
{
    if( $someCondition )
    {
        // do something that forces delete_form() to stop
    }
}
add_action( 'gform_before_delete_form', array( $this, 'preventGravityFormDeletion' ) );

Je sais que je pourrais appeler wp_die() et tout arrêter, mais ce n'est pas très élégant. Y a-t-il un meilleur moyen? Cela ne semble pas possible à cause des limitations de la portée, mais je voulais vérifier s'il y a une certaine magie WP/PHP dont je ne suis pas au courant.

6
Ian Dunn

Réponse courte: non.

Réponse longue: aussi non. Les actions ne fonctionnent pas de cette façon.

Modifier:

Pour élaborer et rendre votre question totalement générique:

function foo() {
  bar();
  return 1;
}

function bar() {
  // stuff
}

Vous ne pouvez rien ajouter qui empêche un appel de foo() de renvoyer 1, mis à part l'arrêt complet de l'exécution du script avec die ou exit.

Remarque: Le fait de lancer des exceptions ne sera d'aucun secours, car cela aura le même effet que d'interrompre l'exécution du script, à moins qu'un appelant précédent ne capture l'exception.

Maintenant, si cette fonction est quelque part dans une classe, vous pouvez alors en définir une sous-classe et remplacer cette fonction par une autre, puis l'utiliser éventuellement, modifiant ainsi le fonctionnement de cette fonction. C’est à peu près tout ce que vous pouvez faire de mieux, car PHP ne contient aucun mécanisme de programmation orienté aspect qui vous permettrait de modifier le comportement de la fonction au moment de l’exécution.

4
Otto

Une solution créative consisterait à modifier le numéro de formulaire actuel dans la base de données lors de gform_before_delete_form afin qu'aucune des actions précédentes ne modifie le formulaire.

Ensuite, vous pouvez vous connecter à gform_after_delete_form et modifier le form_id.

gform_before_delete_form

form_id = form_id + 1000000

gform_after_delete_form

form_id = form_id - 1000000 

(en supposant que vous avez moins d'un million de formulaires!)

code approximatif:

public function preventGravityFormDeletion()
{
if( $someCondition )
    {
    global $wpdb;
    $temp_form_id = 1000000+$form_id;
    $sql = $wpdb->prepare("UPDATE $form_meta_table SET form_id = $temp_form_id WHERE form_id=$form_id");
    $wpdb->query($sql);
    $sql = $wpdb->prepare("UPDATE $form_table SET id = $temp_form_id WHERE id=$form_id");
    $wpdb->query($sql);
    }
}
add_action( 'gform_before_delete_form', array( $this, 'preventGravityFormDeletion' ) );
5
Jamie