Bonjour,

J'ai un pb que je n'arrive pas à résoudre:
Je veux envoyer un mail aux abonnés à chaque fois qu'un nouveau post est enregistré en bdd.

    public function __construct($controller){
    $this->controller = $controller; 
}

public function input($name,$label,$options = array()){
    $error = false; 
    $classError = ''; 
    if(isset($this->errors[$name])){
        $error = $this->errors[$name];
        $classError = ' error'; 
    }
    if(!isset($this->controller->request->data->$name)){
        $value = ''; 
    }else{
        $value = $this->controller->request->data->$name; 
    }
    if($label == 'hidden'){
        return '<input type="hidden" name="'.$name.'" value="'.$value.'">'; 
    }
    $html = '<div class="clearfix'.$classError.'">
                <label for="input'.$name.'">'.$label.'</label>
                <div class="input">';
    $attr = ' '; 
    foreach($options as $k=>$v){ if($k!='type'){
        $attr .= ' $k=\"$v\"'; 
    }}
    if(!isset($options['type']) && !isset($options['options'])){
        $html .= '<input type="text" id="input'.$name.'" name="'.$name.'" value="'.$value.'"'.$attr.'>';
    }elseif(isset($options['options'])){
        $html .= '<select id="input'.$name.'" name="'.$name.'">';
        foreach($options['options'] as $k=>$v){
            $html .= '<option value="'.$k.'" '.($k==$value?'selected':'').'>'.$v.'</option>'; 
        }
        $html .= '</select>'; 
    }elseif($options['type'] == 'textarea'){
        $html .= '<textarea id="input'.$name.'" name="'.$name.'"'.$attr.'>'.$value.'</textarea>';
    }elseif($options['type'] == 'checkbox'){
        $html .= '<input type="hidden" name="'.$name.'" value="0"><input type="checkbox" name="'.$name.'" value="1" '.(empty($value)?'':'checked').'>'; 
    }elseif($options['type'] == 'file'){
        $html .= '<input type="file" class="input-file" id="input'.$name.'" name="'.$name.'"'.$attr.'>';
    }elseif($options['type'] == 'password'){
        $html .= '<input type="password" id="input'.$name.'" name="'.$name.'" value="'.$value.'"'.$attr.'>';
    }
    if($error){
        $html .= '<span class="help-inline">'.$error.'</span>';
    }
    $html .= '</div></div>';
    return $html; 
}

}
**********************************************************************************************
 <div class="container" style="margin-top: -5rem; z-index: 4; padding-left: 12rem;">
         <h1>Ajouter un article</h1>
        </div>
       <div class="container" >
            <form action="<?php echo Router::url('admin/posts/edit/'.$id); ?>" method="post" onsubmit="return confirm('Envoyer un mail de nouveau message ?');">
                <div class="container" style="margin: 2rem 0rem 0rem 15rem">
                  <?php echo $this->Form->input('name','Titre'); ?>
                  <?php echo $this->Form->input('slug','Url'); ?>
              </div>
              <div class="container" style="margin:  0rem 0rem 0rem -5rem">
                  <?php echo $this->Form->input('category_id','Catégorie',array('options' => $categories)); ?>
                    <?php echo $this->Form->input('created','Date de création',array('class'=>'datepicker')); ?>
                  <?php echo $this->Form->input('online','En ligne',array('type'=>'checkbox')); ?>
                  <?php echo $this->Form->input('id','hidden'); ?>
              </div>
                <div class="container" style="margin: -7.25rem 0rem 0rem 15rem">
                <?php echo $this->Form->input('img','adresse de la photo'); ?>
                  <?php echo $this->Form->input('content','Contenu',array('type'=>'textarea','rows'=>15, 'col' =>15)); ?></div>

              <div class="actions" style="margin: 0rem 0rem 10rem 35rem">
                    <input type="submit" class="btn primary" value="Envoyer">

------------------------------//---------------------------------------

require_once CORE.DS.'db.php';
$req = $pdo->prepare('SELECT email FROM users'); //recupération de la base de donnée
$req->execute();
while ($mail = $req->fetch(PDO::FETCH_ASSOC)){  // je récupère les adresses mail

*-*-*-* création du mail

mail($mail,$sujet,$message,$header);
}

Tel quel, ça envoie un email dès l'ouverture de la page. Je souhaite moi que le mail soit envoyé quand le post est validé.
J'ai donc tenté un IF du genre

    if($_POST['submit'] === "envoyer"){
    */*/envoyer le mail*/*/*/
    }

mais le pb est que quand je donne le nom à l'input, le message n'est plus enregistré en bdd.

<input type="submit" name="submit" class="btn primary" value="Envoyer">

Quelqu'un saurait pourquoi ? avez vous une solution plus logique pour ce que je veux faire ?

merci.

7 réponses


Bonsoir.

Je veux envoyer un mail aux abonnés à chaque fois qu'un nouveau post est enregistré en bdd.
Tel quel, ça envoie un email dès l'ouverture de la page. Je souhaite moi que le mail soit envoyé quand le post est validé.

Où se situe le code qui permet d'envoyer les mails ?
Car s'il n'est pas situé après le code qui permet de sauvegarder les données en BDD, c'est que tu as un problème de logique.

En même temps tu mets :

if($_POST['submit'] === "envoyer"){

Et dans ton HTML tu as :

<input type="submit" class="btn primary" value="Envoyer">

Mais d'envoyer un mail si un formulaire est envoyé de base c'est pas logique. Car si il y a des erreurs avec une condition comme celle-là, le mail sera envoyé quand même, même si rien n'est entré en BDD.

JoHuv
Auteur

Bonjour,
Le code pour envoyé les mails est à la fin.

Le problème principal est que je souhaite trouver une condition correcte pour envoyer ce mail une fois que c'est en bdd. Peut-etre suis-je depuis trop longtemps dessus, mais tout ce que j'essaie de faire tombe à l'eau par manque d'expérience et de logique surement. Du coup, j'ai même essayé de nommer l'input mais ce dernier ne fonctionne plus . J'arrive dans une impasse où j'ai besoin d'être conseillé.

Le code pour envoyé les mails est à la fin.

Si tu réponds à motié à ma question, on ne va pas avancer.
À la fin de quoi ?

Le problème principal est que je souhaite trouver une condition correcte pour envoyer ce mail une fois que c'est en bdd.

Comme je l'ai dit dans mon message précédent, il suffit que tu mettes le code après la sauvegarde des données en BDD :

  1. Vérification si des données sont postées via le formulaire
  2. Validation des données, si ok étape 3
  3. Sauvegarde des données en BDD
  4. Récupération des emails des abonnés depuis la BDD
  5. Envoi des mails

Ce n'est pas plus compliqué que ça.

JoHuv
Auteur

Bonjour Lartak,

Désolé, en effet, je ne suis pas clair.

Voici ma page admin_edit:

 <!DOCTYPE html>
<html lang="fr">
<head>
[...]
</head>
<body>
<div class='container' style="background-color: rgba(242,242,242,1); opacity: 1; margin-top: -28rem; width:105%; height: 44rem; z-index:2">     </div>
<div class="container" style=" margin-top: -40rem; z-index: 4; padding-left: 10rem;">
<img src="http://localhost:8080/sitefamille/webroot/img/retour.gif" alt="précédent" onclick="javascript:history.back()" style="margin-          left:-8rem; margin-top:-5rem; width:4%; height:auto;"> 

 <div class="container" style="margin-top: -5rem; z-index: 4; padding-left: 12rem;">
     <h1>Ajouter un article</h1>
 </div>
    <div class="container" >
            <form action="<?php echo Router::url('admin/posts/edit/'.$id); ?>" method="post">
                <div class="container" style="margin: 2rem 0rem 0rem 15rem">
                  <?php echo $this->Form->input('name','Titre'); ?>
                  <?php echo $this->Form->input('slug','Url'); ?>
              </div>
              <div class="container" style="margin:  0rem 0rem 0rem -5rem">
                  <?php echo $this->Form->input('category_id','Catégorie',array('options' => $categories)); ?>
                    <?php echo $this->Form->input('created','Date de création',array('class'=>'datepicker')); ?>
                  <?php echo $this->Form->input('online','En ligne',array('type'=>'checkbox')); ?>
                  <?php echo $this->Form->input('id','hidden'); ?>
              </div>
                <div class="container" style="margin: -7.25rem 0rem 0rem 15rem">
                <?php echo $this->Form->input('img','adresse de la photo'); ?>
                  <?php echo $this->Form->input('content','Contenu',array('type'=>'textarea','rows'=>15, 'col' =>15)); ?></div>

              <div class="actions" style="margin: 0rem 0rem 10rem 35rem">
                    <input type="submit" class="btn primary" value="Envoyer">      
              </div> 
            </form>

 <?php require_once CORE.DS.'db.php';
$req = $pdo->prepare('SELECT email FROM users'); //recupération de la base de donnée
$req->execute();
while ($mail = $req->fetch(PDO::FETCH_ASSOC)){

$mail = $mail['email'];
                [..] création du mail qui fonctionne
mail($mail,$sujet,$message,$header);

       ?>       

        </div>
    </div>
</div>
<? php } ?>
  </script>
</body>

Voilà pourquoi je disais que l'envoie du mail était à la fin.

Je dois partir demain en déplacement, je reprendrais à la rentrée et vérifierais point par point la procédure. Merci de l'aide apportée.

Tu dois bien avoir un code qui traite ton formulaire et qui sauvegarde les données en BDD et c'est à cet endroit là que tu dois mettre ton code pour récupérer les emails et envoyer les mails.

JoHuv
Auteur

HA ! ok, autant pour moi, je m'en occupe dès que je rentre de déplacement et je fais part de la suite. Merci beaucoup !