模板制作教程:模板技巧

自定义网站表单/全局表单提交样式

网站表单提交界面如果使用{$myfield}等标签时会自动输出系统默认的表单域样式,在实际网站中如果开发者需要改变默认样式怎么办?

例如下图的样式:

image


1、这是默认表单中的form代码

{php extract(dr_get_form_post_value('liuyan'))}

调试信息:{$debug}

             {$myfield}         {$diyfield}         {$sysfield}         {if $is_post_code}                      {dr_lang('验证码')}                              
                        
                                                                    {/if}                                  AJAX提交   普通提交              


2、删除需要默认变量,并替换成自己的表单输入框代码

{php extract(dr_get_form_post_value('liuyan'))}

调试信息:{$debug}

                  这里写自定义的表单输入框代码                   {if $is_post_code}                      {dr_lang('验证码')}                                                             {/if}                                  AJAX提交   普通提交              


3、表单输入框代码格式要求,其name值必须和默认表单保持一致,例如

image

那么自己的表单代码就可以写成:


当前栏目高亮写法

判断栏目高亮原理是栏目变量catids数组存储的是此栏目的id集合,开发者可以利用当前栏目id是否存在于这个集合中来判断高亮,例如:

{if  in_array($栏目id号, $循环体前缀字母.catids)} active{/if}

共享栏目判断高亮:

{category ********}
在循环体中判断当前栏目高亮显示
{if IS_SHARE && $catid && in_array($catid, $t.catids)} active{/if}

{/category}



独立栏目判断高亮:

{category module=news ********}
在循环体中判断当前栏目高亮显示
{if MOD_DIR == "news" && $catid && in_array($catid, $t.catids)} active{/if}

{/category}


当前已登录用户

在模板标签中显示当前已经登录的用户信息:

{if $member}
会员名称:{$member.username}
会员邮箱:{$member.email}
手机号码:{$member.phone}
真实姓名:{$member.name}
其他字段:{$member.字段名称}

会员头像:{$member.avatar}
是否是后台管理员:{$member.is_admin}

用户组id:{print_r($member.groupid)} 数组id号
显示加入了哪些用户组:
{loop $member.group $tt}

    用户组ID:{$tt.id}     级别名称:{$tt.group_level}     用户组名称:{$tt.group_name}     有效期:{dr_date($tt.stime)} ~ {dr_date($tt.etime)}

{/loop} 是否是后台管理员:{if $member.is_admin} 是管理员 {/if} // 属于哪个管理员角色组,例如角色组8888 {if $member.is_admin && \Phpcmf\Service::M()->table("admin_role_index")->where("roleid", 888)->where("uid", $member.id)->counts()} 账号属于888这个管理员组中 {/if} {else} 没登录 {/if}


用户组申请按组设计模板

默认情况下的用户组申请界面的模板是:apply_index.html

在一些项目中可能会有这种需求:不同的用户组申请时可以设置不同的模板

那么设置方式是:

例如给用户组(8)单独设置一套申请时的模板

访问用户组申请界面:index.php?s=member&c=apply&m=index&gid=8

默认界面是这样:

image

这个默认界面调用的是:apply_index.html模板

现在复制apply_index.html改名为apply_8.html,8表示用户组id号,然后在改这个模板内容就可以实现用户组8单独的申请模板了

比如在新模板上加一些显示的内容等等:

image

当前模板属于哪种页面

在当前页面中判断当前属于哪种类型的页面,比如是否是首页,是否是栏目页等

以下方法只适用于动态和伪静态页面,不适合纯静态页面。

判断是否是首页

{if $indexc}
是
{/if}

-----判断栏目页----

判断是共享栏目页

{if IS_SHARE && \Phpcmf\Service::L('Router')->uri() =="category/index"}
是
{/if}

判断是否是共享栏目页

{if IS_SHARE && \Phpcmf\Service::L('Router')->uri() =="category/index"}
是
{/if}


判断是否是独立模块news的栏目页

{if MOD_DIR == "news" && \Phpcmf\Service::L('Router')->uri() == MOD_DIR."/category/index"}
是
{/if}


-----判断内容页----

判断是否是内容页

{if \Phpcmf\Service::L('Router')->uri() =="show/index"}
是
{/if}

判断是否是共享模块内容页

{if IS_SHARE && \Phpcmf\Service::L('Router')->uri() =="show/index"}
是
{/if}

判断是否是独立模块news内容页

{if MOD_DIR == "news" && \Phpcmf\Service::L('Router')->uri() ==MOD_DIR."/show/index"}
是
{/if}

判断是否是独立模块首页

{if $indexm}
是
{/if}


通过uri的方式判断页面

\Phpcmf\Service::L('Router')->uri()
获取当前url的uri地址

-----判断搜索页----

{if $is_search_page}
这是搜索模板
{/if}

-----判断模块---

{if MOD_DIR=="news"}
这是news模块
{/if}

通过前端jq插件 infinite-scroll 实现ajax瀑布流加载

ajax瀑布流加载方案  有两种 一种是官方提供的

https://www.xunruicms.com/doc/534.html

另外一种便是通过我这种前端 jq插件 实现的 下面说方法

列表的调用案例

  class="listbox" 对应下面的 container: ".listbox",
  {list action=module module=news page=1 pagesize=10  urlrule=index.php?page=[page]} 
    {$t.title}  class="item" 对应下面的 item: ".item",
  {/list}

 {$pages} 
 class="pagelist" 对应下面的 pagination: ".pagelist",


下载 jq插件 infinite-scroll (在下面附件下载) 代码放在list循环之后

     
    
     
var ias = $.ias({    
	container: ".listbox", //包含所有文章的元素    
	item: ".item", //对应的每篇文章元素    
	pagination: ".pagelist", //对应下面的分页元素    
	next: " .pagelist a[rel^=next] ", //下一页元素        
	//分页里面 下一页带了 rel="next" 所以这个是获取.pagelist类下面的rel元素next的    
});    
ias.extension(new IASSpinnerExtension({    
	src: "/static/default/ajax/img/load.gif",    
	html: '

'     }));     ias.extension(new IASTriggerExtension({     text: '点击加载更多', //此选项为需要点击时的文字     html: '{text}

',     offset: 2, //设置此项后,到 offset:2 页之后需要手动点击才能加载,offset:!1 则一直为无限加载     }));     ias.extension(new IASNoneLeftExtension({     text: '已经加载完成!', // 加载完成时的提示     html: '{text}

',     }));    

至此已经完成 案例请查看  http://poscms4.ew98.com/wenzhang


代码下载也可以自行百度下载

ajax


在模板中读取本模板有哪些可以使用的变量

在模板中读取本模板有哪些可以使用的变量,仅限于模板文件中使用,****.html:

{var_dump($this->_options)}

这个标签是输出当前模板可用的变量,比如输出格式为:

{$上面的打印参数作为变量}


示例:

1、打印格式如果是这样:

image

那么模板标签变量就可以写成:

{$member.id} 输出为1
{$member.email} 输出为 上栗的邮件地址


把序列号1变成01,2变成02,自动保留两位

把序列号1变成01,2变成02,自动保留两位的模板写法技巧

image

例子中以$key作为序号变量


例1:比如变量是从1开始的写法:

{$key}

补0写法为:

{str_pad($key, 2, '0', STR_PAD_LEFT)}


例2:比如变量是从0开始的写法:

{$key+1}

补0写法为:

{str_pad($key+1, 2, '0', STR_PAD_LEFT)}


多级栏目导航循环显示

多级栏目导航循环显示效果是:鼠标放在栏目导航上面,会下拉显示第二级栏目列表,然后放在第二级栏目时会显示第三级栏目列表,等等

image

例如默认模板的写法是这样的:template/pc/default/home/header.html

这是调用共享栏目的分级语法:


{category module=share pid=0}

    {$t.name}
    {if $t.child}
    
        
        {category module=share pid=$t.id return=t2}
        
            
                {$t2.name}
            
            {if $t2.child}
            
                
                {category module=share pid=$t2.id return=t3}
                
                    
                        {$t3.name}
                    
                
                {/category}
            
            {/if}
        
        {/category}
    
    {/if}

{/category}

只写了第三层,开发者可以根据网站实际情况写第4、5、6、7、8、9层。

调用文章列表时判断指定时间加标记

1、比如在调用文章列表中,如果当前文章是今天更新的记录,就加一个new标记


{module **********}

{if date('ymd') == date('ymd', $t._updatetime)}
表示当天的文章
{/if}

{/module}


2、比如在调用文章列表中,如果当前文章是三天内更新的记录,就加一个new标记


{module **********}

{if (SYS_TIME - $t._updatetime) < 86400 * 3}
表示三天内的文章
{/if}

{/module}


3、比如在调用文章列表中,如果当前文章是7天内更新的记录,就加一个new标记


{module **********}

{if (SYS_TIME - $t._updatetime) < 86400 * 7}
表示7天内的文章
{/if}

{/module}



同一个网站内容以不同的模板来展示数据技巧

需求场景:

网站多套模板时可以分别查看各个模板预览网站


方案一:以网站域名为识别对象

例如:主站域名是www.xr.com,站2的域名是www.xr2.com或者xr2.xr.com


例如主站域名是:www.xr.com,入口地址是:/www/wwwroot/www.xr.com/index.php


那么新模板预览网站例如是:

域名是:www.xr2.com,网站目录是:/www/wwwroot/www.xr2.com/

按照下方布局来摆放模板和风格!

image

index.php内容是


注意:每个目录的user.ini文件要删除掉


方案二:以网站目录为识别对象

例如:主站域名是www.xr.com,站2的域名是www.xr.com/xr2/


例如主站域名是:www.xr.com,入口地址是:/www/wwwroot/www.xr.com/index.php


那么新模板预览网站例如是:

域名是:www.xr.com/xr2/,网站目录是:/www/wwwroot/www.xr.com/xr2/index.php

按照下方布局来摆放模板和风格!

image

index.php内容是


在模板调用时,如果用到{$t.url}类似这种url标签,需要做一次替换,否则url地址不会变好的!

{dr_rp($t.url, ROOT_URL, SITE_URL)}


后台模块内容列表状态属性技巧

{xunruicms_img_title}

设置自定义字段格式,让他在后台可以实时的选取存储值,可以作为状态调用

格式必须满足:

是|1
否|0


前端调用技巧:

{module module=news tjzt=1} 表示调用推荐状态的文章列表
{$t.title}
{if $t.tjzt}推荐{/if}
{/module}


栏目类型的调用

判断当前栏目类型是单页还是模块还是外链调用

栏目类型字段名称:

tid

值介绍:

0 单页
1 模块
2 外链


list.html和show.html表示当前栏目的调用方法:

{if $cat.tid==0}
单页
{elseif $cat.tid==1}
模块
{else}
外链
{/if}


循环体内的写法,直接修改前缀就行了

{if $循环前缀.tid==0}
单页
{elseif $循环前缀.tid==1}
模块
{else}
外链
{/if}


广告管理数据操作和创建思路

广告管理思路很简单,主要是用于后台录入一些图片和地址,前端来调用这些图片和地址

这种需求我们直接使用【网站表单】的知识来做;

如何创建【网站表单】?  方法就不重复写了,前面章节都有介绍。

本视频操作了网站表单建立【广告管理】功能,和前端如何去调用后台录入的广告数据,非常方便。

分页标签问题

分页三参数:

page=1      表示开启分页
pagesize=10     表示每10条数据开始分页
urlrule=xxx[page]xxx     表示下一页的url规则

通过这三个参数来构造分页功能


可选参数(v4.5.2支持):

firsturl=xxx    指定第一页的规则,如果不选使用urlrule参数来适配


可选参数(4.5.3支持)

maxlimit=999   只最大显示999条记录,如果本次查询非常多,可以设置这个参数来限定只显示999条


注意事项:

1、存在catid参数时,不能直接使用pagesize,pagesize和urlrule都会无效

 {module module=product catid=9 pagesize=6 page=1 urlrule=wei-[page].html}

一旦出现catid参数时,这时候,系统会调后台栏目设置的分页规则了,也就是意味着一旦出现catid值,那么pagesize和urlrule就失效了。

那么,如何存在catid参数是,又让我的自定义pagesize和urlrule生效呢,

只需要加参数 sbpage=1,那么改写为:

 {module module=product catid=9 pagesize=6 page=1 sbpage=1 urlrule=wei-[page].html}


2、存在catid参数+page=1时,不能使用num参数,num参数将会无效


3、存在page=1时,不能使用num参数,num参数将会无效


单独写上下页标签

需要写在循环标签之后

当前页码:{$page}
总页数:{$nums}
总条数:{$total}
下一页:{str_replace('{page}', min($page+1, $nums), $pagerule)}
上一页:{str_replace('{page}', max($page-1, 1), $pagerule)}
首页:

------如果循环标签规定了return=xxx,那么需要改成-----
当前页码:{$page_xxx}
总页数:{$nums_xxx}
总条数:{$total_xxx}
下一页:{str_replace('{page}', min($page_xxx+1, $nums_xxx), $pagerule_xxx)}
上一页:{str_replace('{page}', max($page_xxx-1, 1), $pagerule_xxx)}

将独立模块首页作为网站首页

以独立模块demo为例,一般情况下:

首页模板是:index.html

独立模块首页模板是:demo/index.html


有些需求想要实现把独立模块的首页(demo/index.html)作为网站的首页。


1、打开网站首页模板index.html

2、把模板代码改写成:

{php $ci->_module_init('demo');}{template "demo/index.html"}


这句话表示首页模板直接调用demo模块首页的的模板,实现直接调用独立模块首页了


把序列号key分页后继续累积值的读取方法

{$key}  在第一页自增到 分页数时,如果进入第二页 {$key}会从0开始标记,以下代码可以在第二页以后继续累加值。

例如,{$key+1}表示以下格式:

1

2

3

4

5

--第二页--

1

2

3

4

5

---------------------第二种情况--------------------------------------

实现类似下面的代码格式:

1

2

3

4

5

--第二页--

6

7

8

9

10

---

需要改成:

{php echo ($page>1 ? $key + (($page-1) * $pagesize) : $key) + 1;}


同时存在多个分页标签的写法

需求:在同一个页面可能同时存在多个分页时(本教程需要4.3.15及以上版本使用)

例如,此页面是首页,那么下一页的分页规则就是:,index.php?page=2&page2=2,index.php?page=2&page3=2,。。。。


标签写法为:

1、【index.php?page=2&page1=2】

{module module=news page=page1 pagesize=10 urlrule=index.php?page=2&page1=[page]}

2、【index.php?page=2&page2=2】

{module module=news page=page2 pagesize=10 urlrule=index.php?page=2&page2=[page]}

3、【index.php?page=2&page3=2】

{module module=news page=page3 pagesize=10 urlrule=index.php?page=2&page3=[page]}



如果是非首页其他页面时,需要改对应的分页规则就行,否则下一页就点不开了。

账号退出代码

用于退出当前账号的登录信息


方法一:如果加装过系统的js,直接使用退出函数即可

我要退出 


方法二:如果没有加装系统的js,需要自己写ajax退出函数

我要退出 
function dr_loginout() {
    $.ajax({type: "GET",dataType:"json", url: "/index.php?s=api&c=api&m=loginout",
        success: function(json) {
            var oss_url = json.data.sso;
            // 发送同步登录信息
            for ( var i = 0; i < oss_url.length; i++){
                $.ajax({
                    type: "GET",
                    url:oss_url[i],
                    dataType: "jsonp",
                    success: function(json){ },
                    error: function(){ }
                });
            }
            alert(json.msg);
            setTimeout('_window.location.href="'+json.data.url+'"', 2000);
        }
    });
}


内容置顶功能的实现方法

1、为内容模块创建模块字段,以article模块为例子

{xunruicms_img_title}

2、新建字段

{xunruicms_img_title}

3、创建radio字段:sfzd

{xunruicms_img_title}

4、返回到模块设置中,点击配置按钮

{xunruicms_img_title}

5、设置后台列表字段

{xunruicms_img_title}

往下拉

{xunruicms_img_title}

目的是让他显示在后台列表,方便控制

5、回到内容管理中

{xunruicms_img_title}

出现了方便点击的开关了


6、前端如何调用判断呢?

{module****标签中 加上参数 sfzd=1} 表示只调用置顶的内容
{module****标签中 加上参数 order=sfzd} 表示只调用置顶的内容排在前面循环


模块内容标题加粗功能的实现

1、为内容模块创建模块字段,以article模块为例子

{xunruicms_img_title}

2、新建字段

{xunruicms_img_title}

3、创建radio字段:shifoujiacu

{xunruicms_img_title}


4、返回到模块设置中,点击配置按钮

{xunruicms_img_title}

5、设置后台列表字段

{xunruicms_img_title}

往下拉

{xunruicms_img_title}

目的是让他显示在后台列表,方便控制

5、回到内容管理中

{xunruicms_img_title}

出现了方便点击的开关了


6、前端如何调用判断呢?

在循环中判断
{if $t.shifoujiacu==1}表示加粗的{else}普通的{/if}

内容详情界面判断
{if $shifoujiacu==1}表示加粗的{else}普通的{/if}



内外多层循环的注意事项(必须指定return)

当存在内外多层循环时必须指定return变量,例如:

{category **** }
     {module ****}
     {/module}
{/category}

这样内外循环,就不对了,需要给他们指定return,来区分变量前缀,需要改成:

{category **** return=t1}
     {module **** return=t2}
     {/module}
{/category} {$debug_t1}


一旦指定了return变量,那么循环体中的变量前缀也要发生改变,例如以前是$t.xxx需要改成 $t1.xx


侦探debug变量需要加上后缀,例如:{$debug_t1}

首页分页显示模块内容

首页进行模块内容分页显示,用到的标签是module,

{module module=news page=1 pagesize=10 urlrule=/index.php?page=[page]}

{$t.title}
{/module}

{$pages}


这是很标准的写法,循环news模块内容列表,每页显示10条内容,下页地址格式是:index.php?page=2。


========伪静态模式=========

绝大部分站点下页都会才有伪静态的模式,例如下页格式为:/page-2.html的写法:

{module module=news page=1 pagesize=10 urlrule=/page-[page].html}

{$t.title}
{/module}

{$pages}

这时候访问下页会出现404现象,需要手动写上解析规则,config/rewrite.php:

"page\-([0-9]+)\.html(.*)"  => 'index.php?c=home&m=index&page=$1',

{xunruicms_img_title}

表单id属性已重复定义 (myform)

表单id属性已重复定义 (myform)

表单属性已重复定义一个页面使用两次同一个表单

这种情况是一个页面出现了多个form,你需要改成把表单的ID改成不同的名字,例如

{xunruicms_img_title}2

改为id="myform2",加上编号,然后下面的提交按钮也需要改

{xunruicms_img_title}

改成'myform2', 一一对应起来,多个表单框就改变其他数字

判断用户是不是管理员

分享判断用户是否是管理员的几个场景

判断指定用户是否管理员

示例1:在show.html内容页调用内容发布者是不是管理员

{php $user=dr_member_info($uid);}
{if $user.is_admin}
是管理员
{else}
不是管理员
{/if}

如果是在循环标签内调用,只需将$uid改成$t.uid


判断当前登录用户是否管理员

前端模板中调用当前登录的会员

{if $member}

    {if $member.is_admin}
    是管理员
    {else}
    不是管理员
    {/if}
    
{if $member.is_admin && \Phpcmf\Service::M()->table("admin_role_index")->where("roleid", 888)->where("uid", $member.id)->counts()}
账号属于888这个管理员角色组中
{/if}

{else}
没登录,无法判断
{/if}


判断是否用户中心

判断当前页面是不是用户中心页面

{if IS_MEMBER}是的{/if}


单选字段Radio 设置默认选中项

创建了单选字段,发布内容时默认是没有选择任何选项的,如下图所示:

image

如果想默认就选中某个选项怎么办?

比如,默认就选择第3个


实现方法:

进入字段编辑界面,默认选中项填写第3个选项的值即可,如下图所示

image


保存后,再发布内容就可以看到默认选中了,如下图所示:

image


不知道在哪里进入字段修改界面?

参考文档:https://www.xunruicms.com/doc/451.html



如何关闭“余额支付”这个支付方式?

微信与支付宝支付越来越方便,很多项目就没必要有余额支付了。宸逸CMS该如何关闭余额支付呢?

image

这要分多种情况。

1、通用订单

如果是通用订单的付款是可以关闭的

只需在订单配置中关闭即可,如下图所示:

image

2、其它价格字段

如果是模块内容购买,就到价格字段编辑中关闭即可

image


3、购买用户组

购买用户组是的付款方式,是没有关闭余额支付的功能的,但也是有办法解决的。


直接上视频教程

图片解说:

image


关联字段Related和Members自定义模板

关联字段Related和Members自定义模板



模板文件解析:

1、弹窗选择界面,/dayrui/Fcms/View/api_related.html  (Members是api_members.html)

关联字段Related和Members自定义模板


2、发布时关联后的显示界面,/dayrui/Fcms/View/api_related_field.html(Members是api_members_field.html)

关联字段Related和Members自定义模板


自定义模板文件方法,以Related字段为例(Members字段类似)

1、进入字段界面,我们设置一个名字,例如叫:guanlian

关联字段Related和Members自定义模板


2、弹窗选择界面,复制文件/dayrui/Fcms/View/api_related.html 到新的文件名:

/dayrui/My/View/api_related_guanlian.html ,然后自己修改这个文件即可

---如果提示模板不存在时,需要再复制一份文件到:/dayrui/My/View/module或member/api_related_guanlian.html


3、发布时关联后的显示界面,复制文件/dayrui/Fcms/View/api_related_field.html 到新的文件名:

/dayrui/My/View/api_related_field_guanlian.html ,然后自己修改这个文件即可











过滤指定内容中图片视频空行等内容但保留换行-自定义过滤函数

在做企业网站时,常常需要在首页调用公司简介内容,最佳方案是直接调用公司简介栏目的详情内容,但内容中有可能插入了视频、图片、框架等等,首页只需要调用文字。

系统内置的dr_clearhtml会把换行也过滤掉,所以文字挤在一起不好看。


可以通过自定义函数来实现个性化过滤需求。


打开:config/custom.php

添加

~s','',$str); //过滤图片
    $str = preg_replace('~~s','',$str); //过滤视频
    $str = str_replace("div","p",$str); //div转p
    $str = str_replace("


","",$str); //删除空行     return trim($str); }


调用示例

调用栏目ID为1的栏目内容,过滤并截取600字

{dr_strcut(dr_reserve_text(dr_share_cat_value(9, 'content')), 600)}


效果如下:

过滤掉了图片、视频、空行的同时保留了换行,完美

image

外部网站调用CMS数据

在外部网站或者静态html页面上调用宸逸cms数据方法


1、在宸逸cms中开启开发者模式,index.php开启

2、然后访问宸逸cms首页,并查看源代码,如下图:

外部网站调用CMS数据

3、按照上图红线地址,创建一个模板

/template/pc/default/home/api/waibu.html


4、模板内容,随便写,你可以用标签查询news模块的数据,例如

{module module=news num=10} {$t.title}{/module}


5、然后在外部网站或者静态html页面加入以下代码,就可以读取到宸逸cms内容了


页面需要提前加载jquery


网店系统-商品列表与内容页面添加购物车

网店store系统,在商品列表页需要添加购物车功能。

image


第一步:

在列表页模板中引用商城必须JS





第二步:

循环列表中添加购物车按钮

  加入购物车


这样就已经可以成功添加购物车了。


第三步:页面实时显示购物车数量

image

如果希望在页面实时显示购物车数量。

只需添加

0





自动调用当前栏目下的栏目模型字段

如果创建了许多“栏目模型字段”且栏目较多,且每个栏目划分的字段都不一样,那么在栏目列表页及内容详情页想要调用这些字段就比较麻烦。


分享如下自动判断当前栏目划分字段的调用方法


1、循环当前栏目划分的字段

{loop $cat['field'] $f}
...
{/loop}


判断字段类型方便调用值

完整调用

show.html

{loop $cat['field'] $f}
{php $fe= $ci->module['category_data_field'][$f];}

{if $fe && $fe.fieldtype=="Text"}
    文本字段:{$fe.name}:{$this->_options[$fe.fieldname]}
    
{elseif $fe && $fe.fieldtype=="Radio"}
    单选字段:{$fe.name}:{php $field = dr_field_options($ci->module['category_data_field'][$fe.fieldname]['id']);}{$field[$this->_options[$fe.fieldname]]}
    
{elseif $fe && $fe.fieldtype=="Select"}
    下拉选项:{$fe.name}:{php $field = dr_field_options($ci->module['category_data_field'][$fe.fieldname]['id']);}{$field[$this->_options[$fe.fieldname]]}
    
{/if}

{/loop}


循环列表中

{search ...}

{loop $cat['field'] $f}
   {php $fe=$ci->module['category_data_field'][$f];}
   {if $fe && $fe.fieldtype=="Text"}
   
      文本字段:{$t[$fe.fieldname]}    
       {elseif $fe && $fe.fieldtype=="Radio"}    
      单选按钮:{php $field = dr_field_options($ci->module['category_data_field'][$fe.fieldname]['id']);}{$field[$t[$fe.fieldname]]}    
       {elseif $fe && $fe.fieldtype=="Select"}    
      {$this->_options[$fe.fieldname]}       下拉选项:{php $field = dr_field_options($ci->module['category_data_field'][$fe.fieldname]['id']);}{$field[$t[$fe.fieldname]]}    
   {/if} {/loop} {/search}


前端模板引用框架内置图标库

CMS内置了 bootstrap-icons+Font Awesome 两套开源图标库,查看地址:你的域名/admin.php?c=api&m=icon


系统后台界面所有图标都是内置图标库的,有些应用插件都会用到内置图标库,比如【悬浮在线客服】的图标就是引用内置图标库的。


所以前端模板中可以自由选择引用内置图标库


在模板区添加即可。


英文时间输出 strftime

做英文网站时,可能需要调用英文的时间,如下图所示

image


下面分享下英文时间输出方法


一、时间显示函数

{strftime("显示参数", 时间戳数字)}


二、示例

{strftime("%A, %d. %B %Y %I:%M%p", $_updatetime)}

结果如下:

image


三、显示参数格式

%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身


image




如何修改默认付款方式?

如何设置默认付款方式?

比如,英文站时将paypal付款方式设为默认

image

实现方法

只需在模板循环付款方式前面添加如下代码即可

{php $pay_default="paypal";}

如果是默认支付宝

{php $pay_default="alipay";}


添加位置

{php $pay_default="paypal";}
{loop $pay_type $name $t}


image

判断是否开启第三方登录


根据判断显示登录按钮

1、QQ登录

1
2
3
{if isset($ci->member_cache['oauth']['qq']['id']) && $ci->member_cache['oauth']['qq']['id']}
已开启QQ登录
{/if}

2、微博登录

1
2
3
{if isset($ci->member_cache['oauth']['weibo']['id']) && $ci->member_cache['oauth']['weibo']['id']}
已开启微博登录
{/if}

3、PC微信登录

1
2
3
{if isset($ci->member_cache['oauth']['weixin']['id']) && $ci->member_cache['oauth']['weixin']['id']}
已开启PC微信登录
{/if}


4、微信公众号登录

1
2
3
{if isset($ci->member_cache['oauth']['wechat']['id']) && $ci->member_cache['oauth']['wechat']['id']}
已开启公众号登录
{/if}

image


各平台登录代码见文档:

https://www.xunruicms.com/doc/408.html


判断访客语言自动跳转(英文访客自动跳转到英文版)

判断访客浏览器环境,如果是英文,就自动跳转到英文版,日语就自动跳转到日语版。


实现方法

1、打开 config/hooks.php


\Phpcmf\Hooks::app_on('appname', 'cms_init', function() {
    // 在网站初始化之后,加载模板之前执行的程序,例如判断用户是否登录

    // 获取浏览器语言设置
    $language = $_SERVER['HTTP_ACCEPT_LANGUAGE'];

    // 判断是否包含英文语言代码
    if (strpos($language, 'en') === 0) {
        // 如果是英文,则跳转到en.xxxx.com
        if ($_SERVER['HTTP_HOST'] != 'en.xxxx.com') {
            header('Location: http://en.xxxx.com');
            exit;
        }
    } else {
        // 否则跳转到www.xxxx.com
        if ($_SERVER['HTTP_HOST'] != 'www.xxxx.com') {
            header('Location: http://www.xxxx.com');
            exit;
        }
    }

});