PHP Mustache多Partial复用问题求助:表单渲染异常
解决PHP Mustache多Partial复用导致的渲染截断问题
嘿,我帮你找出了问题的核心,主要是数据结构和模板期望不匹配,再加上渲染逻辑的小问题,导致了输出截断。下面一步步来修复:
1. 修正数据结构,匹配Partial的区块语法
你的input.mustache和textarea.mustache用了{{#input}}、{{#textarea}}这种区块标签,这意味着Mustache希望你的数据里有对应的input和textarea键来承载对应的数据数组,而不是把所有数据直接塞在索引数组里。
修改后的$data应该是这样:
<?php $data = array( // 四个输入框的数据都放在input数组里 "input" => array( array( "div_class"=>"form-group", "id"=>"form_name", "type"=>"text", "name"=>"name", "placeholder"=> "Please enter your firstname *", "required"=>"required='required'", "data-error"=>"Firstname is required.", "input_class"=>"form-control", "label_class"=>"floating-label", "text"=>"Firstname *", "line_class"=>"line-ripple", ), array( "div_class"=>"form-group", "id"=>"form_lastname", "type"=>"text", "name"=>"surname", "placeholder"=> "Please enter your lastname *", "required"=>"required='required'", "data-error"=>"Lastname is required.", "input_class"=>"form-control", "label_class"=>"floating-label", "text"=>"Lastname *", "line_class"=>"line-ripple", ), array( "div_class"=>"form-group", "id"=>"form_email", "type"=>"email", "name"=>"email", "placeholder"=> "Please enter your email *", "required"=>"required='required'", "data-error"=>"Valid email is required.", "input_class"=>"form-control", "label_class"=>"floating-label", "text"=>"Email *", "line_class"=>"line-ripple", ), array( "div_class"=>"form-group", "id"=>"form_phone", "type"=>"tel", "name"=>"phone", "placeholder"=> "Please enter your phone", "input_class"=>"form-control", "label_class"=>"floating-label", "text"=>"Phone", "line_class"=>"line-ripple", ) ), // 文本域的数据放在textarea数组里 "textarea" => array( array( "div_class"=>"form-group", "id"=>"form_message", "name"=>"message", "placeholder"=> "Message for me *", "required"=>"required='required'", "data-error"=>"Please,leave us a message.", "input_class"=>"form-control", "label_class"=>"floating-label", "rows"=>4, "text"=>"Message *", "line_class"=>"line-ripple", ) ) ); ?>
2. 调整Partial和主模板的渲染逻辑
现在你的Partial里的{{#input}}区块会遍历整个input数组,直接调用{{>input}}会一次性渲染所有四个输入框,这和你想在不同列里分别渲染单个输入框的需求不符。所以我们需要:
第一步:简化Partial模板
去掉Partial里的外层区块标签,让每个Partial只渲染单个输入控件:
修改后的input.mustache:
<div class="{{div_class}}"> <label class="{{label_class}}" for="{{id}}">{{text}}</label> <input type="{{type}}" id="{{id}}" name="{{name}}" class="{{input_class}}" placeholder="{{placeholder}}" {{required}} data-error="{{data-error}}"> <div class="{{line_class}}"></div> </div>
修改后的textarea.mustache:
<div class="{{div_class}}"> <label class="{{label_class}}" for="{{id}}">{{text}}</label> <textarea id="{{id}}" name="{{name}}" class="{{input_class}}" placeholder="{{placeholder}}" rows="{{rows}}" {{required}} data-error="{{data-error}}"></textarea> <div class="{{line_class}}"></div> </div>
第二步:在主模板里指定渲染单个数据项
主模板里通过索引调用input数组里的单个项,再渲染对应的Partial:
修改后的contact.mustache:
<form id="contact-form" method="post" action="contact.php" role="form"> <div class="messages"></div> <div class="controls"> <div class="row"> <div class="col-md-6"> {{#input.0}}{{>input}}{{/input.0}} </div> <div class="col-md-6"> {{#input.1}}{{>input}}{{/input.1}} </div> </div> <div class="row"> <div class="col-md-6"> {{#input.2}}{{>input}}{{/input.2}} </div> <div class="col-md-6"> {{#input.3}}{{>input}}{{/input.3}} </div> </div> <div class="row"> <div class="col-md-12"> {{#textarea.0}}{{>textarea}}{{/textarea.0}} </div> <div class="col-md-12"> <input type="submit" class="btn btn-success btn-send" value="Send message"> </div> </div> <div class="row"> <div class="col-md-12"> <p class="text-muted"><strong>*</strong> These fields are required.</p> </div> </div> </div> </form>
3. 额外检查:确保输出完整
如果调整后还是出现截断,可能是PHP输出缓冲的问题,可以在代码开头加上:
ob_start();
在渲染输出后加上:
ob_end_flush();
强制输出所有缓冲的内容。
做完这些调整后,Mustache就能正确匹配每个Partial对应的数据,渲染出完整的表单,不会再出现截断的情况啦~
内容的提问来源于stack exchange,提问作者MB34
相关产品推荐
相关产品推荐

