我们可以使用SafeCracker使用2个或更多“textarea”字段吗?
{exp:safecracker channel="letters_to_editor" return="site/thank_you" entry_id="{segment_3}" status="Closed"}
<p><label for="Subject">Subject:</label><br />
<input type="text" name="title" id="title" value="{title}" size="50" maxlength="100">
{custom_fields}
{if textinput}
<p><label for="Name">Your Name:</label><br />
<input type="text" name="{field_name}" value="{field_data}" id="{field_name}" size="50" /></p>
{/if}
{if textarea}
<p><label for="letter-content">Your Question:</label><br />
<textarea id="{field_name}" name="{field_name}" rows="10" cols="50">{field_data}</textarea></p>
{/if}
{/custom_fields}
<p><input type="submit" value="Submit"></p>
{/exp:safecracker}
我想要的是访客进入:
我希望所有这些字段都填充在后端,所以我在后端有以下字段:
我在后端需要另一个文本区域
但是当我创建2个任何字段时,它们[字段]在网站的表单显示中出现两次。
如果SafeCracker只询问主题,名称和问题,它还会为答案添加另一个textarea,即使我没有在表单中添加它。它会两次显示文本区域。
如何解决这个问题?
答案 0 :(得分:1)
当您使用{custom_fields}
标记对时,SafeCracker将始终遍历所有自定义字段。在这种情况下,您需要做的只是使用字段名称对各个字段进行编码。
{exp:safecracker channel="letters_to_editor" return="site/thank_you" entry_id="{segment_3}" status="Closed"}
<p>
<label for="title">Subject:</label><br />
<input type="text" name="title" id="title" value="{title}" size="50" maxlength="100" />
</p>
<p>
<label for="questioners_name">Your Name:</label><br />
<input type="text" name="questioners_name" value="{questioners_name}" id="questioners_name" size="50" />
</p>
<p>
<label for="question_bodytext">Your Question:</label><br />
<textarea id="question_bodytext" name="question_bodytext" rows="10" cols="50">{question_bodytext}</textarea>
</p>
<p><input type="submit" value="Submit" /></p>
{/exp:safecracker}
答案 1 :(得分:1)
D-Rock是正确的,当您使用{custom_fields}
标记对时,SafeCracker将遍历并显示指定频道的所有自定义字段。
根据您使用SafeCracker的方式,这可能会带来积极且可能节省大量时间的功能。
例如,如果您要创建包含许多自定义字段的注册或事件表单,那么自动输出它们就是纯粹的幸福。但是,如果您的需求更简单,那么输出一些不需要的自定义字段可能会令人沮丧。
解决此问题的一种懒惰方法是允许动态输出所有自定义字段,但有选择地使用CSS隐藏不需要的字段。
考虑以下SafeCracker代码:
{exp:safecracker channel="letters_to_editor" return="site/thank_you"}
<p class="title">
<label for="Subject">Subject</label><br />
<input type="text" name="title" id="title" />
</p>
{custom_fields}
{if textinput}
<p class="{field_name}">
<label for="{field_name}">{field_label}</label><br />
<input type="text" id="{field_name}" name="{field_name}" />
</p>
{/if}
{if textarea}
<p class="{field_name}">
<label for="{field_name}">{field_label}</label><br />
<textarea id="{field_name}" name="{field_name}"></textarea>
</p>
{/if}
{/custom_fields}
<p><input type="submit" value="Submit"></p>
{/exp:safecracker}
哪个会输出以下HTML(简化,澄清):
<form method="post" action="#">
<p class="title">
<label for="Subject">Subject</label><br />
<input type="text" name="title" id="title" />
</p>
<!-- Start of Dynamic Custom Fields -->
<p class="questioners_name">
<label for="questioners_name">Name</label><br />
<input name="questioners_name" id="questioners_name" type="text" />
</p>
<p class="question_bodytext">
<label for="question_bodytext">Question</label><br />
<textarea id="question_bodytext" name="question_bodytext"></textarea>
</p>
<p class="answer_bodytext">
<label for="answer_bodytext">Answer</label><br />
<textarea id="answer_bodytext" name="answer_bodytext"></textarea>
</p>
<!-- End of Dynamic Custom Fields -->
<input type="submit" value="Submit" />
</form>
使用单个CSS规则,您可以隐藏Answer Textarea,使其不会出现在表单中:
<style>
.answer_bodytext { display: none; }
</style>
这种方法的有力关键是利用<p class="custom_field_name">
并将其用作CSS Hook来隐藏您不想显示的字段。
明白,这是解决问题的非常懒惰的方式,实际上不会从页面中删除表单元素。相反,它是一种选择性隐藏特定自定义字段而不必手动硬编码整个表单的低技术方式 - 非常适合对时间敏感的更改或懒惰的程序员!