NAME

Hyper::Developer::Manual::Example - Example Hyper Application

VERSION

This document describes Hyper::Developer::Manual::Example 0.03

DESCRIPTION

Hyper is a Workflow and Service/Usecase based Web Framework. After creating a new environment for your Hyper stuff developing applications with Hyper can be splitted into three different parts.

Modelling

Define Workflows and Controls.

Programming

Add your own code to your pages, to interfaces and add additonal things.

Beautifying

Modify generated templates (HTML) and add JavaScript for Show/Hide etc.

REQUIREMENTS

You need to install the following Perl packages.

  • Hyper

  • Hyper::Developer

  • Authen::Htpasswd

SAMPLE

Let's look at our sample:

You want to create a workflow for changing passwords. Usernames and passwords are stored in a .htpasswd file. The tasks should be placed on three different pages.

Page 1 - choose_username

With a username select, where the selection is required. There should be an button to go to the next page.

Page 2 - change_password

Two fields - one for the new password and another one to confirm the new password. Both entered passwords must match, before the password will be changed. The fields are required fields. There should be a button to go to next page.

Page 3 - confirmation

Confirm the password change and show page 1 again.

CREATE NEW ENVIRONMENT

Depending on your operating system you maybe need to change the permissions of the directory /srv using chmod.

Then run the following command:

hyper.pl --base_path=/srv/www.example.com/ --namespace=Example --type=env

If this is your first Hyper Usecase you have to create a new environment.

MODELLING

Page 1

Create a file

/srv/www.example.com/etc/Example/Control/Container/User/CSelectUsername.ini

with the following Content

[Control]
[Control user]
class=Hyper.Control.Base.BSelect

[Control submit]
class=Hyper.Control.Base.BPushButton

[Step]
[Step START]
[Step START Show]

[Step Show]
controls=<<EOT
user
submit
EOT
[Step Show END]
condition=submit.pushed();

[Step END]

To get rid of the syntax, have a look at Hyper::Config::Reader::Container

To generate code and a template from this file call

hyper.pl --template --file=/srv/www.example.com/etc/Example/Control/Container/User/CSelectUsername.ini

Page 2

Create a file

/srv/www.example.com/etc/Example/Control/Container/User/CChangePassword.ini

with the following content

[Control]
[Control compare_passwords]
class=Hyper.Control.Validator.Group
[Control compare_passwords Validator Group Hyper.Validator.Group.Compare]

[Control new_password]
class=Hyper.Control.Base.BInput
[Control new_password Validator Single Hyper.Validator.Single.Required]
[Control new_password Validator Named compare_passwords]
act_as=first

[Control repeat_new_password]
class=Hyper.Control.Base.BInput
[Control repeat_new_password Validator Single Hyper.Validator.Single.Required]
[Control repeat_new_password Validator Named compare_passwords]
act_as=second

[Control submit]
class=Hyper.Control.Base.BPushButton

[Step]
[Step START]
[Step START Show]

[Step Show]
controls=<<EOT
new_password
repeat_new_password
compare_passwords
submit
EOT
[Step Show END]
condition=submit.pushed() && this.is_valid();

[Step END]

To get rid of the syntax, have a look at Hyper::Config::Reader::Container

To generate code and a template from this file call

hyper.pl --template --file=/srv/www.example.com/etc/Example/Control/Container/User/CChangePassword.ini

Page 3

Create a file

/srv/www.example.com/etc/Example/Control/Container/User/CConfirmation.ini

with the following content

[Control]
[Control submit]
class=Hyper.Control.Base.BPushButton

[Step]
[Step START]
[Step START Show]

[Step Show]
controls=<<EOT
submit
EOT
[Step Show END]
condition=submit.pushed();

[Step END]

To get rid of the syntax, have a look at Hyper::Config::Reader::Container

To generate code and a template from this file call

hyper.pl --template --file=/srv/www.example.com/etc/Example/Control/Container/User/CConfirmation.ini

Connecting the Pages

Create a file

/srv/www.example.com/etc/Example/Control/Flow/User/FChangePassword.ini

with the following content

[Control]
[Control select_username]
class=Example.Control.Container.User.CSelectUsername

[Control change_password]
class=Example.Control.Container.User.CChangePassword

[Control confirmation]
class=Example.Control.Container.User.CConfirmation

[Step]
[Step START]
[Step START select]

[Step select]
controls=<<EOT
select_username
EOT
[Step select change]
condition=select_username.state eq 'END'

[Step change]
controls=<<EOT
change_password
EOT
[Step change confirm]
condition=change_password.state eq 'END'

[Step confirm]
action=<<EOT
select_username.state='START';
EOT
controls=<<EOT
confirmation
EOT
[Step confirm select]
condition=confirmation.state eq 'END'

[Step END]

To get rid of the syntax, have a look at Hyper::Config::Reader::Flow

To generate code and a template from this file call

hyper.pl --file=/srv/www.example.com/etc/Example/Control/Flow/User/FChangePassword.ini

Verify your work

Before we do the programming part it's time to see what we've created since yet.

You can use the integrated Developer Webserver to do this

perl /srv/www.example.com/bin/example/server.pl

Now connect to your page via your webbrowser using

http://localhost:8080/cgi-bin/example/index.pl?service=User&usecase=ChangePassword

Now you see your first Hyper usecase. You can't go from Page 1 to Page 2 because the username select is a required field. So we have to fill the username select with some data.

Programming

Create Data Source

Create the file

/srv/www.example.com/.htpasswd

with the following content

Andreas:X
Martin:X
Helmut:X

Fill the username select

Open the generated file

/srv/www.example.com/lib/Example/Control/Flow/User/FChangePassword.pm

and add the following code before the __END__ mark

use Authen::Htpasswd;

sub _get_authen_object :PRIVATE {
    return Authen::Htpasswd->new('/srv/www.example.com/.htpasswd');
}

sub ACTION_select {
    my $self = shift;

    $self->get_object('select_username')->get_object('user')->set_elements([
        map {
            { value => $_->username(), data => $_->username() };
        } $self->_get_authen_object()->all_users()
    ]);

    return $self;
}

sub ACTION_confirm {
    my $self   = shift;

    $self->_get_authen_object()->update_user(
        $self->get_object('select_username')
             ->get_object('user')
             ->get_value(),
        $self->get_object('change_password')
             ->get_object('new_password')
             ->get_value(),
    );

    return $self;
}

To get more information (e.g. why should you name this subroutines ACTION_* ?) have a look at Hyper::Control::Flow

Verify your work

Now restart your Developer Webserver and connect again to your page via your webbrowser using

http://localhost:8080/cgi-bin/index.pl?service=User&usecase=ChangePassword

Your usecase should be completely useable (but maybe it looks ugly).

Beautifying

Now you can edit the default templates *.htc located below

/srv/www.example.com/var/Example/

INCOMPATIBILITIES

BUGS AND LIMITATIONS

RCS INFORMATIONS

Last changed by
$Author: ac0v $
Id
$Id: Example.pod 333 2008-02-18 22:59:27Z ac0v $
Revision
$Revision: 333 $
Date
$Date: 2008-02-18 23:59:27 +0100 (Mon, 18 Feb 2008) $
HeadURL
$HeadURL: http://svn.hyper-framework.org/Hyper/Hyper-Developer/branches/0.07/lib/Hyper/Developer/Manual/Example.pod $

AUTHOR

Andreas Specht <ACID@cpan.org>

LICENSE AND COPYRIGHT

Copyright (c) 2007, Andreas Specht <ACID@cpan.org>. All rights reserved.

This module is free software; you can redistribute it and/or modify it under the same terms as Perl itself.