syncAppearanceTemplates($appearanceId,$distId);
}
/*
* 得到独立页的模版数组
*/
public static function getLandingPageTemplateOptions()
{
$distInfo = DistAdminDistributor::getInfo();
$distId = $distInfo->id;
$appearanceId = $distInfo->appearance_id;
$model = new Model();
$result = $model->where('appearance_id', $appearanceId)->where('dist_id', $distId)->select('file_name')->get();
$options = ['pages_detail.liquid'=>config('dictionary.landing_page_default_template')];
foreach ($result as $key => $value) {
// 检查字符串是否以 "pages_sp_" 开头
if (strpos($value->file_name, 'pages_sp_') === 0) {
// 提取 "xxxx" 部分
// $part = str_replace('pages_sp_', '', $value->file_name);
// $part = str_replace('.liquid', '', $part);
$part = $value->file_name;
$options[$part] = $part;
}
}
return $options;
}
public static function previewSave($data)
{
$distInfo = DistAdminDistributor::getInfo();
$distId = $distInfo->id;
$appearanceId = $distInfo->appearance_id;
//查找$data中是否存在mtb_id
$inputElements = self::findElementsWithMtbId($data);
foreach ($inputElements as $prefix => $elements) {
//找查找对应的模板
$template = Model::where('dist_id', $distId)->where('appearance_id', $appearanceId)->where('template_code',$prefix)->first();
if ($template) {
//替换模板内容
$oldContent = self::contentChange($template->content,$template->template_code);//旧模板内容
$newContent = self::contentReplace($oldContent,$elements);
//更新模板内容
$template->content = $newContent;
$template->updated_at = Carbon::now();
$template->save();
//记录日志
DistAppearanceTemplateLog::insertLog($appearanceId,$distId,$template->file_name,$template->file_path,$template->template_code,$newContent,$oldContent);
}
}
}
/*
* 替换模板内容
* @param $content 模板内容
* @param $elements Array([mtb_id] => 676a6d11f1a57_1,[outHtml] =>
)
*/
public static function contentReplace($content,$elements) {
foreach ($elements as $element) {
$mtbId = $element['mtb_id'];
$outHtml = $element['outHtml'];
$content = preg_replace_callback(
'/<([a-zA-Z0-9]+)[^>]*mtb_id="' . preg_quote($mtbId, '/') . '"[^>]*>(.*?)<\/\1>/s',
function ($matches) use ($outHtml) {
// 返回替换后的内容
return $outHtml;
},
$content
);
//替换img等标签的情况
$content = preg_replace_callback(
'/<([a-zA-Z0-9]+)[^>]*mtb_id="' . preg_quote($mtbId, '/') . '"[^>]*>/s',
function ($matches) use ($outHtml) {
// 返回替换后的内容
return $outHtml;
},
$content
);
}
return $content;
}
/*
* 查找带有 mtb_id 属性的 HTML 元素
*/
public static function findElementsWithMtbId($html) {
// 定义正则表达式来匹配所有带有 mtb_id 属性的 HTML 元素
$pattern = '/<([a-zA-Z0-9-_]+)([^>]*\smtb_id="([^"]+)")([^>]*)>(.*?)<\/\1>/is';
preg_match_all($pattern, $html, $matches, PREG_SET_ORDER);
// 存储结果
$result = [];
foreach ($matches as $match) {
// 提取 mtb_id 和匹配的 HTML 内容
$outHtml = $match[0];
//如果第一个字符>后边有<,则加上空格
$pattern = '/>(?=<)/'; // 匹配 > 后紧跟 <
$replacement = '> '; // 在 > 和 < 之间添加一个空格
$outHtml = preg_replace($pattern, $replacement, $outHtml, 1);
//去掉mtb_id属性
$outHtml = preg_replace('/\s*mtb_id="[^"]*"/', '', $outHtml);
$result[] = [
'mtb_id' => $match[3], // mtb_id 的值
'outHtml' => $outHtml, // 匹配到的完整 HTML 元素
];
}
//匹配img等标签
$pattern = '/<([a-zA-Z0-9]+)[^>]*\smtb_id="([^"]+)"[^>]*>/is'; // 匹配所有含有 mtb_id 属性的标签
preg_match_all($pattern, $html, $matches, PREG_SET_ORDER);
foreach ($matches as $match) {
//去掉mtb_id属性
$outHtml = $match[0];
$outHtml = preg_replace('/\s*mtb_id="[^"]*"/', '', $outHtml);
$result[] = [
'mtb_id' => $match[2], // mtb_id 的值,这里改为 $match[2]
'outHtml' => $outHtml, // 匹配到的完整 HTML 元素
];
}
$result = array_reduce($result, function ($carry, $item) {
// 获取 mtb_id 的前缀
$prefix = explode('_', $item['mtb_id'])[0];
// 如果前缀不存在,初始化一个空数组
if (!isset($carry[$prefix])) {
$carry[$prefix] = [];
}
// 将当前项添加到对应的前缀数组中
$carry[$prefix][] = $item;
return $carry;
}, []);
return $result;
}
/*
* TODO: 模板内容增加 mtb_id 属性,用于区分不同模板
*/
public static function contentChange($content,$templateCode)
{
$count = 1;
$newContent = preg_replace_callback(
'/(<[^>]+?mtb_edit=[\'"][^\'"]+[\'"][^>]*>)/',
function ($matches) use (&$count, $templateCode) {
// 在匹配到的 HTML 元素后添加 mtb_id 属性
return preg_replace('/(mtb_edit=[\'"][^\'"]+[\'"])([^>]*)>/', '$1 mtb_id="' . $templateCode .'_'. $count++ . '"$2>', $matches[0]);
},
$content
);
return $newContent;
}
}