Fecmall

第 2 位会员

会员
个人信息
  • 加入于 2017-05-31 17:38:45
  • 城市 Qingdao
  • GitHub https://github.com/fecshop
  • 最后登录时间 11天前
  • 签名 净化自己,潜心编码
个人简介
Terry,Fecmall开源产品作者,12年电商经验一线程序员开发者,擅长规划产品,架构设计。
个人成就
  • 发表文章次数 744
  • 发布回复次数 5760
  • 个人主页浏览次数 683
对于fecshop的js和css部分,有个地方不理解7年前

@zhuzhi1 #16楼 最不喜欢给你这种类型的人回答问题,自己不去了解,不去看,说的这么明白,还是吧是吧是吧

后面在跟个,好吧好吧。

这么懒,就不要玩fecshop了。不适合

对于fecshop的js和css部分,有个地方不理解7年前

@zhuzhi1 #13楼

appserver 入口 只有api , 全接口

已经说的很清楚了,自己了解,别继续问这些说的很明白的问题。

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

解决办法:

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 来关掉邮件的发送

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

发送邮件是在 @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的邮件模板文件,找不到而报错

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

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

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

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

php curl:带证书https方式的curl请求,以及需要cookie存储和读取的请求7年前

主要是需要添加:

$cookie_file = Yii::getAlias('@common')."/lib/xxx.com/cookie_file.txt";
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);    //存cookie的文件名,
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);

我们的脚本,第一次请求是获取token,因此,在获取token前先通过上面的方法,先刷一下cookie到文件, 然后,整个脚本后面的访问请求,就把存cookie的这行代码去掉,

curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);    //存cookie的文件名,

只保留读取cookie的部分即可。

$cookie_file = Yii::getAlias('@common')."/lib/xxx.com/cookie_file.txt";
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file);
对于fecshop的js和css部分,有个地方不理解7年前

@zhuzhi1 #9楼 appfront端针对的是pc,apphtml5端针对的是wap类型,appserver针对的是vue,手机app这类前后端彻底分离的类型。

对于fecshop的js和css部分,有个地方不理解7年前

@zhuzhi1 #9楼 VUE之类的吧?那你不应该看appfront,你应该看appserver

对于前后端分离,fecshop只提供api,你看一下这里把:

http://www.fecshop.com/doc/fecshop-guide/develop/cn-1.0/guide-fecshop-server.html

vue demo:http://demo.fancyecommerce.com/#/

对于fecshop的js和css部分,有个地方不理解7年前

@zhuzhi1 #5楼 你说的是cdn之类的吧?

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

这一块已经更新了,新版本就加上这个,通过配置的方式搞定就OK了

对于fecshop的js和css部分,有个地方不理解7年前

fecshop的js 和css 的重写,也是基于这个完成的:

http://www.fecshop.com/doc/fecshop-guide/develop/cn-1.0/guide-fecshop-js-css.html

如果感觉费劲,前期可以先模仿用起来,然后在追究原理。

<?php $this->registerJs($this->blocks['owl_fecshop_slider'],\yii\web\View::POS_END);

这种方式,可以灵活的处理js的位置

另外对于特种浏览器加载js也有支持,譬如:https://github.com/fecshop/yii2_fecshop/blob/master/app/appfront/theme/base/front/layouts/home.php

$jsOptions = [
	# js config 1
	[
		'options' => [
			'position' =>  'POS_END',
		//	'condition'=> 'lt IE 9',  去掉注释后,这个js部分只有ie小于9的才会加载的js文件
		],
		'js'	=>[
			'js/jquery-3.0.0.min.js',
			'js/jquery.lazyload.min.js',
			'js/owl.carousel.min.js',
			'js/js.js',
		],
	],
];

另外对于你下载了一些库包,js在vendor下面的库包里,你如果引用进来了? 你就可以用这种方式加载进来,然后第一次访问,就会发布到web路径下面,你可以看到链接

<script src="/assets/7428250b/js/jquery-3.0.0.min.js?v=1">

到这里你会有疑问,对于开发环境,我肯定希望每次都把这些js css img文件复制到web路径下,尤其是做模板的时候可以方便的调试,但是对于线上生产环境,我肯定希望每次访问不需要去复制这些文件,因为每次都发布文件到web路径有开销,下面解答这个问题:

打开文件: https://github.com/fecshop/yii2_fecshop_app_advanced/blob/master/appfront/config/main.php

你会看到

 'assetManager' => [
            'forceCopy' => true,
        ],

开发环境:设置为true,每次访问,都会强制copy jscss文件到web路径

线上环境:设置为false,每次访问,不会强制复制。这样不会影响速度

你又会有问题,如果线上我更新了js css文件怎么办?

答:当更新了css和js文件,您需要去@app/web/assets/下面清空里面所有文件和文件夹即可。

对于fecshop的js和css部分,有个地方不理解7年前

@zhuzhi1 #3楼 昨晚用手机回复的,回复的不完整,下面完整回答一下:

1.为了浏览器快速加载页面,我们一般需要把js放到页面的底部,譬如,你打开fecshop: https://fecshop.appfront.fancyecommerce.com/ ,查看源代码,你会发现在源代码的底部:

<script src="/assets/7428250b/js/jquery-3.0.0.min.js?v=1"></script>
<script src="/assets/7428250b/js/jquery.lazyload.min.js?v=1"></script>
<script src="/assets/7428250b/js/owl.carousel.min.js?v=1"></script>
<script src="/assets/7428250b/js/js.js?v=1"></script>
<script type="text/javascript">  
$(document).ready(function(){
	$("#owl-fecshop").owlCarousel({
		navigation : true,
		slideSpeed : 300,
		paginationSpeed : 400,
		singleItem : true,
		autoPlay:3000,
		lazyLoad:true
      // "singleItem:true" is a shortcut for:
      // items : 1, 
      // itemsDesktop : false,
      // itemsDesktopSmall : false,
      // itemsTablet: false,
      // itemsMobile : false
	});
	
	$("#owl-best-seller").owlCarousel({
		items : 4,
		lazyLoad : true,
		navigation : true,
		scrollPerPage : true,
		pagination:false,
		itemsCustom : false,
        slideSpeed : 900
	});
	$("#owl-featured").owlCarousel({
		items : 4,
		lazyLoad : true,
		navigation : true,
		scrollPerPage : true,
		pagination:false,
		itemsCustom : false,
        slideSpeed : 900
	});
});
</script>

你会发现除了加载的js文件,还有一些页面的js内容(在view文件中直接写的js代码)

这种方式会更好的浏览器加载。

2.这种方式怎么实现的呢?

首先,我们一般吧js放到页面的顶部head,然后在view中写js,也就是js文件在 <div class="content"></div> , 但是,你看fecshop的js,是紧贴</body>的位置,也就是在body部分的最后位置,这个得益于yii2的asset ,当在view文件中写js代码,譬如: https://github.com/fecshop/yii2_fecshop/blob/master/app/appfront/theme/base/front/cms/home/index.php

在这个文件得底部,你会发现js部分:


<script>
<?php $this->beginBlock('owl_fecshop_slider') ?>  
$(document).ready(function(){
	$("#owl-fecshop").owlCarousel({
		navigation : true,
		slideSpeed : 300,
		paginationSpeed : 400,
		singleItem : true,
		autoPlay:3000,
		lazyLoad:true
      // "singleItem:true" is a shortcut for:
      // items : 1, 
      // itemsDesktop : false,
      // itemsDesktopSmall : false,
      // itemsTablet: false,
      // itemsMobile : false
	});
	
	$("#owl-best-seller").owlCarousel({
		items : 4,
		lazyLoad : true,
		navigation : true,
		scrollPerPage : true,
		pagination:false,
		itemsCustom : false,
        slideSpeed : 900
	});
	$("#owl-featured").owlCarousel({
		items : 4,
		lazyLoad : true,
		navigation : true,
		scrollPerPage : true,
		pagination:false,
		itemsCustom : false,
        slideSpeed : 900
	});
});
<?php $this->endBlock(); ?>  
</script>  
<?php $this->registerJs($this->blocks['owl_fecshop_slider'],\yii\web\View::POS_END);//将编写的js代码注册到页面底部 ?>

但是源代码中,你发现js并没有在<div class="main container"></div>的后面,而是在页面的最底部 ,这就是上面的代码<?php $this->registerJs($this->blocks['owl_fecshop_slider'],\yii\web\View::POS_END);//将编写的js代码注册到页面底部 ?> 来完成的。

对于fecshop的js和css部分,有个地方不理解7年前

如果不这样,vendor库包里的css js,如何发布到web路径下,这是基于yii的asset发布的方式

对于fecshop的js和css部分,有个地方不理解7年前

1.css文件一般放到文件的前面,js文件一般放到页面的最后

2.js css是在库包文件里面,然后通过asset发布到web路径下,对于一个产品而言,只能通过这样

3.强烈建议用系统的方式,因为页面中也有一些js,而fecshop为了更快的加载,吧jquery的加载放到最后,因此,view content部分js的加载,也是用的yii的内置函数

fecshop的js css的重写也是基于上面完成的

4最后,只想说,先搞明白事情,在想办法偷懒,别搞混先后主次,多学习好的思想,别总搞一些自以为是的东西

后台订单物流功能7年前

没有这个

产品图片上传少生成了一个小图标7年前

@PHPJAVAGOC #6楼 你修改一下appimage 下面的文件权限试试

chmod 777 -R appimage
apphtml5这个如何使用中文语言,我设置的comm和store为中文,都没成功展示中文7年前

@PHPJAVAGOC #14楼 多一些像您这样理解做开源的,Fecshop会更好,少一些客套,多一些实质的交互,过程不优雅,结果会更好

apphtml5这个如何使用中文语言,我设置的comm和store为中文,都没成功展示中文7年前

@PHPJAVAGOC #11楼 周末左右会发一个版本,最近appapi端刚开发完,在把前面疏漏的翻译部分加上

回复问题,语气可能会比较生硬,希理解。

产品图片上传少生成了一个小图标7年前

@PHPJAVAGOC #4楼 为什么没有生成那个图片的原因呢?图片是应该生成的,是因为文件权限问题还是其他问题?

Your Site Analytics