Как я могу использовать XML :: Simple для настройки HTML :: FormFu? - PullRequest
0 голосов
/ 20 декабря 2009

Я предполагаю, что вы можете использовать XML :: Simple с HTML :: FormFu, потому что FromFu использует Config :: Any для загрузки своих данных конфигурации.

Однако я не могу найти какие-либо примеры конфигов xml, используемые с HTML :: FormFu. Я не только получаю ошибку. Я не уверен, что мой 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"

1 Ответ

2 голосов
/ 21 декабря 2009

Попытка создать файл XML, который XML :: Simple будет анализировать в конкретной структуре данных, может быть настоящей болью. Я считаю, что самый простой способ справиться с этим - начать с нужной вам структуры данных, запустить ее через 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, который вы ожидаете, но он выполняет свою работу. Вы также можете дважды проверить, что это работает, запустив его обратно через XML в и изучив получившуюся структуру данных:

use strict;
use warnings;
use XML::Simple;
use Data::Dumper;

my $xml = '...';
my $config = XMLin($xml, 'KeyAttr' => []);
print Dumper($config);

Причина, по которой я использую опцию KeyAttr, заключается в следующем предостережение :

Если вы хотите «в оба конца» произвольно структуры данных от Perl до XML и вернемся к Perl, тогда вам стоит отключить сворачивание массива (используя Опция KeyAttr) как с XMLout (), так и с с XMLin ().

Кроме того, я не могу найти способ передать опции в Config :: Any через load_config_file (я не тратил много времени на поиск документов HTML :: FormFu хотя). Это означает, что вам, возможно, придется самостоятельно использовать XML :: Simple , чтобы передать структуру данных в заполнить .


Как видите, файл конфигурации XML на самом деле не самый простой подход при работе с HTML :: FormFu. Если вы открыты для других подходов, я бы предложил использовать что-то, что намного лучше сопоставляется со структурами данных Perl, например, YAML (возможно, это одна из причин, по которой он используется в примерах документации ). Лично я просто использую Perl для создания своих форм и вставляю код / ​​конфигурацию в модуль.

...