苹果CMS开发

苹果CMS V10 的文章模型主要用于发布资讯、文章、教程等内容。文章模板目录为 html/art,所属模型为 Art,模型 MID 为 2,在模板中可以通过 {$maccms.mid} 获取当前模型的 MID 值。

一、文章列表标签

文章列表主要使用 {maccms:art} 标签调用,完整格式如下:

{maccms:art}{/maccms:art}

二、maccms:art 标签参数

参数说明
order排列顺序,desc 倒序,asc 正序。
by排序依据,支持 id、time、time_add、score、hits、hits_day、hits_week、hits_month、up、down、level、rnd 等。
start从第几条数据开始获取。
num设置获取的数据条数。
ids指定文章 ID,多个 ID 使用逗号分隔,例如 1,2,3。
not排除指定 ID,多个 ID 使用逗号分隔。
type指定分类数据,all 表示所有分类,也可以指定分类 ID,例如 1,2,3。
class按照扩展分类筛选,支持多个值。
tag按照 TAG 标签筛选,支持多个值,例如 aaa,xxx。
level按照推荐值筛选,支持多个值。
rel指定关联数据,可以使用 ID 或相关关键词。
timeadd按照文章添加时间筛选,例如 -1 day、-1 week、-1 month、-1 hour。
timehits按照点击时间筛选,例如 -1 day、-1 week、-1 month、-1 hour。
time按照更新时间筛选,例如 -1 day、-1 week、-1 month、-1 hour。
hitsmonth按照月点击量筛选,例如 gt 1000、lt 1000、between 1000,2000。
hitsweek按照周点击量筛选,例如 gt 1000、lt 1000、between 1000,2000。
hitsday按照日点击量筛选,例如 gt 1000、lt 1000、between 1000,2000。
hits按照总点击量筛选,例如 gt 1000、lt 1000、between 1000,2000。
paging是否开启分页,使用 yes 开启。
pageurl指定分页地址。
cachetime自定义缓存时间,单位为秒。

三、文章列表调用示例

下面是一个获取最新 10 篇文章的基本示例:

{maccms:art type="all" by="time" num="10" order="desc"}
    <img src="{$vo.art_pic|mac_url_img}" alt="{$vo.art_name}"/>
    <h5>{$vo.art_name}</h5>
    <!-- 更多文章字段可使用 $vo.xxx 方式调用 -->
{/maccms:art}

在 maccms:art 循环中,当前文章数据通常使用 $vo 获取,例如 {$vo.art_name}、{$vo.art_pic} 等。

四、获取当前分类文章列表

在文章分类页面中,可以使用 type="current" 获取当前分类下的文章数据。

<!-- 列表 -->
{maccms:art num="24" paging="yes" type="current" order="desc" by="time"}
    <li>
        <a href="{:mac_url_art_detail($vo)}" title="{$vo.art_name}">
            <img src="{:mac_url_img($vo.art_pic)}" alt="{$vo.art_name}"/>
            <h2>{$vo.art_name}</h2>
            <p>{$vo.art_actor}</p>
            <i>{$vo.art_version}</i>
        </a>
    </li>
{/maccms:art}

文章列表中的字段可以直接通过 $vo 调用,文章详情页则使用 $obj 获取当前文章数据。

五、文章筛选页面

文章筛选模板文件:

html/art/show.html

文章筛选页面入口可以使用:

{:mac_url_type(['type_id'=>2],['by'=>'hits'],'show')}

文章模型筛选页面的页面 AID 为 22,当前分类数据保存在 $obj 中。

六、文章筛选 URL 参数

参数示例值是否必需说明
id1是文章分类 ID。
level9否推荐值筛选。
letterA否首字母筛选。
state1否审核状态筛选。
tag八卦否TAG 标签筛选。
class明星否扩展分类筛选。
orderdesc否排序方向,可使用倒序或正序。
bytime否排序依据,支持 id、time、time_add、score、hits、hits_day、hits_week、hits_month、up、down、level、rnd、in 等。

例如按照时间、扩展分类和首字母进行筛选:

/index.php/artshow/1/by/time/class/明星/letter/A.html

七、文章筛选参数调用

筛选页面可以通过 $param 数组获取当前请求参数,模板中可以直接调用相关参数。

{$param['area']}

例如,如果筛选参数中存在地区字段,可以使用 {$param['area']} 获取当前地区筛选值。

八、文章筛选结果列表

<!-- 筛选结果列表 -->
{maccms:art num="20" paging="yes" pageurl="art/show" type="current" order="desc" by="time"}
    <li>
        <a href="{:mac_url_art_detail($vo)}" title="{$vo.art_name}">
            <img src="{:mac_url_img($vo.art_pic)}" alt="{$vo.art_name}"/>
            <h2>{$vo.art_name}</h2>
            <p>{$vo.art_actor}</p>
            <i>{$vo.art_remarks}</i>
        </a>
    </li>
{/maccms:art}

<!-- 通用分页代码 -->

九、文章搜索页面

文章搜索模板文件:

html/art/search.html

文章搜索入口可以使用:

{:mac_url_search(['wd'=>'关键词'],'art')}

文章搜索页面的 AID 为 23,搜索参数主要通过 $param 数组获取。

十、文章搜索参数

参数示例值是否必需说明
wd变形金刚是搜索关键词。
year2019否按照年份筛选。
tag国产大片否按照 TAG 标签筛选。
class科幻片否按照扩展分类筛选。

搜索 URL 示例:

index.php/artsearch/变形金刚-------------.html

在搜索模板中,可以通过 $param 获取当前搜索参数,例如:

{$param['wd']}

十一、文章搜索表单示例

<!-- 搜索表单 -->
<form id="search" name="search" method="get" action="{:mac_url('art/search')}" onSubmit="return qrsearch();">
    <input type="text" name="wd" class="mac_wd" value="{$param.wd}" placeholder="请输入文章关键词"/>
    <input type="submit" class="mac_search" value="搜索"/>
</form>

<!-- 后台预设关键词 -->
<div class="hotkeys">
    热搜:
    {maccms:foreach name=":explode(',',$maccms.search_hot)" id="vo2" key="key2"}
        <a href="{:mac_url('art/search',['wd'=>$vo2])}">{$vo2}</a>
    {/maccms:foreach}
</div>

十二、文章详情页面

文章详情模板文件:

html/art/detail.html

文章详情页 AID 为 14,当前文章数据保存在 $obj 数组中,访问详情页时必须传递文章 ID。

如果需要查看当前文章的完整数据,可以在模板中使用:

{:print_r($obj)}

这样可以直接查看当前文章对象包含的字段,方便进行模板开发和字段调用。

十三、文章详情页常用字段调用

文章分页内容可以通过 art_page_list 获取当前页的标题和正文。例如:

<h1>
    {$obj.art_name} - {$obj.art_page_list[$param['page']]['title']}
</h1>

<div class="source">
    来源:{$obj.art_from}
    &nbsp;&nbsp;
    发布时间:{$obj.art_time|date='Y-m-d H:i:s',###}
    &nbsp;&nbsp;
    浏览次数:{$obj.art_hits}
</div>

<div class="content">
    {$obj.art_page_list[$param['page']]['content']|mac_url_content_img}
</div>

<!-- 可使用通用分页类获取文章内容分页 -->

其中 $obj.art_name 为文章标题,$obj.art_from 为文章来源,$obj.art_time 为文章时间,$obj.art_hits 为文章点击量,文章分页内容则通过 art_page_list 获取。

十四、文章上一篇和下一篇

在文章详情页中,可以根据当前文章 ID 查询上一篇和下一篇文章:

<!-- 上下篇 -->
<div class="next">
{php}
    $where = [];
    $where['art_status'] = ['eq',1];

    $where['art_id'] = ['lt',$obj['art_id']];
    $pre_info = model('art')->infoData($where,'*',1);

    $where['art_id'] = ['gt',$obj['art_id']];
    $next_info = model('art')->infoData($where,'*',1);
{/php}

{if condition="$pre_info['code'] eq 1"}
    <a href="{:mac_url_art_detail($pre_info['info'])}">
        上一篇:{$pre_info['info']['art_name']}
    </a>
{/if}

{if condition="$next_info['code'] eq 1"}
    <a href="{:mac_url_art_detail($next_info['info'])}">
        下一篇:{$next_info['info']['art_name']}
    </a>
{/if}
</div>

实际使用时可以根据网站的排序规则进一步调整上一篇、下一篇的查询条件。

十五、文章购买权限提示页

文章购买权限提示模板文件:

html/art/confirm.html

该页面主要用于需要积分或权限才能访问的文章内容。页面中可以根据用户组显示登录、充值或确认购买按钮。

<div class="mac_msg_jump">
    <div class="msg_jump_tit">系统提示</div>
    <div class="title">亲爱的用户:</div>
    <div class="text">
        {$popedom.msg}

        <p>提示:一次支付,永久观看,不重复扣费,谢谢支持。</p>

        {if condition="$user.group.group_id eq 1"}
            <a href="javascript:;" class="mac_user">马上登录</a>
        {else/}
            <a href="{:url('user/buy')}" target="_blank">马上充值</a>

            <a href="javascript:;"
               onclick="MAC.User.BuyPopedom(this)"
               data-id="{$obj.art_id}"
               data-sid="{$param.sid}"
               data-nid="{$param.nid}"
               data-mid="2"
               data-type="1">
               确认购买
            </a>
        {/if}
    </div>
</div>

如果该页面实际用于文章模型,购买接口中的模型参数应按照站点当前程序版本进行确认,避免直接套用视频模型的参数。

十六、文章版权提示页

版权提示模板文件:

html/art/copyright.html

该模板用于文章因版权或其他站点规则无法正常提供内容时显示提示信息。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
    <title>系统提示【{$obj['art_name']}】</title>
    <link rel="stylesheet" href="__STATIC__/css/home.css">
</head>
<body>
<div class="mac_msg_jump">
    <div class="msg_jump_tit">系统提示</div>
    <div class="title">亲爱的用户:</div>

    <div class="text">
        【{$obj['art_name']}】{$GLOBALS['config']['app']['copyright_notice']}
    </div>

    {if condition="$obj['art_jumpurl'] neq ''"}
    <div class="jump">
        页面自动
        <a id="href" href="{$obj['art_jumpurl']}">跳转</a>
        等待时间:<b id="wait">3</b>
    </div>
    {/if}
</div>

{if condition="$obj['art_jumpurl'] neq ''"}
<script>
(function(){
    var wait = document.getElementById('wait');
    var href = document.getElementById('href').href;

    var interval = setInterval(function(){
        var time = --wait.innerHTML;

        if(time <= 0){
            top.location.href = href;
            clearInterval(interval);
        }
    },1000);
})();
</script>
{/if}
</body>
</html>

十七、文章访问密码提示页

文章详情页访问密码模板文件:

html/art/detail_pwd.html

当文章设置了访问密码时,可以通过该模板显示密码输入框以及密码获取链接。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no">
    <title>系统提示</title>
    <link rel="stylesheet" href="__STATIC__/css/home.css">
    <script src="{$maccms.path}static/js/jquery.js"></script>
    <script>
    var maccms = {
        "path":"__ROOT__",
        "mid":"{$maccms['mid']}",
        "url":"{$maccms['site_url']}",
        "wapurl":"{$maccms['site_wapurl']}",
        "mob_status":"{$maccms['mob_status']}"
    };
    </script>
    <script src="{$maccms.path}static/js/home.js"></script>
</head>

<body>
<div class="mac_msg_jump">
    <div class="msg_jump_tit">系统提示</div>
    <div class="title">亲爱的访问此数据需要密码哦~~~</div>

    <div class="text">
        <form id="form1" name="form1" action="" method="post">
            <div class="item">
                <label>密码:</label>

                <input type="password"
                       name="pwd"
                       placeholder="请在此输入访问密码..." />

                {if condition="$obj.art_pwd_url neq ''"}
                    <a href="{$obj.art_pwd_url}" target="_blank">
                        点击获取密码
                    </a>
                {else/}
                    <span>密码:{$obj.art_pwd}</span>
                {/if}
            </div>

            <div class="item">
                <a class="submit_btn"
                   href="javascript:;"
                   onclick="MAC.Pwd.Check(this)"
                   data-mid="2"
                   data-id="{$obj.art_id}"
                   data-type="1">
                    点击确认
                </a>
            </div>
        </form>
    </div>
</div>
</body>
</html>

这里需要注意,文章模型的 MID 为 2,因此涉及模型识别的参数应使用文章模型对应的 MID,而不能直接照搬视频模板中的 mid="1"。

十八、文章 RSS 模板

文章 RSS 模板文件为:

html/art/rss.html

该模板主要用于输出文章 RSS 数据。如果需要自定义 RSS 内容,可以在该模板中按照站点的 RSS 输出结构调用文章标题、链接、摘要、发布时间和正文等字段。

十九、文章模板开发常用方法

苹果CMS V10 文章模板开发时,可以重点掌握以下几个对象和方法:

  • $vo:主要用于 maccms:art 列表循环中的当前文章数据。

  • $obj:主要用于文章详情页,表示当前文章完整数据。

  • $param:用于获取当前筛选、搜索以及分页等请求参数。

  • {:print_r($obj)}:查看当前文章对象中的完整字段,方便模板开发。

  • {:mac_url_art_detail($vo)}:生成文章详情页链接。

  • {:mac_url_img($vo.art_pic)}:处理文章图片地址。

  • {$obj.art_page_list[$param['page']]['content']|mac_url_content_img}:调用当前文章分页内容并处理正文图片。

二十、总结

苹果CMS V10 文章模型的模板主要集中在 html/art 目录中,其中 index.html 用于文章首页或列表展示,show.html 用于文章筛选,search.html 用于文章搜索,detail.html 用于文章详情,另外还包括购买权限、访问密码、版权提示和 RSS 等相关模板。

在开发文章模板时,最需要注意的是不同页面的数据对象不同:文章列表循环中主要使用 $vo,文章详情页主要使用 $obj,筛选和搜索页面则可以通过 $param 获取当前请求参数。遇到不确定的字段时,可以使用 {:print_r($obj)} 查看当前数据结构,再进行对应的模板调用。

标签:文章调用