vr-shopxo-plugin/shopxo/app/plugins/vr_ticket/hook/AdminGoodsIndex.php

154 lines
4.9 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
namespace app\plugins\vr_ticket\hook;
use think\facade\Db;
/**
* 后台商品管理列表页钩子
* 用于修改搜索区域的生产地选择器 placeholder
*/
class AdminGoodsIndex
{
public function handle($params = [])
{
// 仅在后台商品管理页面生效
if (($params['is_backend'] ?? false) !== true) {
return '';
}
// 检查是否为商品管理内容内部底部钩子
if (($params['hook_name'] ?? '') !== 'plugins_view_admin_goods_content_inside_bottom') {
return '';
}
// 查询 level=2 城市列表(用于动态替换 placeholder
$cityList = Db::name('Region')
->field('id, name')
->where(['level' => 2, 'is_enable' => 1])
->order('sort asc, id asc')
->select()
->toArray();
// 构建城市选项 JSON
$citiesJson = json_encode($cityList, JSON_UNESCAPED_UNICODE);
$html = <<<HTML
<script>
(function() {
// 生产地搜索选择器替换函数
function replaceProduceRegionSelect() {
// 通过 placeholder 属性查找生产地选择器
var select = document.querySelector('.form-table-search select[data-placeholder="请选择生产地"]');
if (!select) {
return false; // 未找到
}
// 检查是否已经替换过(防止重复执行)
if (select.dataset.vrTicketReplaced === '1') {
return true; // 已处理
}
var cities = {$citiesJson};
var savedValue = select.value || '';
// 清空所有选项
select.innerHTML = '<option value=""></option>';
// 填充 level=2 城市列表
cities.forEach(function(city) {
var opt = document.createElement('option');
opt.value = city.id;
opt.textContent = city.name;
// 如果当前城市 ID 等于保存的值,设置为选中
if (savedValue && String(savedValue) === String(city.id)) {
opt.selected = true;
}
select.appendChild(opt);
});
// 更新 data-placeholder
select.setAttribute('data-placeholder', '请选择演出城市');
select.dataset.vrTicketReplaced = '1';
// 同时更新 label
var th = select.closest('th');
if (th) {
var label = th.querySelector('.am-text-left');
if (label && label.textContent.trim() === '生产地') {
label.textContent = '演出城市/生产地';
}
}
// 触发chosen组件更新如果已初始化
if ($.fn.chosen && select.classList.contains('chosen-init-success')) {
$(select).trigger('chosen:updated');
}
return true;
}
//轮询检查选择器是否存在
var pollCount = 0;
var maxPolls = 50;
function pollForSelect() {
pollCount++;
if (replaceProduceRegionSelect()) {
console.log('[VR Ticket] produce_region select replaced successfully');
return;
}
// 调试:检查页面上有什么选择器
if (pollCount === 1) {
var allSelects = document.querySelectorAll('.form-table-search select');
console.log('[VR Ticket] All search selects:', Array.from(allSelects).map(s => ({
name: s.name,
placeholder: s.getAttribute('data-placeholder')
})));
}
if (pollCount < maxPolls) {
setTimeout(pollForSelect, 100);
} else {
console.log('[VR Ticket] produce_region select not found after ' + maxPolls + ' polls');
// 最后一次尝试:列出所有 name 属性
var allSelects = document.querySelectorAll('.form-table-search select');
console.log('[VR Ticket] Available search selects:', Array.from(allSelects).map(s => ({
name: s.name,
placeholder: s.getAttribute('data-placeholder')
})));
}
}
// 延迟启动轮询,等待页面 JS 执行
setTimeout(pollForSelect, 200);
// 同时监听 DOM 变化以处理动态加载的情况
if (typeof MutationObserver !== 'undefined') {
var observer = new MutationObserver(function(mutations) {
if (replaceProduceRegionSelect()) {
observer.disconnect();
}
});
// 延迟初始化观察器
setTimeout(function() {
var contentArea = document.querySelector('.form-table-content');
if (contentArea) {
observer.observe(contentArea, {
childList: true,
subtree: true
});
}
}, 500);
}
})();
</script>
HTML;
return $html;
}
}