默认语言改为zh后,订单支付返回网站发送 order email 邮件报错:没有找到subject_zh.php

问题咨询 · PHPJAVAGOC · 于 6年前 发布 · 2532 次阅读

如下。。。 没找到这个文件

顺便我想问个问题,YII框架在一些配置更新以后,会去生成一些代码吗?。。。

共收到 5 条回复
Fecmall#16年前 0 个赞

说详细一点,那个appfront?吗?还是apphtml5,还是vue端?

把问题描述清楚了,一次到位描述清楚

把报错信息写全了,就截图搞了个头

Fecmall#26年前 0 个赞

发送邮件是在 @fecshop/service/email/Order.php

public function sendCreateEmail($orderInfo)
    {
        //获取订单的产品信息, 及修改相关信息
        $orderInfo['products'] = Yii::$service->order->item->getByOrderId($orderInfo['order_id']);
        $orderInfo['shipping_method_name'] = $orderInfo['shipping_method_en_name'].'/'.$orderInfo['shipping_method_ch_name'].'('.$orderInfo['shipping_method'].')';
        $orderInfo['payment_method'] = ucfirst($orderInfo['payment_method']);

        $toEmail = $orderInfo['customer_email'];
        if (Yii::$app->user->isGuest) {
            $emailThemeInfo = $this->emailTheme['guestCreate'];
        } else {
            $emailThemeInfo = $this->emailTheme['loginedCreate'];
        }
        if (isset($emailThemeInfo['enable']) && $emailThemeInfo['enable']) {
            $mailerConfigParam = '';
            if (isset($emailThemeInfo['mailerConfig']) && $emailThemeInfo['mailerConfig']) {
                $mailerConfigParam = $emailThemeInfo['mailerConfig'];
            }
            if (isset($emailThemeInfo['widget']) && $emailThemeInfo['widget']) {
                $widget = $emailThemeInfo['widget'];
            }
            if (isset($emailThemeInfo['viewPath']) && $emailThemeInfo['viewPath']) {
                $viewPath = $emailThemeInfo['viewPath'];
            }
            if ($widget && $viewPath) {
                list($subject, $htmlBody) = Yii::$service->email->getSubjectAndBody($widget, $viewPath, '', $orderInfo);
                $sendInfo = [
                    'to'        => $toEmail,
                    'subject'    => $subject,
                    'htmlBody' => $htmlBody,
                    'senderName'=> Yii::$service->store->currentStore,
                ];
                //var_dump($sendInfo);exit;
                Yii::$service->email->send($sendInfo, $mailerConfigParam);

                return true;
            }
        }
    }

然后你看代码:

list($subject, $htmlBody) = Yii::$service->email->getSubjectAndBody($widget, $viewPath, '', $orderInfo);

在@fecshop/service/Email.php中代码:

/**
     * @property  $widget | String,邮件模板中的动态数据的提供部分的class
     * @property  $viewPath | String,邮件模板中的显示数据的html部分。
     * @property  $langCode 当前的语言
     * @proeprty  $params 传递给 $widget 对应的class,用于将数据传递过去。
     * 根据提供的动态数据提供者$widget 和 view路径$viewPath,语言$langCode,以及其他参数$params(这个数组会设置到$widget对应的class的params变量中)
     * 最终得到邮件标题和邮件内容
     * 如果当前语言的邮件模板不存在,则使用默认语言的模板。
     * 关于函数参数的例子值,可以参看配置文件 @fecshop/config/services/Email.php
     */
    public function getSubjectAndBody($widget, $viewPath, $langCode = '', $params = [])
    {
        if (!$langCode) {
            $langCode = Yii::$service->store->currentLangCode;
        }
        if (!$langCode) {
            Yii::$service->helper->errors->add('langCode is empty');

            return;
        }
        $defaultLangCode = Yii::$service->fecshoplang->defaultLangCode;
        // 得到body部分的配置数组
        $bodyViewFile = $viewPath.'/body_'.$langCode.'.php';
        $bodyViewFilePath = Yii::getAlias($bodyViewFile);
        if (!file_exists($bodyViewFilePath)) { //如果当前语言的模板不存在,则使用默认语言的模板。
            $bodyViewFile = $viewPath.'/body_'.$defaultLangCode.'.php';
            $bodyViewFilePath = Yii::getAlias($bodyViewFile);
        }
        $bodyConfig = [
            'class' => $widget,
            'view'  => $bodyViewFilePath,
        ];
        if (!empty($params)) {
            $bodyConfig['params'] = $params;
        }
        // 得到subject部分的配置数组
        $subjectViewFile = $viewPath.'/subject_'.$langCode.'.php';
        $subjectViewFilePath = Yii::getAlias($subjectViewFile);
        if (!file_exists($subjectViewFilePath)) {
            $subjectViewFile = $viewPath.'/subject_'.$defaultLangCode.'.php';
            $subjectViewFilePath = Yii::getAlias($subjectViewFile);
        }

        $subjectConfig = [
            'class' => $widget,
            'view'  => $subjectViewFilePath,
        ];
        if (!empty($params)) {
            $subjectConfig['params'] = $params;
        }
        $emailSubject = $this->getHtmlContent($subjectConfig);
        $emailBody = $this->getHtmlContent($bodyConfig);

        return [$emailSubject, $emailBody];
        //$emailSubject = Yii::$service->page->widget->render($subjectConfigKey,$parentThis);
        //$emailBody = Yii::$service->page->widget->render($bodyConfigKey,$parentThis);
    }

在上面代码中找到这个部分:

$defaultLangCode = Yii::$service->fecshoplang->defaultLangCode;
        // 得到body部分的配置数组
        $bodyViewFile = $viewPath.'/body_'.$langCode.'.php';
        $bodyViewFilePath = Yii::getAlias($bodyViewFile);
        if (!file_exists($bodyViewFilePath)) { //如果当前语言的模板不存在,则使用默认语言的模板。
            $bodyViewFile = $viewPath.'/body_'.$defaultLangCode.'.php';
            $bodyViewFilePath = Yii::getAlias($bodyViewFile);
        }

你应该就看明白了,如果找不到文件,只有一种可能,你把网站的默认语言改成zh了,而不是默认的en。 fecshop里面只有en的邮件模板文件,其他语言的email找不到,就会找en的,现在你把默认语言改成了zh,那肯定会去找zh的邮件模板文件,找不到而报错

Fecmall#36年前 0 个赞

解决办法:

http://www.fecshop.com/doc/fecshop-guide/instructions/cn-1.0/guide-fecshop_email.html

这个文档,找到这里邮件模板配置介绍,以及邮件多语言原理

进行邮件重写,在本地建立邮件view文件,然后在配置中做指向。

如果你不想发送邮件,你可以直接在email services config中将配置

// 登录用户发送邮件的模板的设置。
                    'loginedCreate' => [
                        'enable' => true,
                        // 邮件内容的动态数据提供部分
                        'widget'        => 'fecshop\services\email\widgets\order\create\Body',
                        // 邮件内容的view部分
                        'viewPath'    => '@fecshop/services/email/views/order/create/logined',
                        // 如果不定义 mailerConfig,则会使用email service里面的默认配置
                        'mailerConfig'  => 'default',
                    ],

将其改成 'enable' => false 来关掉邮件的发送

PHPJAVAGOC#46年前 0 个赞

@Terry #3楼 哦 忘记了 在appfront

Fecmall#56年前 0 个赞

@PHPJAVAGOC #4楼 仔细看上面的留言,自己就会明白

添加回复 (需要登录)
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册
Your Site Analytics