Jump to content

Warning: array_reduce() expects parameter 1 to be array, string given


Recommended Posts

 

Bonjour,

je suis sur la création d'un module qui a pour but d'envoyer un mail à une adresse email. 2 types de mails peuvent être envoyé soit un AR soit la facture. j'ai une table avec l'email de compta et l'email a qui je dois envoyé l'ar. Mais je bloque avant car je mets mon email en brut histoire de tester. 

"Possible de retrouver des erreurs de code"

voici le rendu du tpl. 

image.png.6e92650ef0c5477b08037629f4f90b00.png

 

Ma fonction qui est censé envoyer un mail

 public function send_mail1($id_order,$typeMail){
        $order = new Order($id_order);
        $customer = new Customer((int)$order->id_customer);
        $id_customer=((int)$order->id_customer);
        $templateVars = array(
            '{firstname}' => $customer->firstname,
            '{lastname}' => $customer->lastname,
            '{id_order}' => $order->id,
            '{order_name}' => $order->getUniqReference(),
        );
        $id_lang = $order->id_lang;
        $id_lang = 0 ;
        if ($typeMail == "AR") {
            $subject = $this->l('Accusé de réception pour la commande');
            $template_name = 'mail_ar';
            $mail = Db::getInstance()->getValue('SELECT email_ar FROM`' . _DB_PREFIX_ .'jv_mail` where id_customer = '. (int)$id_customer);
            $mail1 = "[email protected]";
            
            $file_attachment=null ;
        }
        if ($typeMail == "Compta") {
            $subject = $this->l('Facture de la commande');
            $template_name = 'mail_compta';
            $mail = Db::getInstance()->getValue('SELECT email_compta FROM`' . _DB_PREFIX_ .'jv_mail` where id_customer = '. (int)$id_customer);
            $mail1 = "[email protected]";
            //$file_attachment['content'] = file_get_contents(_PS_ROOT_DIR_.'/pdf/ar.pdf'); //Chemin du fichier
            $file_attachment=null ;
        }
       
        Mail::Send(
            $id_lang,
            $template_name,
            $subject,
            $templateVars,
            $mail1,//mail du destinataire
            null,
            null,
            null,
            null,
            null,
            dirname(__FILE__) . '/mails/'
        );
    }

 

Mon js 

 

     $('button.submitSendMail').unbind('click').click(function(e) { 
            e.preventDefault(); 
            //var email =$('#emailComptable').val();
            //alert(email);
            var typeMail =  document.querySelector('input[name=typeMail]:checked').value;

            //alert(typeMail);
            query = 'ajax=1&token='+token+'&action=envoi&id_customer='+id_customer+'&typeMail='+typeMail+'&id_order='+id_order+'&';
            $.ajax({ 
                type:'POST', //Methode POST
                url: "../modules/jv_mails/ajax_jv_mails.php", 
                cache: false, 
                dataType: 'json', 
                data : query, 
                success: function(data) 
                { 
                    if (data.result) 
                    { 
                        console.log('ok'); 
                    } 
                    else     
                        jAlert(data.error); 
                } 
            }); 
            return false; 
        }); 

et mon fichier ajax_mon_module 


if (Tools::getValue('action') == 'envoi')
{
  //$id_customer = Tools::getValue('id_customer');
  $typeMail = Tools::getValue('typeMail');
  $id_order=Tools::getValue('id_order');
  $j->send_mail1($id_order,$typeMail);
  
}

et l'erreur en question 

image.png.2e83102413195b3c99a75ef32faabbcd.png

Merci pour tout aide d'avance

Je suis sous prestashop 1.7.6.9

Share this post


Link to post
Share on other sites

Vous avez quelque chose qui est hooké sur actionEmailSendBefore et qui ne renvoie pas un tableau...

 

        $hookBeforeEmailResult = Hook::exec(
            'actionEmailSendBefore',
            [
                'idLang' => &$idLang,
                'template' => &$template,
                'subject' => &$subject,
                'templateVars' => &$templateVars,
                'to' => &$to,
                'toName' => &$toName,
                'from' => &$from,
                'fromName' => &$fromName,
                'fileAttachment' => &$fileAttachment,
                'mode_smtp' => &$mode_smtp,
                'templatePath' => &$templatePath,
                'die' => &$die,
                'idShop' => &$idShop,
                'bcc' => &$bcc,
                'replyTo' => &$replyTo,
            ],
            null,
            true
        );

        if ($hookBeforeEmailResult === null) {
            $keepGoing = false;
        } else {
            $keepGoing = array_reduce(
                $hookBeforeEmailResult,
                function ($carry, $item) {
                    return ($item === false) ? false : $carry;
                },
                true
            );
        }

$keepGoing = array_reduce(
                $hookBeforeEmailResult,

...

Share this post


Link to post
Share on other sites

Posted (edited)
13 minutes ago, Eolia said:

Vous avez quelque chose qui est hooké sur actionEmailSendBefore et qui ne renvoie pas un tableau...

 

        $hookBeforeEmailResult = Hook::exec(
            'actionEmailSendBefore',
            [
                'idLang' => &$idLang,
                'template' => &$template,
                'subject' => &$subject,
                'templateVars' => &$templateVars,
                'to' => &$to,
                'toName' => &$toName,
                'from' => &$from,
                'fromName' => &$fromName,
                'fileAttachment' => &$fileAttachment,
                'mode_smtp' => &$mode_smtp,
                'templatePath' => &$templatePath,
                'die' => &$die,
                'idShop' => &$idShop,
                'bcc' => &$bcc,
                'replyTo' => &$replyTo,
            ],
            null,
            true
        );

        if ($hookBeforeEmailResult === null) {
            $keepGoing = false;
        } else {
            $keepGoing = array_reduce(
                $hookBeforeEmailResult,
                function ($carry, $item) {
                    return ($item === false) ? false : $carry;
                },
                true
            );
        }

$keepGoing = array_reduce(
                $hookBeforeEmailResult,

...

Merci de ta réponse @Eolia pourtant je ne fais pas appel au hook actionEmailSendBefore..

 

image.png.78ed987bfb2507c63c6c8a79e37e7f2b.png

 

Donc si je comprends bien je dois rajouter ce hook et ce code avant de faire appel a send_mail1 (ma fonction)? 

Edited by Bllidz (see edit history)

Share this post


Link to post
Share on other sites

9 minutes ago, Eolia said:

Ben regardez dans Modules -> positions lequel est hooké dessus

justement je viens de vérifier et les seuls hooks greffé sont bien ceux que j'ai sélectionné..  

Share this post


Link to post
Share on other sites

1 minute ago, Eolia said:

Allo? La terre ?

Je vous parle d'un autre module qui serait greffé sur ce hook, pas du votre.

Ah, j'avais mal compris... 

Et aucun n'est gréffé sur ce hook.. 

image.thumb.png.e1ab8441f53911157ba22955e35e1841.png

Share this post


Link to post
Share on other sites

Whaaah.... ces 1.7 m'étonneront toujours^^

Perso je remplacerait la ligne de Mail.php

        if ($hookBeforeEmailResult === null) {

par

        if ($hookBeforeEmailResult === null || !is_array($hookBeforeEmailResult)) {

Pour régler le problème.

Share this post


Link to post
Share on other sites

1 hour ago, Eolia said:

Whaaah.... ces 1.7 m'étonneront toujours^^

Perso je remplacerait la ligne de Mail.php

        if ($hookBeforeEmailResult === null) {

par

        if ($hookBeforeEmailResult === null || !is_array($hookBeforeEmailResult)) {

Pour régler le problème.

L'erreur a disparu je vais tester ça du coup. Merci de ton aide 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More