154 lines
4.9 KiB
PHP
154 lines
4.9 KiB
PHP
<?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;
|
||
}
|
||
}
|