our
$VERSION
=
'0.45'
;
sub
new{
my
(
$class
,
$r
,
$prefix
)=
@_
;
my
$self
= {};
$self
->{request}=
$r
;
$self
->{submitted} = 0;
$self
->{submit_value} =
''
;
$self
->{count}=0;
$self
->{submit_id} = -1;
$self
->{addition_modules}=
''
;
$self
->{prefix}=
''
;
$self
->{prefix}=
$prefix
if
(
$prefix
);
bless
(
$self
,
$class
);
return
$self
;
}
sub
add_modules{
my
(
$self
,
$mods
) =
@_
;
$self
->{addition_modules}=
$mods
;
}
sub
add_constraint{
my
(
$self
,
$params
) =
@_
;
my
$name
=
$self
->{prefix}.
$params
->{name};
$params
->{request}=
$self
->{request};
my
$class_name
=
"HTML::TurboForm::Constraint::"
.
$params
->{ type };
$class_name
->
require
() or
die
"Constraint Class '"
.
$class_name
.
"' does not exist: $@"
;
push
(@ {
$self
->{constraints} },
$class_name
->new(
$params
));
}
sub
add_uploads{
my
(
$self
,
$uploads
) =
@_
;
$self
->{uploads} =
$uploads
;
}
sub
load{
my
(
$self
,
$fn
)=
@_
;
my
$data
= LoadFile(
$fn
);
foreach
my
$item
( @{
$data
->{elements} }) {
$self
->add_element(
$item
);
}
foreach
my
$item
( @{
$data
->{constraints} }) {
if
(
$item
->{params}->{compvalue}){
my
$tmp
=
$item
->{params}->{compvalue};
$item
->{params}->{comp}=
$self
->get_value(
$tmp
);
}
$self
->add_constraint(
$item
);
}
}
sub
unignore_all{
my
(
$self
) =
@_
;
my
$k
;
my
$v
;
foreach
$k
(
keys
%{
$self
->{element_index} } ){
$self
->{element_index}->{
$k
}->{ignore}=
'false'
;
}
}
sub
ignore_all{
my
(
$self
) =
@_
;
my
$k
;
my
$v
;
foreach
$k
(
keys
%{
$self
->{element_index} } ){
$self
->{element_index}->{
$k
}->{ignore}=
'true'
;
}
}
sub
remove_all{
my
(
$self
) =
@_
;
$self
->{element_index}={};
$self
->{element}=();
}
sub
ignore_element{
my
(
$self
,
$name
) =
@_
;
$name
=
$self
->{prefix}.
$name
;
$self
->{element_index}->{
$name
}->{ignore}=
'true'
;
}
sub
unignore_element{
my
(
$self
,
$name
) =
@_
;
$name
=
$self
->{prefix}.
$name
;
$self
->{element_index}->{
$name
}->{ignore}=
'false'
;
}
sub
add_element{
my
(
$self
,
$params
) =
@_
;
my
$class
=
''
;
my
$options
=
''
;
if
(!
$params
->{name}){
$params
->{name}=
'html'
.
$self
->{count};
$self
->{count}++;
}
$params
->{request}=
$self
->{request};
my
$namew
=
$params
->{name};
my
$name
=
$self
->{prefix}.
$params
->{name};
$params
->{name}=
$name
;
my
$class_name
=
"HTML::TurboForm::Element::"
.
$params
->{ type };
$class_name
->
require
() or
die
"Class '"
.
$class_name
.
"' does not exist: $@"
;
my
$element
=
$class_name
->new(
$params
,
$self
->{uploads}->{
$name
.
'_upload'
});
my
$new_len
=
push
(@ {
$self
->{element} },
$element
);
$self
->{element_index}->{
$name
}->{
index
}=
$new_len
-1;
$self
->{element_index}->{
$name
}->{frozen}=0;
$self
->{element_index}->{
$name
}->{ignore}=
'false'
;
$self
->{element_index}->{
$name
}->{error_message}=
''
;
if
(
$params
->{type} eq
'Submit'
) {
if
(
exists
$self
->{request}->{
$name
} ){
$self
->{submitted}=1 ;
$self
->{submit_value} =
$namew
;
}
}
if
(
$params
->{submit}){
if
(
$self
->{request}->{
$name
} ){
$self
->{submitted}=1 ;
$self
->{submit_value} =
$namew
;
}
}
if
(
$params
->{type} eq
'Image'
) {
if
(
exists
$self
->{request}->{
$name
.
'_submit'
} ){
$self
->{submitted}=1 ;
$self
->{submit_value} =
$namew
.
'_uploaded'
;
}
}
if
(
$params
->{type} eq
'Imagegalerie'
) {
my
$f
=
''
;
$f
=
$self
->find_action(
$name
.
'_delete_'
);
$self
->{submit_value} =
$namew
.
'_delete'
if
(
$f
ne
''
);
if
(
$f
eq
''
){
$f
=
$self
->find_action(
$name
.
'_next_'
);
$self
->{submit_value} =
$namew
.
'_next'
if
(
$f
ne
''
);
}
if
(
$f
eq
''
){
$f
=
$self
->find_action(
$name
.
'_prev_'
);
$self
->{submit_value} =
$namew
.
'_prev'
if
(
$f
ne
''
);
}
if
(
$f
ne
''
){
$self
->{submitted}=1 ;
$self
->{submit_id} =
$f
;
}
}
if
(
$params
->{type} eq
'Imageslider'
) {
my
$f
=
''
;
$f
=
$self
->find_action(
$name
.
'_delete_'
);
if
(
$f
ne
''
){
$self
->{submitted}=1 ;
$self
->{submit_value} =
$name
.
'_delete'
;
$self
->{submit_id} =
$f
;
}
}
if
(
$params
->{type} eq
'Captcha'
) {
my
$tname
=
$name
.
"_input"
;
my
$c_val
=
$self
->get_value(
$name
);
$self
->add_element({
type
=>
'Text'
,
name
=>
$tname
} );
$self
->add_constraint({
type
=>
'Equation'
,
operator
=>
'eq'
,
name
=>
$tname
,
comp
=>
$c_val
,
text
=>
$params
->{message} });
}
}
sub
find_action{
my
(
$self
,
$action_part
)=
@_
;
foreach
(%{
$self
->{request}}){
if
(
length
(
$_
)>
length
(
$action_part
)){
if
(
index
(
$_
,
$action_part
) > -1){
my
$tmp
=
substr
(
$_
,
length
(
$action_part
));
return
$tmp
if
(
length
(
$tmp
)>0);
}
}
}
return
''
;
}
sub
do
{
my
(
$self
,
$name
,
$fn
)=
@_
;
$self
->{element}[
$self
->{element_index}->{
$self
->{prefix}.
$name
}->{
index
}]->
$fn
();
}
sub
get_javascript{
my
(
$self
,
$url
)=
@_
;
my
$js
=
''
;
my
$result
=
''
;
my
$usejquery
= 0;
foreach
my
$item
(@{
$self
->{element}}) {
if
(
$item
->{js}){
$usejquery
= 1;
$js
.=
$item
->{js}.
"\n"
;
}
}
if
(
$usejquery
==1){
$js
=
'<script>'
.
"\n"
.
'$(document).ready(function(){ '
.
$js
.
' });'
.
"\n"
.
'</script>'
;
}
return
$js
;
}
sub
get_jquery_modules{
my
(
$self
,
$url
)=
@_
;
my
@modules
;
my
@stylefiles
;
my
$js
=
''
;
my
$result
=
''
;
my
$css_r
=
''
;
my
$usejquery
= 0;
foreach
my
$item
(@{
$self
->{element}}) {
if
(
$item
->{modules}){
foreach
(@{
$item
->{modules} }){
my
$f
= 0;
foreach
my
$t
(
@modules
){
if
(
$t
eq
$_
) {
$f
= 1; }}
push
(
@modules
,
$_
)
if
(
$f
==0) ;
}
}
if
(
$item
->{stylefiles}){
foreach
(@{
$item
->{stylefiles} }){
my
$f
= 0;
foreach
my
$t
(
@stylefiles
){
if
(
$t
eq
$_
) {
$f
= 1; }}
push
(
@stylefiles
,
$_
)
if
(
$f
==0) ;
}
}
if
(
$item
->{js}){
$usejquery
= 1;
$js
.=
$item
->{js}.
"\n"
;
}
}
if
(
$usejquery
==1){
$js
=
'<script>'
.
"\n"
.
'$(document).ready(function(){ '
.
$js
.
' });'
.
"\n"
.
'</script>'
;
}
foreach
(
@modules
){
$result
.=
'<script type="text/javascript" src="/'
.
$url
.
'/'
.
$_
.
'.js" ></script>'
.
"\n"
;
}
foreach
(
@stylefiles
){
$css_r
.=
'<link href="/'
.
$url
.
'/'
.
$_
.
'.css" rel="stylesheet" type="text/css" />'
.
"\n"
;
}
return
$css_r
.
$result
.
$js
.
$self
->{addition_modules};
}
sub
set_table_class{
my
(
$self
,
$classname
)=
@_
;
$self
->{table_class}=
$classname
;
}
sub
set_table_attributes{
my
(
$self
,
$attributes
)=
@_
;
my
$attr
=
''
;
while
(
my
(
$key
,
$value
) =
each
(
%$attributes
) ) {
$attr
.=
$key
.
'="'
.
$value
.
'" '
;
}
$self
->{table_attibutes}=
$attr
;
}
sub
render{
my
(
$self
,
$view
,
$action
)=
@_
;
my
$table
=-1;
my
$count
=0;
$action
=
' action="'
.
$action
.
'" '
if
(
$action
);
$action
=
''
if
(!
$action
);
my
$table_class
=
'class="form_table"'
;
$table_class
=
'class="'
.
$self
->{table_class}.
'"'
if
(
$self
->{table_class});
$table_class
=
$self
->{table_attibutes}
if
(
$self
->{table_attibutes});
my
$result
=
'<form method=post '
.
$action
.
'enctype="multipart/form-data">'
;
if
(
$view
eq
'table'
){
$result
.=
'<table '
.
$table_class
.
'>'
; }
foreach
my
$item
(@{
$self
->{element}}) {
my
$name
=
$item
->name;
if
(
$self
->{element_index}->{
$name
}->{ignore} ne
'true'
){
$item
->{table}=-1;
if
(
$view
eq
'flat'
){
if
(
$item
->type ne
'Submit'
){
my
$label
=
$item
->get_label();
my
$value
=
$item
->get_value();
$result
.=
'<span class="form_label">'
.
$label
.
"</span>: "
.
$value
.
"<br />"
;
}
}
else
{
if
(
$item
->type eq
"TableEnd"
) {
$item
->{table}=-1;
$table
=-1;
}
if
(
$item
->type eq
"Table"
) {
$item
->{table}=
$item
->columns;
$item
->{colcount}=-1;
$count
=-1;
$table
=
$item
->columns;
}
if
(
$table
>-1) {
$count
++;
$count
=1
if
(
$count
>
$table
);
$item
->{colcount}=
$count
;
$item
->{table}=
$table
;
}
$result
.=
$item
->render(
$self
->{element_index}->{
$name
},
$view
);
}
}
else
{
$result
.=
"<input type='hidden' name='$name' value='"
.
$item
->get_value().
"'>"
;
}
}
if
(
$view
eq
'table'
){
$result
.=
'</table>'
; }
return
$result
.
'</form>'
;
}
sub
submit{
my
(
$self
) =
@_
;
my
$result
=
''
;
if
(
$self
->{submit_value} ne
''
) {
$result
=
$self
->{submit_value};
}
return
$result
;
}
sub
submitted{
my
(
$self
) =
@_
;
my
$result
=
''
;
my
$set
=0;
if
(
$self
->{submit_value} ne
''
) {
$result
=
$self
->{submit_value};
foreach
my
$item
(@{
$self
->{constraints}}) {
my
$name
=
$item
->{name};
if
(
$item
->check() == 0){
$self
->{element_index}->{
$name
}->{error_message}=
$item
->message();
$set
=1;
}
}
$result
=
''
if
(
$set
==1);
}
return
$result
;
}
sub
get_single_dbix{
my
(
$self
,
$name
)=
@_
;
my
$result
=
$self
->{element}[
$self
->{element_index}->{
$self
->{prefix}.
$name
}->{
index
}]->get_dbix();
return
$result
;
}
sub
get_dbix{
my
(
$self
)=
@_
;
my
$result
;
foreach
(@{
$self
->{element}}) {
my
$tmp
=
$_
->get_dbix();
if
(
$tmp
){
while
(
my
(
$key
,
$value
) =
each
(
%$tmp
) ) {
$result
->{
$key
} =
$value
;
}
}
}
return
$result
;
}
sub
add_options{
my
(
$self
,
$name
,
$options
)=
@_
;
$self
->{element}[
$self
->{element_index}->{
$self
->{prefix}.
$name
}->{
index
}]->add_options(
$options
);
}
sub
reset_options{
my
(
$self
,
$name
,
$options
,
$label
,
$id
)=
@_
;
$self
->{element}[
$self
->{element_index}->{
$self
->{prefix}.
$name
}->{
index
}]->reset_options(
$options
,
$label
,
$id
);
}
sub
freeze{
my
(
$self
,
$name
)=
@_
;
$self
->{element_index}->{
$self
->{prefix}.
$name
}->{frozen}=1;
$self
->{element}[
$self
->{element_index}->{
$self
->{prefix}.
$name
}->{
index
}]->freeze();
}
sub
get_r{
my
(
$self
,
$name
)=
@_
;
$self
->{element}[
$self
->{element_index}->{
$self
->{prefix}.
$name
}->{
index
}]->pure(1)
if
(!
$self
->{element}[
$self
->{element_index}->{
$self
->{prefix}.
$name
}->{
index
}]->pure);
return
$self
->{element}[
$self
->{element_index}->{
$self
->{prefix}.
$name
}->{
index
}]->render();
}
sub
get_e{
my
(
$self
,
$name
)=
@_
;
return
''
if
(!
$self
->{element_index}->{
$self
->{prefix}.
$name
}->{error_message});
return
$self
->{element_index}->{
$self
->{prefix}.
$name
}->{error_message};
}
sub
get_errors{
my
(
$self
)=
@_
;
my
$k
;
my
$result
=
''
;
foreach
$k
(
keys
%{
$self
->{element_index} } ){
$result
.=
$self
->{element_index}->{
$k
}->{error_message}.
'<br />'
if
(
$self
->{element_index}->{
$k
}->{error_message});
}
return
$result
;
}
sub
freeze_all{
my
(
$self
)=
@_
;
my
$k
;
my
$v
;
foreach
$k
(
keys
%{
$self
->{element_index} } ){
$self
->{element_index}->{
$k
}->{frozen}=1;
}
}
sub
unfreeze{
my
(
$self
,
$name
)=
@_
;
$self
->{element_index}->{
$self
->{prefix}.
$name
}->{frozen}=0;
}
sub
get_value{
my
(
$self
,
$name
)=
@_
;
my
$result
=
''
;
$result
=
$self
->{element}[
$self
->{element_index}->{
$self
->{prefix}.
$name
}->{
index
}]->get_value();
return
$result
;
}
sub
populate{
my
(
$self
,
$data
,
$anyway
)=
@_
;
if
((
$self
->{submit_value} eq
''
) or (
$anyway
ne
''
)) {
if
(
ref
(
$data
) eq
'HASH'
) {
while
(
my
(
$key
,
$value
) =
each
%{
$data
}){
$self
->{request}->{
$self
->{prefix}.
$key
}=
$value
;
}
}
else
{
my
@columns
=
$data
->result_source->columns;
foreach
my
$item
(
keys
%{
$self
->{element_index}}) {
$item
=
substr
(
$item
,
length
(
$self
->{prefix}))
if
(
$self
->{prefix} ne
''
);
if
(
grep
{
$item
eq
$_
}
@columns
) {
if
(!
$self
->{request}->{
$self
->{prefix}.
$item
}) {
$self
->{request}->{
$self
->{prefix}.
$item
}=
$data
->get_column(
$item
);
}
}
}
}
}
}
sub
serial_populate{
my
(
$self
,
$data
)=
@_
;
my
$result
= {};
my
@arr_data
=
split
(
'&'
,
$data
);
foreach
(
@arr_data
) {
my
@tmp
=
split
(
'='
,
$_
);
$self
->{request}->{
$self
->{prefix}.
$tmp
[0]} =
$tmp
[1]
if
(
$tmp
[1]);
}
}
sub
map_value{
my
(
$self
,
@columns
)=
@_
;
my
$result
;
foreach
my
$item
(
keys
%{
$self
->{element_index}}) {
$item
=
substr
(
$item
,
length
(
$self
->{prefix}))
if
(
$self
->{prefix} ne
''
);
if
(
grep
{
$item
eq
$_
}
@columns
) {
$result
->{
$item
}=
$self
->get_value(
$item
);
}
}
return
$result
;
}
sub
get_values{
my
(
$self
)=
@_
;
my
$result
;
foreach
my
$item
(
keys
%{
$self
->{element_index}}) {
$item
=
substr
(
$item
,
length
(
$self
->{prefix}))
if
(
$self
->{prefix} ne
''
);
$result
->{
$item
}=
$self
->get_value(
$item
);
}
return
$result
;
}
1;