CreateHtmlService.php 4.7 KB
<?php
/**
 * Created by PhpStorm.
 * User: zhl
 * Date: 2024/2/19
 * Time: 15:46
 */
namespace App\Services\Html;

use App\Enums\Common\Code;
use App\Models\Product\Keyword;
use App\Models\Project\Project;
use App\Models\RouteMap\RouteMap;
use App\Models\WebSetting\WebSettingSeo;
use App\Services\TdkService;

class CreateHtmlService
{
    public function __construct(){}

    /**
     * 返回最终需要的HTML
     * @return string
     */
    public function getHtml($project_id, $route, $lang = [], $page = 0)
    {
        $projectModel = new Project();
        $projectInfo = $projectModel->with(['payment', 'deploy_build'])->where(['id'=>$project_id])->first()->toArray();
        $routeMapModel = new RouteMap();
        $routeInfo = $routeMapModel->read(['route'=>$route]);
        if($routeInfo === false){
            if($route == 'top-search' || $route == 'products' || $route == 'news' || $route == 'blog'){
                $html = '';
            }else{
                $html = '';
            }
        }else{
            //TODO::5.0,6.0获取html,自定义页面还需要单独处理
            if(($routeInfo['source'] == RouteMap::SOURCE_PAGE) && ($route != 'index')){
                $customTemplateService = new CustomTemplateService();
                $data = $customTemplateService->getHtml($projectInfo,$routeInfo['source_id']);
                if($data === false){
                    return false;
                }
                $html = $data['html'];
            }else{
                $generatePageService = new GeneratePageService();
                $data =  $generatePageService->generateHtml($projectInfo,$routeInfo);
                if($data === false){
                    return false;
                }
                $html = $data['html'];
            }
        }
        //处理页面tdk
        $tdkService = new TdkService();
        $html = $tdkService->pageTdkHandle($projectInfo,$html,$routeInfo['source'],$routeInfo);
        return ['html'=>$html];
    }

    /**
     * @remark :获取项目详情
     * @name   :getProjectInfo
     * @author :lyh
     * @method :post
     * @time   :2024/3/11 9:20
     */
    public function getProjectInfo($project_id){
        $projectModel = new Project();
        $projectInfo = $projectModel->read(['id'=>$project_id,'delete_status'=>0],['id','is_upgrade']);
        return $projectInfo;
    }

    /**
     * 返回6.0页面最终HTML
     * @return mixed
     */
    public function getHtmlV6($project_id,$route)
    {
        // 初始化后续需要渲染页面需要的数据 路由、主语种、tdk、嵌入等信息
        $origin_html = $this->originHtml($project_id,$route);
        $html = $this->renderData($origin_html);
        $html = $this->plugHead($html);
        $html = $this->processFinal($html);
        /** ... 调用其他方法, 直至返回完整的正确的HTML */
        return $html;
    }

    /**
     * 根据路由信息 返回 路由属性及详细信息
     * @param string $route
     * @return array
     */
    public function getInfoByRoute($route)
    {
        $routeMapModel = new RouteMap();
        $routeInfo = $routeMapModel->read(['route'=>$route]);
        if($routeInfo === false){
            if($route == 'top-search' || $route == 'products' || $route == 'news' || $route == 'blog'){
                $routeInfo = $route;
            }else{
                $routeInfo =  [];
            }
        }
        // TODO 获取详情需要通过路由查下路由信息, 以及数据信息, 要处理特殊几个路由: top-search、products、news、blog, 这几个如果存在就用查下的信息, 如果不存在要初始化信息
        return $routeInfo;
    }

    /**
     * 获取可视化HTML
     * @return string
     */
    public function originHtml($project_id,$route)
    {

    }

    /**
     * 补充其他信息
     * TDK mate信息等
     * @param $html
     * @return mixed
     */
    public function plugHead($html)
    {
        /** 渲染tdk信息、 mate信息、 嵌入信息、 图标信息*/
        return $html;
    }

    /**
     * 处理最终信息
     * 处理标签、最后代码标识、特殊规则或者字符等
     * @param string $html
     * @return string
     */
    public function processFinal($html)
    {
        return $html;
    }

    /**
     * 渲染页面数据
     * @param string $html
     * @return string
     */
    public function renderData($html, $page)
    {
        /**
         * 根据可视化HTML中关键词渲染数据
         * 这个方法还需要进行拆分, 这个功能内容应该会比较多
         * 并且还会根据路由信息和分页信息不同, 渲染不同数据, 只要针对列表页面
         */
        return $html;
    }
}