[Cascavel-pm] Criando Metodos perl + windows

Daniel de Oliveira Mantovani daniel.oliveira.mantovani em gmail.com
Quarta Abril 15 14:05:59 PDT 2009


<codigo>

sub Consulta {

    use Teste::Model::MySql;

    my $db = Teste::Model::MySql::Conecta();

    if ($db) {

        my $conn = Teste::Model::MySql::Query($db, "SELECT id_cliente, nome
FROM cliente");

        my $ref_fields = $conn->fetchall_arrayref;

        return $ref_fields;

    } else {

        return 0;

      }

}

</codigo>

Agora você tem um AoA:
perldoc perldsc: http://www.perl.org.br/Perldoc/V500807/Perldsc
perldoc perlref

Para pegar o id_cliente e o nome é só fazer agora:
<code>
foreach my $item (@{ $ref_fields }) {

print "id_cliente" . $item->[0] . "\n";
print "nome" . $item->[1] . "\n";
}
</code>

Não precisa de toda aquela volta, entendeu ?


<seu_codigo>

package Teste::Model::Cliente;
sub Consulta {
    use Teste::Model::MySql;
    my $db = Teste::Model::MySql::Conecta();
    if ($db ne "") #Não precisa disso, apenas $if($db) é o suficiente.
    {
        my $conn = Teste::Model::MySql::Query($db, "SELECT id_cliente, nome
FROM cliente");
        my (@fields) = ("id_cliente", "nome");
        my %results;
        @results{@fields} = ();
        $conn->bind_columns(map { \$results{$_} } @fields);
        return (\%results, sub { $conn->fetch() });
    }
    else
    {
        return ("false", "false"); #Não é bom usar isso, retorne undef.
    }
}

</seu_codigo>

<seu_codigo>
    use Teste::Controller::Cliente;

# - Não jogue HTML desse jeito, use CGI ou Template Toolkit.
# http://search.cpan.org/~lds/CGI.pm-3.43/CGI.pm
# http://search.cpan.org/~abw/Template-Toolkit-2.20/lib/Template/Toolkit.pod

    print "Content-type: text/html\n\n";
    print "<html>\n";
    print "<head>\n";
    print "  <title>Lista Clientes</title>\n";
    print "</head>\n";
    print "<body>\n\n";
    my ($res, $conn) = Teste::Controller::Cliente::Consulta();
    if ($res ne "false")  #Agora que você colocou undef no lugar de "false"
você pode fazer: $if ($ref), muito mais elegante.
    {
        while ($conn->()) {
            print "$res->{id_cliente} - \n";
            print "$res->{nome} \n";
            print "<br>";
        }
    }

    print "</body>\n";
    print "</html>\n";

</seu_codigo>

Você já leu o perldoc perlbot?
http://www.perl.org.br/Perldoc/V500807/Perlbot

Não use DBI use DBIx::Class
http://search.cpan.org/~ash/DBIx-Class-0.08013/lib/DBIx/Class.pm

Fazer isso usando Catalyst é muito mais simples, é um framework MVC no
próprio manual existem alguns exemplos simples.
O Thiago, fez um tutorial muito bom:
http://www.maluco.com.br/perl/catalyst.html

[]s

2009/4/15 Ricardo Zanotto Zaniol <zanottors em gmail.com>

> Olá pessoal, estou com um problema na criação de métodos no Perl, a minha
> estrutura atual é a seguinte:
>
> C:\perl\lib\Teste\Controller
>
> Na pasta controller (business manager) tenho o arquivo cliente.pm
>
> package Teste::Controller::Cliente;
> sub Consulta {
>     use Teste::Model::Cliente;
>     my ($res, $conn) = Teste::Model::Cliente::Consulta();
>     return($res, $conn);
> }
> =========================================================================
>
> C:\perl\lib\Teste\Model
>
> Na pasta Model (Banco de Dados) tenho dois arquivos o cliente.pm
>
> package Teste::Model::Cliente;
> sub Consulta {
>     use Teste::Model::MySql;
>     my $db = Teste::Model::MySql::Conecta();
>     if ($db ne "")
>     {
>         my $conn = Teste::Model::MySql::Query($db, "SELECT id_cliente, nome
> FROM cliente");
>         my (@fields) = ("id_cliente", "nome");
>         my %results;
>         @results{@fields} = ();
>         $conn->bind_columns(map { \$results{$_} } @fields);
>         return (\%results, sub { $conn->fetch() });
>     }
>     else
>     {
>         return ("false", "false");
>     }
> }
> ====================================================
>
> E o outro arquivo MySql.pm
>
> package Teste::Model::MySql;
> use DBI;
>
> my $driver   = "mysqlPP";
>
> my $server   = "localhost";
> my $database = "banco";
> my $user     = "usuario";
> my $password = "senha";
>
> sub Conecta
>
> {
>    my $url = "DBI:$driver:$database:$server";
>    my $dbh = DBI->connect( $url, $user, $password,
>                                { PrintError => 0 });;
>    return($dbh);
> }
> sub Query
> {
>    my($conn, $consulta) = @_;
>    my $sql = qq{ $consulta };
>    my $sth = $conn->prepare( $sql );
>    $sth->execute() ;
>    return($sth);
> }
> ========================================================
>
> pasta onde estaria o site web
>
> C:\inetpub\wwwroot\ListaCliente.pl
>
> use Teste::Controller::Cliente;
> print "Content-type: text/html\n\n";
> print "<html>\n";
> print "<head>\n";
> print "  <title>Lista Clientes</title>\n";
> print "</head>\n";
> print "<body>\n\n";
> my ($res, $conn) = Teste::Controller::Cliente::Consulta();
> if ($res ne "false")
> {
>     while ($conn->()) {
>         print "$res->{id_cliente} - \n";
>         print "$res->{nome} \n";
>         print "<br>";
>     }
> }
>
> print "</body>\n";
> print "</html>\n";
> ==========================================================
>
> Essa estrutura até funciona mas quando eu manipulo os registros na camada
> controller (Cliente.pm) eu nao consigo listar novamente os registros na
> camada de visualização(ListaCliente.pl)
>
> Gostaria de saber se alguem tem um exemplo melhor de como dividir a
> aplicação em camadas, e como eu poderia modificar essa estrutura de uma
> forma mais simplificada.
>
> Estou usando esta estrutura em uma maquina com windows2003 + IIS + MySql.
>
> Obrigado...
>
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>



-- 
http://mantovanihouse.blogspot.com/
This is my poney:
-------(\_------------_/)-----------
-------)--(----------)--(-----------
------(----(---------)----)----------
-------)----(-------)----(-----------
-------(----(-------)----)-----------
--------\_-(\\.---.//)-_/------------
----------\)' -8--8- '(/--------------
-----------/------------\---------------
----------(--)--------(--)--------------
------------(_c__c_)----------------
----------------------------------------
perl -MLWP::Simple -le 'grep{ print $1 if /href="(http.+?)"/}split($/,get("
http://www.perl.org.br"))'
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/cascavel-pm/attachments/20090415/99dcc2ff/attachment.html>


Mais detalhes sobre a lista de discussão Cascavel-pm