如何在AnQiCMS模板中显示用户提交的留言表单及其自定义字段?

📅 👁️ 64

在网站运营中,收集用户反馈和咨询是提升服务质量、了解用户需求的重要环节。安企CMS(AnQiCMS)提供了一套灵活且强大的留言管理功能,让您能够轻松地在前端模板中展示留言表单,并支持自定义字段,以满足不同业务场景下的信息收集需求。

要实现在AnQiCMS模板中动态显示用户提交的留言表单及其自定义字段,我们主要会用到一个核心标签:guestbook。这个标签能够获取您在后台配置的所有留言字段信息,并通过循环将其渲染到前端页面上,从而构建出一个完全动态化的留言表单。

了解 guestbook 标签

guestbook 标签是安企CMS专为留言表单设计,它的基本用法非常直观:

{% guestbook fields %}
    {# 在这里循环渲染表单字段 #}
{% endguestbook %}

当您使用 {% guestbook fields %} 时,它会返回一个名为 fields 的变量。这个 fields 变量是一个数组,其中包含了您在安企CMS后台“功能管理”下的“网站留言”中所有配置的表单字段信息,包括系统默认字段和您创建的自定义字段。

此外,如果您正在管理多个站点,并且希望在当前站点的模板中调用其他站点的留言表单字段,可以通过 siteId 参数来指定站点ID,例如 {% guestbook fields with siteId="2" %}

动态渲染留言表单字段

fields 变量中的每一个元素都代表一个留言表单字段。在循环遍历 fields 数组时,我们可以获取到每个字段的详细属性,并根据这些属性来动态生成相应的HTML表单元素。

每个字段对象(通常在循环中被命名为 item)会包含以下几个关键属性:

  • item.Name: 字段的显示名称,例如“您的姓名”、“联系电话”等。
  • item.FieldName: 字段的内部标识符,用于作为HTML表单元素的 name 属性,例如 user_namecontact 或您自定义字段的驼峰命名形式。
  • item.Type: 字段的类型,决定了应该渲染哪种HTML表单元素。常见的类型包括:
    • text:单行文本输入框 (<input type="text">)
    • number:数字输入框 (<input type="number">)
    • textarea:多行文本输入框 (<textarea>)
    • radio:单选按钮组 (<input type="radio">)
    • checkbox:多选按钮组 (<input type="checkbox">)
    • select:下拉选择框 (<select>)
  • item.Required: 布尔值,表示该字段是否为必填项。如果为 true,我们可以在HTML元素中添加 required 属性。
  • item.Content: 字段的默认值或占位符文本。
  • item.Items: 当字段类型为 radiocheckboxselect 时,这个属性会是一个数组,包含了所有可供选择的选项值。我们需要再次循环这个 item.Items 数组来生成选项。

构建留言表单的通用模板代码

有了这些字段信息,我们就可以构建一个通用的模板代码,它能够自动适应后台配置的变化,无需手动修改前端HTML。

以下是一个详尽的示例,展示了如何在模板中动态渲染留言表单,并包含了常用的文本、数字、多行文本、单选、多选、下拉选择以及验证码功能:

”`twig

{# 隐藏字段,用于指定后端返回格式,例如设置为'html'会返回HTML页面,'json'则返回JSON数据 #}
<input type="hidden" name="return" value="html">

{% guestbook fields %}
    {% for item in fields %}
        <div class="form-group">
            <label for="{{ item.FieldName }}">{{ item.Name }}{% if item.Required %}<span class="required-star">*</span>{% endif %}</label>
            <div>
                {% if item.Type == "text" or item.Type == "number" %}
                    <input type="{{ item.Type }}"
                           id="{{ item.FieldName }}"
                           name="{{ item.FieldName }}"
                           {% if item.Required %}required{% endif %}
                           placeholder="{{ item.Content }}"
                           class="form-control"
                           autocomplete="off">
                {% elif item.Type == "textarea" %}
                    <textarea id="{{ item.FieldName }}"
                              name="{{ item.FieldName }}"
                              {% if item.Required %}required{% endif %}
                              placeholder="{{ item.Content }}"
                              rows="5"
                              class="form-control"></textarea>
                {% elif item.Type == "radio" %}
                    <div class="form-check-group">
                        {% for val in item.Items %}
                            <input type="radio"
                                   id="{{ item.FieldName }}_{{ loop.index }}"
                                   name="{{ item.FieldName }}"
                                   value="{{ val }}"
                                   {% if item.Required %}required{% endif %}
                                   class="form-check-input">
                            <label for="{{ item.FieldName }}_{{ loop.index }}" class="form-check-label">{{ val }}</label>
                        {% endfor %}
                    </div>
                {% elif item.Type == "checkbox" %}
                    <div class="form-check-group">
                        {% for val in item.Items %}
                            <input type="checkbox"
                                   id="{{ item.FieldName }}_{{ loop.index }}"
                                   name="{{ item.FieldName }}[]" {# 多选时name属性需要加[] #}
                                   value="{{ val }}"
                                   class="form-check-input">
                            <label for="{{ item.FieldName }}_{{ loop.index }}" class="form-check-label">{{ val }}</label>
                        {% endfor %}
                        {# 如果需要必填,可以考虑通过JS进行校验,或将Required放在一个隐藏字段中辅助判断 #}
                    </div>
                {% elif item.Type == "select" %}
                    <select id="{{ item.FieldName }}"
                            name="{{ item.FieldName }}"
                            {% if item.Required %}required{% endif %}
                            class="form-control">
                        {% if not item.Required %}<option value="">请选择</option>{% endif %} {# 非必填时提供空选项 #}
                        {% for val in item.Items %}
                            <option value="{{ val }}">{{ val }}</option>
                        {% endfor %}
                    </select>
                {% endif %}
            </div>
        </div>
    {% endfor %}
{% endguestbook %}

{# 验证码部分:如果后台开启了留言验证码功能,这部分代码是必需的 #}
<div class="form-group captcha-group">
    <label for="captcha">验证码<span class="required-star">*</span></label>
    <div class="captcha-input-wrapper">
        <input type="hidden" name="captcha_id" id="captcha_id">
        <input type="text" name="captcha" id="captcha" required placeholder="请填写验证码" class="form-control captcha-input" autocomplete="off">
        <img src="" id="get-captcha" class="captcha-image" alt="验证码" title="点击刷新验证码" style="cursor: pointer;">
    </div>
</div>
<script>
    // JavaScript 用于刷新验证码
    document.getElementById('get-captcha').addEventListener("click", function (e) {
        fetch('/api/captcha')
            .then(response => response.json())
            .then(res => {
                document.getElementById('captcha_id').setAttribute("value", res.data.captcha_id);
                document.getElementById('get-captcha').setAttribute("src", res.data.captcha);
            }).catch(err => console.error("获取验证码失败:", err));
    });
    document.getElementById('get-captcha').click(); // 页面加载时自动获取一次验证码
</script>

<div class="form-group form-actions">
    <button type="submit" class="btn btn-primary">提交留言</button>
    <button type="reset" class="btn btn-secondary">重置</button>
</div>

</

相关文章

如何在网站中显示用户提交的评论列表,并处理审核状态?

在网站运营中,用户评论是构建社区、获取反馈和提升内容互动性的重要元素。对于使用安企CMS(AnQiCMS)来搭建和管理网站的朋友们来说,高效地展示用户评论并管理其审核状态,是确保网站内容质量和用户体验的关键一环。好在AnQiCMS为此提供了非常灵活和实用的功能。 ### 如何在页面上显示用户评论列表 要在您的网站上展示用户提交的评论,您会用到AnQiCMS强大的模板标签系统

2025-11-08

AnQiCMS如何将Markdown格式的内容(含公式、流程图)正确渲染为HTML显示?

AnQiCMS 在内容展示上一直致力于提供高效且灵活的解决方案,对于现代内容创作中越来越受欢迎的 Markdown 格式,特别是包含了数学公式和流程图的复杂内容,AnQiCMS 也提供了完善的支持机制,确保这些内容能够被正确解析并美观地呈现在网页上。 要实现 Markdown 格式(含公式、流程图)内容的正确渲染,主要涉及到两个层面:首先是 AnQiCMS 系统内部对 Markdown 文本的

2025-11-08

内容模型自定义字段(如单选、多选、文本)如何在前端页面显示?

安企CMS:让自定义内容模型字段在前端焕发光彩 在使用安企CMS管理网站内容时,我们经常会遇到这样的需求:标准的内容结构已经无法完全满足特定信息的展示。比如一个产品页面,除了标题和内容,我们可能还需要展示它的“颜色选项”、“尺寸范围”或者“库存状态”等。这时,安企CMS灵活的内容模型和自定义字段功能就显得尤为重要,它允许我们根据业务的独特性来扩展内容属性。 ### 为什么自定义字段如此重要

2025-11-08

如何在AnQiCMS文档列表页通过筛选条件动态显示内容?

在网站运营中,如何让用户更高效地查找和浏览内容,是提升用户体验和网站价值的关键。尤其对于文档列表页,如果能够提供灵活的筛选功能,让用户根据自己的需求动态调整内容的显示,无疑会大大增强网站的互动性和内容的可用性。AnQiCMS 凭借其灵活的内容模型和强大的模板标签功能,能够轻松实现这一需求。 要实现文档列表页的动态筛选,我们主要会用到 AnQiCMS 的 **内容模型自定义字段**

2025-11-08

如何在AnQiCMS前端页面显示友情链接列表?

友情链接是网站之间相互推荐的一种方式,不仅能增加网站的外部链接,对搜索引擎优化(SEO)有所助益,也能为访客提供更多相关资源的入口,提升用户体验。AnQiCMS为我们管理和展示友情链接提供了非常便捷的功能。 接下来,我们将一起了解如何在AnQiCMS中设置友情链接,并将其展示在网站的前端页面上。 ### 一、在AnQiCMS后台管理友情链接 在AnQiCMS中,管理友情链接非常直观

2025-11-08

如何利用安企CMS实现不同内容模型(如文章、产品)的个性化展示?

安企CMS作为一款高效、可定制的内容管理系统,其核心优势之一便是灵活的内容模型。这为网站运营者提供了极大的自由度,让我们能够根据不同的业务需求,为“文章”、“产品”等多种内容类型设计独特的结构和展示方式,从而实现网站内容的个性化呈现。 接下来,我们将深入探讨如何利用安企CMS的强大功能,实现内容模型的个性化展示。 ### 理解安企CMS的内容模型 在安企CMS中

2025-11-08

安企CMS如何配置和显示多语言网站内容?

安企CMS(AnQiCMS)致力于帮助用户轻松应对全球化内容推广的需求,其内置的多语言支持功能,让您能够灵活地配置和展示不同语言版本的网站内容。无论您是希望为模板中的静态文本提供翻译,还是为文章、产品等核心内容创建独立的语言版本,安企CMS都提供了直观且强大的工具。 接下来,我们将一起探索如何在安企CMS中实现多语言网站内容的配置与显示。 ### 第一部分

2025-11-08

网站URL伪静态规则如何优化设置以提升内容展示效果和SEO排名?

在网站运营中,URL(统一资源定位符)不仅是用户访问页面的路径,更是搜索引擎理解网站内容和结构的重要线索。一个优化良好的URL结构,对于提升内容展示效果和SEO排名具有举足轻重的作用。AnqiCMS(安企CMS)在设计时充分考虑了SEO友好性,提供了灵活强大的伪静态规则管理功能,让我们可以根据网站需求,轻松打造出既美观又利于搜索的URL。 ### 一、为什么网站需要伪静态URL

2025-11-08