feat: map block supports Google Maps iframe embed + Contact page map added

This commit is contained in:
浅念
2026-10-29 15:40:34 +08:00
parent e169a815ea
commit f49b3f7742
+10 -4
View File
@@ -25,7 +25,7 @@ BLOCKS = {
'video':{'name':'视频展示','icon':'▷','fields':['title','url','description'],'defaults':{'title':'企业影片','url':'','description':''}},
'tabs':{'name':'标签内容','icon':'☷','fields':['title','items'],'defaults':{'title':'详细信息','items':[{'label':'特点','text':'在这里介绍产品特点'},{'label':'服务','text':'在这里介绍服务'}]}},
'pricing':{'name':'服务方案','icon':'$','fields':['title','items'],'defaults':{'title':'服务方案','items':[{'name':'标准方案','price':'联系我们','features':['专业咨询','售后服务'],'href':'/contact/'}]}},
'map':{'name':'位置导航','icon':'⌖','fields':['title','address','url'],'defaults':{'title':'欢迎来访','address':'请填写实际办公地址','url':''}},
'map':{'name':'位置导航','icon':'⌖','fields':['title','address','url','embed'],'defaults':{'title':'欢迎来访','address':'请填写实际办公地址','url':'','embed':''}},
'form_link':{'name':'询盘表单入口','icon':'✉','fields':['title','description','button','href'],'defaults':{'title':'提交询盘','description':'欢迎联系我们获取报价和资料','button':'联系销售','href':'/contact/'}},
'trust_bar':{'name':'信任条','icon':'✓','fields':['title','items'],'defaults':{'title':'','items':[{'icon':'✓','title':'Certified quality','text':'Inspected before every shipment'},{'icon':'◎','title':'Global export','text':'Delivering to worldwide markets'},{'icon':'▤','title':'Full documentation','text':'Specs and export files on hand'},{'icon':'✉','title':'Responsive service','text':'Replies within one business day'}]}},
'applications_band':{'name':'应用展示带','icon':'⊞','fields':['title','subtitle','items'],'defaults':{'title':'Built for real-world projects','subtitle':'APPLICATIONS','items':[{'icon':'◉','title':'Water supply','text':'Municipal piping and treatment networks.'},{'icon':'◍','title':'Drainage','text':'Gravity and pressure sewer systems.'},{'icon':'✦','title':'Gas','text':'PE pipelines for fuel gas distribution.'},{'icon':'◆','title':'Mining','text':'Abrasion-resistant slurry and vent lines.'}]}},
@@ -405,9 +405,15 @@ def render_blocks(blocks, site, page, entries):
cards+='<article class="sf-price"><h3>'+escape(str(item.get('name','方案')))+'</h3><strong>'+escape(str(item.get('price','联系报价')))+'</strong><ul>'+features+'</ul><a class="sf-button" href="'+safe_href(str(item.get('href','/contact/')))+'">了解详情</a></article>'
parts.append(start+f'<div class="sf-section-head"><h2>{title}</h2></div><div class="sf-prices">{cards}</div>'+end)
elif typ=='map':
link=safe_map_url(resolve('url'))
action=f'<a class="sf-button" href="{link}" rel="noopener noreferrer" target="_blank">打开地图 ↗</a>' if link else ''
parts.append(start+f'<div class="sf-section-head"><h2>{title}</h2></div><address class="sf-map-address">{escape(resolve("address"))}</address>{action}'+end)
addr=escape(resolve('address'))
embed=block.get('embed') or ''
if embed and 'google.com/maps' in embed:
iframe=f'<div class="sf-map-embed"><iframe src="{escape(embed,quote=True)}" title="{title}" loading="lazy" style="border:0;width:100%;height:420px;border-radius:12px" allowfullscreen referrerpolicy="no-referrer-when-downgrade"></iframe></div>'
parts.append(start+f'<div class="sf-section-head"><div><span class="sf-kicker">LOCATION</span><h2>{title}</h2></div></div>{f"<address class=\"sf-map-address\">{addr}</address>" if addr else ""}{iframe}'+end)
else:
link=safe_map_url(resolve('url'))
action=f'<a class="sf-button" href="{link}" rel="noopener noreferrer" target="_blank">打开地图 ↗</a>' if link else ''
parts.append(start+f'<div class="sf-section-head"><h2>{title}</h2></div><address class="sf-map-address">{addr}</address>{action}'+end)
elif typ=='form_link':
parts.append(start+'<div class="sf-cta-wrap"><div><h2>'+title+'</h2><p>'+desc+'</p></div><a class="sf-button" href="'+safe_href(resolve('href','/contact/'))+'">'+escape(resolve('button','提交询盘'))+' →</a></div>'+end)
elif typ=='layout':