我开发了一个小订单扩展,客户可以在其中设计名片。此扩展使用与fabric.js相关联的画布。
客户可以添加一些文本,简单的表单,图像等等,她的自定义结果是一个json字符串,我通过jquery绑定到一个隐藏的输入,将这些数据存储在属性 image 中表格提交时。
FLUID:
<f:form.hidden class="custom-image" property="image" />
JS:
$('.step3 .custom-image').val(getJsonOfCanvas());
HTML结果:
<input class="custom-image" type="hidden" name="tx_example_orderform[step3data][image]" value="{"objects":[{"type":"rect","originX":"left","originY":"top","left":761,"top":181,"width":50,"height":50,"fill":"#68e5e7","stroke":null,"strokeWidth":1,"strokeDashArray":null,"strokeLineCap":"butt","strokeLineJoin":"miter","strokeMiterLimit":10,"scaleX":1,"scaleY":1,"angle":0,"flipX":false,"flipY":false,"opacity":0.8,"shadow":null,"visible":true,"clipTo":null,"backgroundColor":"","fillRule":"nonzero","globalCompositeOperation":"source-over","transformMatrix":null,"params":{"base":1,"x":761,"y":181,"scaleX":1,"scaleY":1},"rx":0,"ry":0}],"background":""}">
因此,名片修改会增加此隐藏输入的价值 - &gt;很多修改=大json字符串。
在稍后的订单步骤中,客户可以检查和编辑她的条目,也可以再次编辑她的名片。出于这个原因,我使用相同的json字符串再次加载画布:
FLUID(有点棘手,因为它是内联js):
<script type="text/javascript">
<![CDATA[var jsonCanvasString = ]]>
<f:if condition="{step3data.image}">
<f:then>
<f:format.htmlentitiesDecode>{step3data.image}</f:format.htmlentitiesDecode>
</f:then>
<f:else>
''
</f:else>
</f:if>
<![CDATA[;]]>
</script>
JS:
if (typeof jsonCanvasString !== 'undefined') {
canvas.loadFromJSON(jsonCanvasString, canvas.renderAll.bind(canvas));
}
当json字符串不是那么大时,这很有用,但是当它太长时我得到一个空白页面并且不会呈现任何内容,但是如果我调试我的图像属性,我可以看到该属性< strong>图片仍然设置:
有什么建议吗? 也许是否有更好的方法来存储json字符串并将其从js传递给php或从php传递给js?
希望你能帮助我:)。