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

Link to comment
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,

...

Link to comment
Share on other sites

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)
Link to comment
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.

Link to comment
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 

Link to comment
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
×
×
  • Create New...