feat: unified form block + Contact page matches CMS (info+form+map+FAQ)

This commit is contained in:
浅念
2026-10-29 15:55:09 +08:00
parent f49b3f7742
commit 8b438a2d56
3 changed files with 85 additions and 0 deletions
+19
View File
@@ -27,6 +27,7 @@ BLOCKS = {
'pricing':{'name':'服务方案','icon':'$','fields':['title','items'],'defaults':{'title':'服务方案','items':[{'name':'标准方案','price':'联系我们','features':['专业咨询','售后服务'],'href':'/contact/'}]}},
'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/'}},
'form':{'name':'询盘表单','icon':'✉','fields':['title','description','button_text','button_href'],'defaults':{'title':'Get a Quote','description':'Send us your requirements and our team will reply within 24 hours.','button_text':'Contact Us','button_href':'/contact-us/'}},
'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.'}]}},
}
@@ -416,6 +417,24 @@ def render_blocks(blocks, site, page, entries):
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=='form':
btn=escape(resolve('button_text','Contact Us'));href=safe_href(resolve('button_href','/contact-us/'))
form_endpoint=site.get('settings',{}).get('form_endpoint','')
if form_endpoint and str(form_endpoint).startswith('https://'):
form_html=(
f'<div class="sf-form-card"><h2 class="sf-form-title">{title}</h2><p class="sf-form-text">{desc}</p>'
f'<form class="sf-form-grid" action="{escape(str(form_endpoint),quote=True)}" method="POST">'
f'<div class="sf-form-field"><label>Your Name *</label><input name="name" required maxlength="200" autocomplete="name"></div>'
f'<div class="sf-form-field"><label>Email *</label><input name="email" type="email" required maxlength="200" autocomplete="email"></div>'
f'<div class="sf-form-field"><label>Phone / WhatsApp</label><input name="phone" maxlength="50" autocomplete="tel"></div>'
f'<div class="sf-form-field sf-form-full"><label>Message *</label><textarea name="message" required maxlength="5000" rows="4"></textarea></div>'
f'<input name="website" tabindex="-1" autocomplete="off" class="sf-honeypot" aria-hidden="true" style="position:absolute;left:-9999px">'
f'<button class="sf-button sf-form-submit" type="submit">Send Inquiry →</button></form></div>')
else:
form_html=(f'<div class="sf-form-card sf-form-fallback"><h2 class="sf-form-title">{title}</h2><p class="sf-form-text">{desc}</p>'
f'<p class="sf-form-note">Configure an external form endpoint in site settings to enable this form.</p>'
f'<a class="sf-button" href="{href}">{btn} →</a></div>')
parts.append(start+form_html+end)
elif typ=='layout':
columns=block['columns'];gap=block.get('gap',24)
weights=' '.join(f'{col["width"]}fr' for col in columns)