App-ZofCMS

 view release on metacpan or  search on metacpan

lib/App/ZofCMS/Plugin/CRUD.pm  view on Meta::CPAN

}

sub _process_CREATE {
    my $self = shift;

    my @errors;
    for ( grep !$_->{el_auto_set}, @{ $self->{ITEMS} || [] } ) {
        next if $_->{optional};

        push @errors, +{ error => "Parameter '$_->{text}' must be specified" }
            unless defined $_->{value} and length $_->{value};
    }

    if ( @errors ) {
        $self->{FORM_ERRORS} = \@errors;
        return;
    }

    for my $item (
        grep $_->{el_file}
            && defined $self->{Q}{ $_->{name} }
            && length $self->{Q}{ $_->{name} }, @{ $self->{ITEMS} || [] }
    ) {
        push @errors, grep defined, $self->_process_file_upload( $item );
    }

    if ( @errors ) {
        $self->{FORM_ERRORS} = \@errors;
        return;
    }

    $self->_insert_CREATE_into_db;
}

sub _process_file_upload {
    my $self = shift;
    my $item = shift;

    my $cgi = $self->{CONFIG}{cgi};

    my $fh = $cgi->upload( $item->{name} );

    if ( not $fh and $cgi->cgi_error ) {
        return +{ error => 'File upload error: ' . $cgi->cgi_error };
    }

    return +{ error => q|File upload error (no error message available)| }
        unless $fh;

    ( my $filename = $item->{value} ) =~ s/[^\w.-]/_/g;
    while ( -e File::Spec->catdir( $self->{CONF}{file_dir}, $filename ) ) {
        $filename = "_$filename";
    }

    $filename = File::Spec->catdir( $self->{CONF}{file_dir}, $filename );

    return +{ error => "Failed to open local file $filename [$!]" }
        unless open my $fh_out, '>', $filename;

    seek $fh, 0, 0;
    binmode $fh;
    binmode $fh_out;

    {
        local $/ = \1024;
        while ( <$fh> ) {
            print $fh_out $_;
        }
    }

    close $fh;
    close $fh_out;

    $item->{value} = $filename;

    return;
}

sub _insert_CREATE_into_db {
    my $self = shift;

    my %items = map +( @$_{qw/name value/} ), @{ $self->{ITEMS} };

    $self->_dbh->do(
        "INSERT INTO `$self->{CONF}{table}` (" .
            join(',', map "`$_`", keys %items )
        . ') VALUES (' .
            join(', ', ('?') x (keys %items) )
        . ')',
        undef,
        values %items,
    );

    $self->{CREATE_SUCCESS} = 1
}

sub _create_CU_form {
    my $self = shift;
    my $is_create = shift;

    my $ht = HTML::Template->new_scalar_ref( \(_get_CU_form_template()),
        die_on_bad_params => 0,
    );

    my @items = @{ $self->{ITEMS} || [] };

    $ht->param(
        is_create   => $is_create,
        id          => $self->{Q}{crud_id},
        page        => $self->{Q}{dir} . $self->{Q}{page},
        has_files   => scalar( grep $_->{el_file}, @items ),
        elements    => [ grep !$_->{el_auto_set}, @items ],
        create_success  => $self->{CREATE_SUCCESS},
        update_success  => $self->{UPDATE_SUCCESS},
        hide_form       => ($self->{CREATE_SUCCESS} || $self->{UPDATE_SUCCESS}),
        (
            @{ $self->{FORM_ERRORS} || [] }
            ? ( errors      => $self->{FORM_ERRORS}, )
            : (),
        ),
    );



( run in 1.546 second using v1.01-cache-2.11-cpan-39bf76dae61 )