Browse Source

feat: banner tag

igb 4 months ago
parent
commit
e57b1db426

+ 33 - 0
app/Models/SiteBanner.php

@@ -0,0 +1,33 @@
+<?php
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+class SiteBanner extends Model
+{
+    use HasFactory;
+    protected $table = 'site_banner';
+
+
+
+    // 添加一个静态方法获取显示中的Banner(带position和默认值处理)
+    public static function getBannerById($id, $position = 1)
+    {
+        return self::where('id', $id)
+            ->where('show', 1)  // 只获取 show = 1 的 Banner
+            ->where('position', $position)  // 根据 position 过滤
+            ->where('dist_id', getDistId())  // 根据 dist_id 过滤
+            ->first();
+    }
+
+    // 添加一个静态方法获取符合条件的多个Banner
+    public static function getBanners($position = 1, $limit = 10)
+    {
+        return self::where('show', 1)  // 只获取 show = 1 的 Banner
+        ->where('position', $position)  // 根据 position 过滤
+        ->where('dist_id', getDistId())  // 根据 dist_id 过滤
+        ->limit($limit)
+        ->get();
+    }
+}

+ 2 - 0
app/Services/LiquidRenderer.php

@@ -4,6 +4,7 @@ namespace App\Services;
 
 use App\Services\LiquidTags\LiquidTagProduct;
 use App\Services\LiquidTags\LiquidTagVideo;
+use App\Services\LiquidTags\LiquidTagBanner;
 use Liquid\Liquid;
 use Liquid\Template;
 use Liquid\Cache\File as FileCache;
@@ -32,6 +33,7 @@ class LiquidRenderer
         $template->registerTag('product', LiquidTagProduct::class);
         $template->registerTag('video', LiquidTagVideo::class);
         $template->registerTag('contact', LiquidTagContactUs::class);
+        $template->registerTag('banner', LiquidTagBanner::class);
         $template->registerFilter(Filters::class);
 
 

+ 114 - 0
app/Services/LiquidTags/LiquidTagBanner.php

@@ -0,0 +1,114 @@
+<?php
+namespace App\Services\LiquidTags;
+
+use App\Models\SiteBanner;
+use Liquid\AbstractBlock;
+use App\Services\LiquidRenderer;
+
+class LiquidTagBanner extends AbstractBlock
+{
+    private $limit;
+    private $position;
+    private $templateFile;
+    private $bannerId;
+
+    // 构造函数用于解析传入的参数
+    public function __construct($markup, array &$tokens, $file_system = null)
+    {
+        // 初始化默认值
+        $this->limit = 10;
+        $this->position = 1;  // 默认位置1
+        $this->templateFile = null;
+        $this->bannerId = null;
+
+        // 正则表达式解析传入的参数
+        $syntax = '/(\w+)=("[^"]*"|\'[^\']*\'|\d+)/';
+
+
+
+        if (preg_match_all($syntax, $markup, $matches, PREG_SET_ORDER)) {
+            foreach ($matches as $match) {
+                $key = $match[1];
+                $value = trim($match[2], '"\''); // 去除引号
+
+                switch ($key) {
+                    case 'limit':
+                        $this->limit = (int)$value;
+                        break;
+                    case 'position':
+                        $this->position = (int)$value;
+                        break;
+                    case 'template':
+                        $this->templateFile = $value;
+                        break;
+                    case 'banner_id':  // 解析传入的 banner_id 参数
+                        $this->bannerId = (int)$value;
+                        break;
+                }
+            }
+        }
+
+    }
+
+    // render 方法执行逻辑并返回渲染结果
+    public function render($context)
+    {
+
+        // 如果传入了 banner_id 参数,则渲染单个 Banner
+        if ($this->bannerId > 0) {
+            return $this->renderSingle($this->bannerId);
+        } else {
+            // 否则渲染多个 Banner
+            return $this->renderList();
+        }
+    }
+
+    // 渲染多个 Banner
+    private function renderList()
+    {
+
+
+        // 从数据库获取符合条件的 Banner 列表
+        $banners = SiteBanner::getBanners($this->position, $this->limit);
+
+
+
+
+        // 如果有符合条件的 Banner,渲染模板
+        if ($banners->count() > 0) {
+            return $this->renderTemplate(['banners' => $banners->toArray()]);
+        }
+
+        // 如果没有符合条件的 Banner,返回空字符串
+        return '';
+    }
+
+    // 渲染单个 Banner
+    private function renderSingle($bannerId)
+    {
+        // 从数据库获取指定 id 的 Banner
+        $banner = SiteBanner::getBannerById($bannerId, $this->position);
+
+        // 如果 Banner 存在,渲染模板
+        if ($banner) {
+            return $this->renderTemplate(['banner' => $banner->toArray()]);
+        }
+
+        // 如果没有符合条件的 Banner,返回空字符串
+        return '';
+    }
+
+    // 渲染模板
+    private function renderTemplate(array $data)
+    {
+
+        if (!$this->templateFile) {
+            return ''; // 如果未提供模板文件,返回空字符串
+        }
+
+
+
+        // 使用 LiquidRenderer 渲染模板
+        return LiquidRenderer::render($this->templateFile, $data);
+    }
+}

+ 3 - 70
resources/views/liquid_src/1/TechVista/home.liquid

@@ -24,77 +24,10 @@
                     {% include '_header.liquid' %}
                     <!-- END: HEADER -->
 
-                    <!-- REVOLUTION SLIDER -->
-                    <div id="rev_slider_1_wrapper" class="rev_slider_wrapper fullwidthbanner-container" data-alias="image-hero39" data-source="gallery">
-                        <!-- START REVOLUTION SLIDER 5.3.0.2 fullwidth mode -->
-                        <div id="rev_slider_1" class="rev_slider fullwidthabanner" style="display:none;" data-version="5.3.0.2" >
-                            <ul>
-                                <li data-index="rs-1" data-transition="slidevertical" data-slotamount="1" data-hideafterloop="0" data-hideslideonmobile="off"  data-easein="default" data-easeout="default" data-masterspeed="1500"  data-thumb=""  data-rotate="0"  data-fstransition="fade" data-fsmasterspeed="1500" data-fsslotamount="7" data-saveperformance="off"  data-title="Intro" data-param1="" data-param2="" data-param3="" data-param4="" data-param5="" data-param6="" data-param7="" data-param8="" data-param9="" data-param10="" data-description="">
-                                    <!-- MAIN IMAGE -->
-                                    <a href="#">
-                                        <img src="static/picture/iphone-1.jpg"  alt=""  data-bgposition="top center" data-bgfit="cover" data-bgrepeat="no-repeat" class="rev-slidebg" data-no-retina>
-                                    </a>
-                                    <div class="tp-caption title--style-1 c-white tp-resizeme" id="slide-2-layer-3"
-                                         data-x="['right','right','right','right']" data-hoffset="['0','0','50','50']"
-                                         data-y="['middle','middle','middle','middle']" data-voffset="['70','70','70','70']"
-                                         data-fontsize="['40','40','40','40']"
-                                         data-lineheight="['50','40','40','40']"
-                                         data-width="[300, 300, 300, 300]"
-                                         data-height="none"
-                                         data-whitespace="nowrap"
-                                         data-type="text"
-                                         data-responsive_offset="on"
-                                         data-frames='[{"from":"x:-50px;opacity:0;","speed":1000,"to":"o:1;","delay":1000,"ease":"Power2.easeOut"},{"delay":"wait","speed":1500,"to":"opacity:0;","ease":"Power4.easeIn"}]'
-                                         data-textAlign="['left','left','left','left']"
-                                         data-paddingtop="[0,0,0,0]"
-                                         data-paddingright="[0,0,0,0]"
-                                         data-paddingbottom="[0,0,0,0]"
-                                         data-paddingleft="[0,0,0,0]"
-                                         style="z-index: 11; white-space: nowrap;text-transform:left;">
-
-					<span class="strong-600">
-						the new Iphone X
-					</span>
-                                </li>
-
-                                <!-- SLIDE 2 -->
-                                <li data-index="rs-2" data-transition="slidevertical" data-slotamount="1" data-hideafterloop="0" data-hideslideonmobile="off"  data-easein="default" data-easeout="default" data-masterspeed="1500"  data-thumb=""  data-rotate="0"  data-fstransition="fade" data-fsmasterspeed="1500" data-fsslotamount="7" data-saveperformance="off"  data-title="Intro" data-param1="" data-param2="" data-param3="" data-param4="" data-param5="" data-param6="" data-param7="" data-param8="" data-param9="" data-param10="" data-description="">
-                                    <!-- MAIN IMAGE -->
-                                    <a href="#">
-                                        <img src="static/picture/macbook-1.jpg"  alt=""  data-bgposition="center center" data-bgfit="cover" data-bgrepeat="no-repeat" class="rev-slidebg" data-no-retina>
-                                    </a>
-
-                                    <div class="tp-caption title--style-1 c-white tp-resizeme" id="slide-2-layer-3"
-                                         data-x="['right','right','right','right']" data-hoffset="['0','0','50','50']"
-                                         data-y="['middle','middle','middle','middle']" data-voffset="['70','70','70','70']"
-                                         data-fontsize="['40','40','40','40']"
-                                         data-lineheight="['50','40','40','40']"
-                                         data-width="[300, 300, 300, 300]"
-                                         data-height="none"
-                                         data-whitespace="nowrap"
-                                         data-type="text"
-                                         data-responsive_offset="on"
-                                         data-frames='[{"from":"x:-50px;opacity:0;","speed":1000,"to":"o:1;","delay":1000,"ease":"Power2.easeOut"},{"delay":"wait","speed":1500,"to":"opacity:0;","ease":"Power4.easeIn"}]'
-                                         data-textAlign="['left','left','left','left']"
-                                         data-paddingtop="[0,0,0,0]"
-                                         data-paddingright="[0,0,0,0]"
-                                         data-paddingbottom="[0,0,0,0]"
-                                         data-paddingleft="[0,0,0,0]"
-                                         style="z-index: 11; white-space: nowrap;text-transform:left;">
-
-					<span class="strong-600">
-						the new Macbook Pro
-					</span>
-
-                                    </div>
-
-
-                                </li>
-                            </ul>
-                            <div class="tp-bannertimer tp-bottom" style="visibility: hidden !important;"></div>
-                        </div>
-                    </div><!-- END REVOLUTION SLIDER -->
+                    <!-- banner -->
+                    {% banner limit=5 position=1 template='__banner_list.liquid' %}
 
+                    <!-- banner END -->
                     <section class="slice sct-color-2">
                         <div class="container">
                             <div class="section-title section-title--style-1 text-center">

+ 1 - 1
resources/views/liquid_src/1/TechVista/version.liquid

@@ -1 +1 @@
-<!-- update date 2024-12-07 15:27 -->
+<!-- update date 2024-12-09 16:10 -->