ecmall 模板之挂件设计

本文详细解析了电商网站模板中的挂件设计原理,包括后台可视化编辑的限制、挂件区域的初始化及单个挂件的解析流程。通过分析后台应用文件和JavaScript文件,阐述了挂件配置、添加、保存的全过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文地址:ecmall 模板之挂件设计 作者:三少
ecmall商城的挂件设计原理在商城的后台可视化编辑中,可以看到只支持二个页面,1,商城首页,2,商城分类页。在商城首页的模板中,我们可以看到很多:<divclass=leftarea=top_leftwidget_typ

ecmall 商城的挂件设计原理

在商城的后台可视化编辑中,可以看到只支持二个页面,1,商城首页,2,商城分类页。

在商城首页的模板中,我们可以看到很多:   

<div class="left" area="top_left" widget_type="area">
        <!--{widgets page=index area=top_left}-->
</div>

这样的块, 那这块表是什么意思呢?

显然了,这块的内容被抽像化了。那系统是怎么对它解析的。

在admin/app/template.app.php 的文件中(该文件是后台可视化模板编辑的应用文件)包含了对模板文件可视化编辑的处理逻辑。在加载模板文件的时候,先引入了adminincludesjavascripttemplate_panel.js;该过程在TemplateApp::_make_editable($page, $html)中;----->

return str_replace('<!--<editmode></editmode>-->', $editmode, $html);

在加载js文件之前,先替换掉模板文件中的<!--<editmode></editmode>-->标签。该标签藏在themesmalldefaultheader.html中。

----------------------------------

在template_panel.js中。

在加载模板文件后,对这页面中所有挂件区域的初始化这个过程在都template_panel.js文件中。就不详细写了。关键在于它是如何对单个挂件进行解析的。

function add_widget()中有:

$.getJSON('admin/index.php?app=template&act=add_widget&name='+$(this).attr('widget_name')+'&page=' + __PAGE__, function(rzt){。。。});

它是向admin/template.app.php的中add_widget()方法,发送了一个ajax请求:

在admin/template.app.php的add_widget()中有:

------------------------------------------

 $page_config = get_widget_config(Conf::get('template_name'), $page);//该函数定位在:includes/widget.base.php
        $id = $this->_get_unique_id($page_config);
        $widget =& widget($id, $name, array());
        $contents = $widget->get_contents();
        $this->json_result(array('contents' => $contents, 'widget_id' => $id));

----------------------------------------------

它说明了,在添加一挂件的时候,1,为每一挂件产生一ID号,2,获取指定风格,指定页面的挂件的配置信息,3,获取挂件的内容;再返回相应信息;

-----------------------------------------------

添加完挂件信息后,就需要保存了

-----------------------------------------------

在js文件的function save_page()中:

    $.post('admin/index.php?app=template&act=save&page=' + __PAGE__, $('#_edit_page_form_').serialize(), function(...){});

这个ajax对应的请求是:

admin/template.app.php的    function save()

-----------------------------------------------------------

在这方法中:

实现了对所有添加的挂件的信息的整理收集。然后再统一写入:

ecmalldatapage_config文件夹中的一个文件。

该文件的格式如下:

<?php

return array (
  'widgets' =>
  array (
    '_widget_525' =>
    array (
      'name' => 'sales_list',
      'options' => NULL,
    ),
    '_widget_897' =>
    array (
      'name' => 'sale_price',
      'options' => NULL,
    ),
    '_widget_680' =>
    array (
      'name' => 'brand',
      'options' => NULL,
    ),
  ),
  'config' =>
  array (
    'top_left' =>
    array (
      0 => '_widget_525',
      1 => '_widget_897',
    ),
    'cycle_image' =>
    array (
      0 => '_widget_680',
    ),
  ),
);

?>

----------------------------------------------

以上是稍微描述一下,挂件是如何形成的。那它是如何解析的呢?
---------------------------------------------

ecore/view/template.php中

把模板文件全文搜索执行:

return preg_replace("/{([^}{n]*)}/e", "$this->select('\1');", $source);

在select($tag)中: 由于它实现了所有标签的解析。量有些大。在这儿就稍微描述一下:

select方法的处理标签的过程是,

第一步:先判断是否为空,

通过第一个字符是否是"*"号,判断是否为注释

通过第一个字符是否是"$"号,判断是否为变量。如果是,则做替换成相应变量;

通过第一个字符是否是"/"号,判断是否为结束标签;如果是,就替换成相应的结束语句;

否则:它是就一标签语句了:

第二步:

$tag_all = explode(' ', $tag);
$tag_sel = array_shift($tag_all);

这个二句的意思,以<!--{widgets page=index area=top_left}-->标签为例:

$tag表示:"widgets page=index area=top_left"字符串

$tag_sel 则为widgets ,也就取出了标签变量的标签名称:

第三步:

 switch ($tag_sel)

{

................

case 'widgets':
                    $t = $this->get_para(substr($tag, 8), 0);

                    return '<?php $this->display_widgets(' . $this->make_array($t) . '); ?>';
                    break;

..................

}

第四步:

    function display_widgets($arr)
    {
       
        $controller =& cc();
        $controller->display_widgets($arr);
    }

很明显,这儿调用了控制器中显解析挂件的方法了:

第五步:

在frontend.app.php中

    function display_widgets($options)
    {
        $area = isset($options['area']) ? $options['area'] : '';
        $page = isset($options['page']) ? $options['page'] : '';
        if (!$area || !$page)
        {
            return;
        }
        include_once(ROOT_PATH . '/includes/widget.base.php');

       
        $widgets = get_widget_config($this->_get_template_name(), $page);

       
        if (!isset($widgets['config'][$area]))
        {
            return;
        }

       
        foreach ($widgets['config'][$area] as $widget_id)
        {
            $widget_info = $widgets['widgets'][$widget_id];
            $wn      $widget_info['name'];
            $options=   $widget_info['options'];

            $widget =& widget($widget_id, $wn, $options);
            $widget->display();
        }
    }

---------------------------------------------------------

over

Windows 系统修复工具主要用于解决 Windows 11/10 系统中的各种常见问题,具有操作简单、功能全面等特点: 文件资源管理器修复:可解决文件资源管理器卡死、崩溃、无响应等问题,能终止崩溃循环。还可修复右键菜单无响应或选项缺失问题,以及重建缩略图缓存,让图片、视频等文件的缩略图正常显示,此外,还能处理桌面缺少回收站图标、回收站损坏等问题。 互联网和连接修复:能够刷新 DNS 缓存,加速网页加载速度,减少访问延迟。可重置 TCP/IP 协议栈,增强网络连接稳定性,减少网络掉线情况,还能还原 Hosts 文件,清除恶意程序对网络设置的篡改,保障网络安全,解决电脑重装系统后网络无法连接、浏览器主页被篡改等问题。 系统修复:集成系统文件检查器(SFC),可自动扫描并修复受损的系统文件。能解决 Windows 激活状态异常的问题,还可重建 DLL 注册库,恢复应用程序兼容性,解决部分软件无法正常运行的问题,同时也能处理如 Windows 沙箱无法启动、Windows 将 JPG 或 JPEG 保存为 JFIF 等系统问题。 系统工具维护:提供启动管理器、服务管理器和进程管理器等工具,用户可控制和管理启动程序、系统服务和当前运行的进程,提高系统的启动和运行速度,防止不必要的程序和服务占用系统资源。还能查看系统规格,如处理器线程数、最大显示分辨率等。 故障排除:集成超过 20 个微软官方诊断工具,可对系统问题进行专业排查,还能生成硬件健康状态报告。能解决搜索和索引故障、邮件和日历应用程序崩溃、设置应用程序无法启动等问题,也可处理打印机、网络适配器、Windows 更新等相关故障。 其他修复功能:可以重置组策略设置、catroot2 文件夹、记事本等多种系统设置和组件,如重置 Windows 应用商店缓存、Windows 防火墙设置等。还能添加重建图标缓存支持,恢复粘滞便笺删除
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值