Changeset 316
- Timestamp:
- 10/21/06 17:17:32 (2 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
library/perl/trunk/HTML-Widget-Kwalify/lib/HTML/Widget/Kwalify.pm
r315 r316 7 7 use version;our $VERSION = qv('0.0.1'); 8 8 9 use base 'HTML::Widget';10 use YAML qw( LoadFile );9 use base qw( HTML::Widget ); 10 use YAML qw( LoadFile Dump ); 11 11 use UNIVERSAL; 12 use CGI::Expand; 12 13 13 14 *isa = *UNIVERSAL::isa; 14 15 15 sub create_from { 16 my ( $class, %args ) = @_; 17 18 my $yaml = LoadFile($args{file}); 16 sub new { 17 my ( $class, $yaml ) = @_; 18 19 unless ( ref $yaml ) { 20 $yaml = LoadFile($yaml); 21 } 19 22 20 23 my $self = $class->SUPER::new; 21 24 return $self->_parse_kwalify_schema($yaml); 25 } 26 27 sub process { 28 my ( $self, $query ) = @_; 29 30 $self->query($query) if $query; 31 $self->SUPER::process($query); 32 } 33 34 sub dump { 35 my $self = shift; 36 my $hash = expand_cgi($self->query); 37 return Dump( expand_cgi($self->query) ); 22 38 } 23 39 … … 46 62 do{ 47 63 my $hash = {}; 48 for ( keys %$arg ){ 49 if ( $_ ne 'name' and $_ ne 'desc' ) { 50 my $clone = $element->clone; 51 push @{ $clone->stack }, $_ if $_ ne 'type'; 52 53 if ( $_ eq 'type' ) { 54 push @{ $clone->enum }, @{ $arg->{enum} } if $arg->{enum}; 55 $clone->name($arg->{name}) if $arg->{name}; 56 } 57 58 $hash->{$_} = $curry->($clone, [ $arg->{$_} ]); 64 for my $key ( keys %$arg ){ 65 my $clone = $element->clone; 66 67 push @{ $clone->stack }, $key 68 unless ( grep { $key eq $_ } ( qw/ mapping sequence desc name / ) ); 69 70 if ( $key eq 'sequence' ) { 71 push @{ $clone->stack }, '0'; 72 $clone->name($arg->{name}) if $arg->{name}; 73 $clone->desc($arg->{desc}) if $arg->{desc}; 59 74 } 75 76 if ( $key eq 'type' ) { 77 push @{ $clone->enum }, @{ $arg->{enum} } if $arg->{enum}; 78 $clone->name($arg->{name}) if $arg->{name}; 79 $clone->desc($arg->{desc}) if $arg->{desc}; 80 } 81 $hash->{$key} = $curry->($clone, [ $arg->{$key} ]); 60 82 } 61 83 $hash; … … 77 99 78 100 for ( @elements ) { 79 my $name = join '_', @{$_->stack}; 101 pop @{$_->stack}; 102 my $name = join '.', @{$_->stack}; 80 103 my $label = $_->name || $name; 104 105 my $element; 81 106 if ( @{$_->enum} ){ 82 my $enum = $self->element('Select', $name)->label($label);83 $e num->options( map { $_ => $_ } @{$_->enum} );107 $element = $self->element('Select', $name); 108 $element->options( map { $_ => $_ } @{$_->enum} ); 84 109 } 85 110 else { 86 $self->element( 'Textfield', $name )->label($label); 87 } 111 $element = $self->element( 'Textfield', $name ); 112 } 113 114 $element->label($label); 115 $element->comment($_->desc); 116 117 $self->constraint('Integer', $name) if $_->type eq 'int'; 118 $self->constraint('String', $name) if $_->type eq 'str'; 88 119 } 89 120 … … 96 127 use Storable; 97 128 98 __PACKAGE__->mk_accessors( qw/ stack type enum name / );129 __PACKAGE__->mk_accessors( qw/ stack type enum name desc / ); 99 130 100 131 sub new { … … 102 133 my $self = { 103 134 stack => [], 104 type => '',105 135 enum => [], 106 name => '',107 136 }; 108 137 bless $self, $class; … … 113 142 my $clone = Storable::dclone($self); 114 143 $clone; 144 } 145 146 { 147 no warnings 'redefine'; 148 149 *HTML::Widget::Element::mk_label = sub { 150 my ( $self, $w, $name, $comment, $errors ) = @_; 151 return unless defined $name; 152 my $for = $self->attributes->{id} || $self->id($w); 153 my $id = $for . '_label'; 154 my $e = HTML::Element->new( 'label', for => $for, id => $id ); 155 if ($errors) { 156 $e->attr( 'class' => 'labels_with_errors' ); 157 } 158 $e->push_content($name); 159 if ($comment) { 160 my $c = HTML::Element->new( 161 'span', 162 id => "$for\_comment", 163 class => 'label_comments' 164 ); 165 $c->push_content($comment); 166 $e->push_content($c); 167 $e->push_content($comment); 168 } 169 return $e; 170 }; 171 115 172 } 116 173
