我假设你可以使用XML :: Simple和HTML :: FormFu,因为FromFu使用Config :: Any来加载它的配置数据。
但是,我似乎无法找到与HTML :: FormFu一起使用的任何示例xml配置。我不仅得到了错误。我不确定我的xml是否正确构造以创建所需的表单。例如,在选项上,formfu需要一个数组引用数组。但我很确定这个xml会产生一个散列引用数组。
我没做正确的事......这是我的xml文件的开头:
<?xml version="1.0" encoding="utf-8" ?>
<config>
<indicator>submit</indicator>
<elements>
<element type="FieldSet" name="overrides" label="Over Rides">
<attributes title="Use these fields to override the csv value with this constant value" />
<elements>
<element type="text" name="client" label="Client" />
<element type="Select" name="bid_type" label="Bid Type">
<options bid="Bid" />
<options approved="Approved" />
</element>
<element type="text" name="client_pay" label="Client Pay" />
<element type="text" name="due_date" label="Due Date" />
<element type="text" name="start_date" label="Start Date" />
<element type="Radiogroup" name="category" label="Category">
<options grass_cut_initial="Grass Cut - Initial"/>
<options grass_cut_recut="Grass Cut - Recut"/>
<options secure="Secure"/>
<options winterization="Winterization"/>
<options rehab="Rehab" />
<options custom="Custom"/>
</element>
<element type="text" name="contractor" label="Contractor" />
<element type="text" name="contractor_pay" label="Contractor Pay" />
</elements>
</element>
我收到了这个错误:
[debug] Catalyst::Controller::HTML::FormFu::Action::FormConfig loading config file 'workorders/import' [error] Caught exception in myapsjobs::Controller::WorkOrders->import "Error parsing /home/jon/aps-dev/myapsjobs/root/forms/workorders/import.xml: /home/jon/aps-dev/myapsjobs/root/forms/workorders/import.xml:38: parser error : Premature end of data in tag config line 1 at /usr/local/share/perl/5.10.0/HTML/FormFu/ObjectUtil.pm line 502"
答案 0 :(得分:2)
尝试创建XML::Simple将解析为特定数据结构的XML文件可能会非常痛苦。我发现处理此问题的最简单方法是从您想要的数据结构开始,通过XMLout运行它,然后根据需要修改生成的XML。
use strict;
use warnings;
use XML::Simple;
my $config = {
'indicator' => 'edit',
'elements' => [
{
'name' => 'overrides',
'label' => 'Over Rides',
'type' => 'Fieldset',
'attributes' => {
'title' => 'Use these fields to override the csv value with this constant value',
},
'elements' => [
{
'type' => 'text',
'name' => 'client',
'label' => 'Client',
},
{
'type' => 'Select',
'name' => 'bidy_type',
'label' => 'Bid Type',
'options' => [
[ 'bid' => 'Bid' ],
[ 'approved' => 'Approved' ],
],
},
{
'type' => 'text',
'name' => 'client_pay',
'label' => 'Client Pay',
},
{
'type' => 'text',
'name' => 'due_date',
'label' => 'Due Date',
},
{
'type' => 'text',
'name' => 'start_date',
'label' => 'Start Date',
},
{
'type' => 'Radiogroup',
'name' => 'category',
'label' => 'Category',
'options' => [
[ 'grass_cut_initial' => 'Grass Cut - Initial' ],
[ 'grass_cut_recut' => 'Grass Cut - Recut' ],
[ 'secure' => 'Secure' ],
[ 'winterization' => 'Winterization' ],
[ 'rehab' => 'Rehab' ],
[ 'custom' => 'Custom' ],
],
},
{
'type' => 'text',
'name' => 'contractor',
'label' => 'Contractor',
},
{
'type' => 'text',
'name' => 'contractor_pay',
'label' => 'Contractor Pay',
},
],
},
],
};
my $xml = XMLout($config, 'KeyAttr' => []);
print "$xml\n";
<强>结果强>
<opt indicator="edit">
<elements label="Over Rides" name="overrides" type="Fieldset">
<attributes title="Use these fields to override the csv value with this constant value" />
<elements label="Client" name="client" type="text" />
<elements label="Bid Type" name="bidy_type" type="Select">
<options>
<anon>bid</anon>
<anon>Bid</anon>
</options>
<options>
<anon>approved</anon>
<anon>Approved</anon>
</options>
</elements>
<elements label="Client Pay" name="client_pay" type="text" />
<elements label="Due Date" name="due_date" type="text" />
<elements label="Start Date" name="start_date" type="text" />
<elements label="Category" name="category" type="Radiogroup">
<options>
<anon>grass_cut_initial</anon>
<anon>Grass Cut - Initial</anon>
</options>
<options>
<anon>grass_cut_recut</anon>
<anon>Grass Cut - Recut</anon>
</options>
<options>
<anon>secure</anon>
<anon>Secure</anon>
</options>
<options>
<anon>winterization</anon>
<anon>Winterization</anon>
</options>
<options>
<anon>rehab</anon>
<anon>Rehab</anon>
</options>
<options>
<anon>custom</anon>
<anon>Custom</anon>
</options>
</elements>
<elements label="Contractor" name="contractor" type="text" />
<elements label="Contractor Pay" name="contractor_pay" type="text" />
</elements>
</opt>
不完全是您期望的XML,但它可以完成工作。您还可以通过XMLin运行它并检查生成的数据结构来仔细检查这是否有效:
use strict;
use warnings;
use XML::Simple;
use Data::Dumper;
my $xml = '...';
my $config = XMLin($xml, 'KeyAttr' => []);
print Dumper($config);
我使用KeyAttr
选项的原因是因为caveat:
如果您希望“往返”任意 从Perl到XML和XML的数据结构 回到Perl,你可能应该 禁用数组折叠(使用 KeyAttr选项)与XMLout()和 使用XMLin()。
另外,我似乎找不到通过Config::Any将选项传递给load_config_file的方法(我没有花太多时间来寻找HTML::FormFu的文档)。这意味着您可能必须自己使用XML::Simple来将数据结构传递给populate。
正如您所看到的,在使用HTML :: FormFu时,XML配置文件确实不是最简单的方法。如果您对其他方法持开放态度,我建议使用具有更好映射到Perl数据结构的东西,例如YAML(可能是它在documentation examples中使用的原因之一)。就个人而言,我只是使用Perl创建表单并将代码/配置粘贴到模块中。