0

我需要帮助解决以下问题。有一个我共同编写并目前管理的应用程序是用 C 和 Haskell 组合编写的。该应用程序可以通过单个 XML 文件进行定制和配置。它是一个没有用户界面的后端应用程序。我们被要求通过 Web 界面为该应用程序提供图形界面。每个配置选项都是 html 表单中的一个表单字段,如下所示

configuration1  string1
configuration2  string2
etc
etc

图形前端必须是将用户输入的数据转换为包含应用程序设置的 XML 文件的 Web 表单。当用户保存表单时,更改将写入 XML 文件。当用户打开表单时,来自 XML 文件的配置会显示在 HTML 表单字段中。

我们的团队只处理后端的东西,我们对 GUI 之类的东西一无所知。我们的限制是前端必须用 Perl 编写并使用 LibXML 模块以符合公司标准。我们的团队纯粹是 C 和 Haskell,这是我们收到的第一个类似的请求。我将不胜感激您能提供的任何帮助。如果您可以包含尽可能详细的代码示例,那将是一个很大的帮助。我们对 Perl 知之甚少,但通过一个足够清晰的例子我们可以做到。通常处理这类事情的团队正在重组,我们迫不及待地需要尽快建立这个接口。

谢谢你。

4

2 回答 2

0

致 OP:您没有正确描述配置格式,XML 片段会帮助我们。因为它是您可能必须修改下面的解决方案以匹配您的格式。

我假设了以下格式:

<conf>
  <option><name>configuration1</name><value>string1 modified</value></option>
  <option><name>configuration2</name><value>string2 re-modded</value></option>
  <option><name>configuration3</name><value>string3</value></option>
</conf>

处理这种格式的代码是:

#!/usr/bin/perl 

use strict;
use warnings;

use CGI qw( -nosticky -utf8 :standard form );
use XML::LibXML;

my $CONF="/web/data/conf.xml"; # or wherever your XML is located

# dispatch table, action => code to process it
my $dispatch= { display => \&display_conf,
                edit    => \&display_edit_form,
                save    => \&save_edits,
              };

# action is "what to do"
my $action= param( 'action') || 'display';

$dispatch->{$action}->() || exit_error( "wrong action");
exit;

# load the XML and build a table to display it
sub display_conf
  { my $conf= XML::LibXML->load_xml( location => $CONF);
    my $content;
    foreach my $option ($conf->findnodes( '/conf/option'))
      { $content .= Tr( td( $option->findvalue( './name')), 
                        td( $option->findvalue( './value'))
                      );
      }
    $content= table( $content);
    # add a link to the edit form
    $content .= p( a({ href => url() . '?action=edit' }, 'edit')); 
    output( $content);                
  }

# load the XML and build a form that will let you edit it
sub display_edit_form
  { my $conf= XML::LibXML->load_xml( location => $CONF);
    my $content;
    foreach my $option ($conf->findnodes( '/conf/option'))
      { $content .= Tr( td( $option->findvalue( './name')), 
                        td( input( { type => "text", size => 40, 
                                     name => $option->findvalue( 'name'), 
                                     value => $option->findvalue( './value')}
                                 )
                          )
                      );
      }
    $content= table( $content);
    $content= form( { action => url() }, 
                    hidden( { name => 'action', value => 'save', override => 1 }),
                    $content,
                    submit( 'Save'),
                  );
    output( $content);                
  }

# load the XML, go through all options, update the value from the form, 
# save the XML, display it value, from the form
sub save_edits
  { my $conf= XML::LibXML->load_xml( location => $CONF);
    foreach my $option ($conf->findnodes( '/conf/option'))
      { my $new_value= param( $option->findvalue( './name'));
        my( $value_node)= $option->findnodes( './value');
        $value_node->removeChildNodes();
        $value_node->appendText( $new_value);
      }
    $conf->toFile( $CONF);
    display_conf();
  }

# placeholder, 
sub exit_error
  { my $message= shift;
    print header(), p($message);
  }

# output subs, load the template, inject the content and output (with header)   

sub output
  { my $content= shift;
    print header(), fill_in_string( template(), content => $content );
  }


sub fill_in_string
  { my( $template, %param)= @_;
    $template=~ s{<<(\w+)>>}{$param{$1}}g;
    return $template;
  }

sub template
  { return join '', <DATA>; }

# template, very simple
__DATA__
<html>
  <head>
    <title>Configuration Editor</title>
  </head>
  <body>
    <h1>Configuration Editor</h1>
    <h2>Configuration</h2>
      <<content>>
    </h2>
  </body>
</html>

部署:将代码放在可以作为 CGI 运行的地方,并确保conf.xml可以被 Web 服务器读取和写入。将它放在网络树之外可能会更好。

这在某种程度上是史前 Perl。CGI 被广泛认为是过时的,Perl 中提供了更多现代和花哨的选项。如果您的配置比键/值列表更复杂,如果您想为每个字段提供自定义帮助,或者如果您需要使用更复杂的模板来符合您公司的外观,那么像 Dancer 或 Mojolicious 这样的 Web 框架会比上面的简单解决方案更适合。

OTOH 它可以工作,我仍然是这样编写很多小工具的,这些工具有一些内部用户并且在 UI 方面不需要太多。

对于那些建议对不熟悉 Perl 的人来说这太复杂而无法执行的人,你们走好了!这不是航天科技。正是这种让人们开始使用 Perl 的代码,我们为什么不帮助编写它呢?这实际上是The Reluctant Perl Programmer的完美例证。

于 2012-08-27T10:35:23.523 回答
0

不要自己这样做。您不了解 Perl 或 web-apps,您提到的有关 libxml 的限制可能只是其中之一。每一个微小的配置和输入错误都将花费您数小时或数天的时间才能弄清楚。你最终会感到痛苦和压力,用户也会如此。

您的网络团队中的某个人可以在一天内生成一个简单的表单,其中包含支持测试和文档。然后,您可以在从工作应用程序开始的知识中安全地扩展和修复错误。

如果你不能在内部找人,你可以冷聘编码员,但要尽你所能先在内部完成。不要自己这样做。

于 2012-08-25T12:48:21.037 回答