Schrift
[thread]3016[/thread]

Catalyst + Model::DBIC - Verzweiflung

Leser: 1


<< |< 1 2 >| >> 11 Einträge, 2 Seiten
Strat
 2006-05-06 01:46
#28511 #28511
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Hallo Leute,

zum Lernen von Catalyst fuer das neue Forum spiele ich mal mit Catalyst herum, und habe Probleme bei der Datenbankanbindung, an der ich jetzt schon etwa vier Stunden rumprobiere.

Code: (dl )
1
2
3
4
catalyst MyPBoard
cd MyPBoard
script\MyPBoard_create.pl view HTC HTML::Template::Compiled
script\mypboard_create.pl controller User

In lib\MyPBoard\View\HTC.pm sub new hinzugefuegt:
Code: (dl )
1
2
3
4
sub new {
my ($self) = shift;
return $self->SUPER::new(@_);
} # new

In .\myboard.yml folgendes (und ein paar weitere Parameter) hinzugefuegt:
Code: (dl )
1
2
3
4
template:
# cache_dir: './tmp/htc'
path: './templates'
global_vars: 1

in .\lib\MyPBoard\Controller\User.pm die folgenden Subs reingeschrieben:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sub list : Path('/user/list') {
my ($self, $c) = @_;

my %data = ( template => 'user/list.tmpl',
title => 'Benutzerliste',

navigationfile => 'sub_naviagtion_user.tmpl',
username => 'XXXXXX',
show_images => 1,
);

while (my ($k, $v) = each %data) { $c->stash->{$k} = $v }

die;
} # list
# ------------------------------------------------------------
sub end : Private {
my ($self, $c) = @_;

$c->forward("MyPBoard::View::HTC");
} # end

das template list.tmpl nach user/list.tmpl gestellt

Bisher laeuft alles, wie ich es erwarte, keine warnungen/fehler usw.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
Strat
 2006-05-06 01:58
#28512 #28512
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
ich will jetzt also die Datenbank hinzufuegen:
Code: (dl )
script\mypboard_create.pl model PBDB DBIC dbi:mysql:dbname=pboard username password

sieht auch gut aus, und es laeuft noch alles, wenn ich es z.B. mit
Code: (dl )
script\mypboard_server.pl

starte.

Jetzt wuerde ich aber in der sub list gerne die User holen, also in User.pm in der sub hinzugefuegt:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
sub list : Path('/user/list') {
my ($self, $c) = @_;

my $data = $c->model('PBDB')->table('PbUser')
->search( {'order_by' => 'id ASC'} );

my %data = ( template => 'user/list.tmpl',
title => 'Benutzerliste',

navigationfile => 'sub_naviagtion_user.tmpl',
username => 'XXXXXX',
show_images => 1,
userlist => $data,
);

while (my ($k, $v) = each %data) { $c->stash->{$k} = $v }

} # list

da kommt immer
Code: (dl )
Caught exception in MyPBoard::Controller::User->list "Can't call method "search" on an undefined value at E:/web/PBoard_Catalyst/MyPBoard/script/../lib/MyPBoard/Controller/User.pm line 14."

Im Parley-Board wird das so aehnlich gemacht; ich habe gross/kleinschreibung der Tabellen ausprobiert (die Tabelle heisst pb_user), mit Data::Dumper rumgespielt, Catalyst+DBIx-Doku gelesen, aber ich komme nicht dahinter wieso.

Wo mache ich den Bloedsinn?

hier noch der output
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Fri May  5 23:56:14 2006] [catalyst] [info] MyPBoard powered by Catalyst 5.68
ou can connect to your server at http://dahoam:3000
Fri May 5 23:56:16 2006] [catalyst] [debug] **********************************

Fri May 5 23:56:16 2006] [catalyst] [debug] * Request 1 (0.333/s) [748]
Fri May 5 23:56:16 2006] [catalyst] [debug] **********************************

Fri May 5 23:56:16 2006] [catalyst] [debug] "GET" request for "user/list" from
"127.0.0.1"
Fri May 5 23:56:16 2006] [catalyst] [debug] Path is "user/list"
Fri May 5 23:56:16 2006] [catalyst] [debug] Rendering template "user/list"
Fri May 5 23:56:16 2006] [catalyst] [error] Caught exception in MyPBoard::Cont
oller::User->list "Can't call method "search" on an undefined value at E:/web/P
oard_Catalyst/MyPBoard/script/../lib/MyPBoard/Controller/User.pm line 14."
Fri May 5 23:56:16 2006] [catalyst] [error] Caught exception in MyPBoard::View
:HTC->process "'user/list' not found at D:/wamp/Perl815/site/lib/Catalyst/View/
TML/Template/Compiled.pm line 112"
Fri May 5 23:56:16 2006] [catalyst] [info] Request took 0.039157s (25.538/s)
\n\n

<!--EDIT|Strat|1146866764-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
esskar
 2006-05-06 02:57
#28513 #28513
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Strat,05.05.2006, 23:46]
Code: (dl )
1
2
3
4
sub new {
   my ($self) = shift;
   return $self->SUPER::new(@_);
} # new
[/quote]
warum das?
esskar
 2006-05-06 03:00
#28514 #28514
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
du brauchst ein schema:

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
package PBoard::Schema::DBIC;
use base qw/DBIx::Class::Schema/;

use DateTime::Format::Pg ();

__PACKAGE__->load_classes(
qw[
PbBoardBoards PbBoardMessages PbBoardSettings PbBoardThreads
PbRole
PbUser PbUserProfile PbUserRole PbUserSession PbUserSettings
]
);

1;


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package PBoard::Schema::DBIC::PbUser;
use base qw/DBIx::Class/;

__PACKAGE__->load_components(qw[ PK::Auto Core ]);
__PACKAGE__->table('pboard.pb_user');
__PACKAGE__->add_columns(qw[ user_id username password old_user_id ]);
__PACKAGE__->set_primary_key(qw[ user_id ]);

__PACKAGE__->has_many( roles => 'PBoard::Schema::DBIC::PbUserRole', 'user_id' );
__PACKAGE__->has_one(
profile => 'PBoard::Schema::DBIC::PbUserProfile',
'user_id'
);
__PACKAGE__->has_one(
settings => 'PBoard::Schema::DBIC::PbUserSettings',
'user_id'
);

use Crypt::SaltedHash ();
use Digest::MD5 ();

sub check_password {
my ( $self, $password ) = @_;

if ( $password =~ m[^{.*}] ) { # like {SHA256}
my $salt_len =
$self->can("password_salt_len") ? $self->password_salt_len : 0;

return Crypt::SaltedHash->validate( $self->password, $password,
$salt_len );
}
else {

# old board method

my $passdword_digest =
&Digest::MD5::md5_hex( $password . lc( $self->username ) );

return $self->password eq $passdword_digest;
}
}

sub get_group {
my ( $self ) = @_;

my $roles = $self->roles;

}

1;


und dann nur noch ein Model

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package PBoard::Model::DBIC;

use strict;
use base 'Catalyst::Model::DBIC::Schema';

__PACKAGE__->config(
schema_class => 'PBoard::Schema::DBIC',
connect_info => [
'dbi:Pg:dbname=pboard',
'pboard',
'pboard',
{RaiseError => 1, PrintError => 0, AutoCommit => 1},
],
);

1;
esskar
 2006-05-06 03:13
#28515 #28515
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[quote=Strat,05.05.2006, 23:46]zum Lernen von Catalyst fuer das neue Forum spiele ich mal mit Catalyst herum, und habe Probleme bei der Datenbankanbindung, an der ich jetzt schon etwa vier Stunden rumprobiere.[/quote]
du könntest dich auch einfach noch etwas gedulden; werde versuchen, Mitte nächster Woche den Code auf develop2 zum Laufen zu bringen; dann kannst du dir einfach die Sache anschauen. :-)
Strat
 2006-05-06 12:56
#28516 #28516
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
Beim Parley-Forum habe ich mir's schon angeschaut; der einzige Unterschied sind andere Namensraeume, MySql anstelle von Pg und Dateinamen. Parley selbst habe ich bei mir unter XP noch nicht zum laufen gebracht, weil Cache-FastMmap-1.09 bei nmake Probleme macht, weil es unistd.h nicht findet. muss ich doch mal suchen warum...
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
esskar
 2006-05-06 13:18
#28517 #28517
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
tausch es aus.
z.b. durch Catalyst-Plugin-Cache-Memcached
einfach im Parly.pm statt Cache-FastMmap, Cache-Memcached schreiben :)
esskar
 2006-05-06 13:20
#28518 #28518
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
mit der neusten DBIx version funzt folgendes auch nicht mehr:

Code: (dl )
1
2
my $data = $c->model('PBDB')->table('PbUser')
               ->search( {'order_by' => 'id ASC'} );

außer, du hast ein Schema angelegt (s.o)
versuch mal:

Code: (dl )
1
2
my $data = $c->model('PBDB')->table('PbUser')
               ->schema_instance->search( {'order_by' => 'id ASC'} );
\n\n

<!--EDIT|esskar|1146907225-->
Strat
 2006-05-06 14:33
#28519 #28519
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
danke fuer die hilfe.

mit ->schema_instance->search funzts bei mir auch nicht
Code: (dl )
Caught exception in MyPBoard::Controller::User->list "Can't call method "schema_instance" on an undefined value at E:/web/PBoard_Catalyst/MyPBoard/script/../lib/MyPBoard/Controller/User.pm line 14."

aber irgendwie habe ich das gefuehl, dass das problem mit der DB zusammenhaengt...
Code: (dl )
die Dumper $c->model('PBDB')->table('PbUser');

ergibt irgendwie undef...
Code: (dl )
die Dumper $c->model('PBDB')->table('pb_user');

sieht ev. besser aus:
Code: (dl )
$VAR1 = 'MyPBoard::Model::PBDB::PbUser';

sobald ich folgendes dranhaenge:
Code: (dl )
1
2
3
my $data = $c->model('PBDB')->table('pb_user')
->search( { 'order_by' => 'id ASC' } );
die Dumper $data;

kommt was, was wie sql aussieht:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$VAR1 = bless( {
'attrs' => {
'alias' => 'me',
'as' => [
'id',
'nick',
'password',
'oldId'
],
'collapse' => {},
'from' => [
{
'me' => 'pb_user'
}
],
'order_by' => [],
'seen_join' => {},
'select' => [
'me.id',
'me.nick',
'me.password',
'me.oldId'
],
'where' => {
'order_by' => 'id ASC'
}
},
...

ich versuch mal, ob ich dort die werte irgendwie im template verwenden kann.
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
sri
 2006-05-07 13:44
#28520 #28520
User since
2004-01-29
828 Artikel
BenutzerIn
[Homepage] [default_avatar]
Nimm lieber Catalyst::Model::DBIC::Schema anstelle von Catalyst::Model::DBIC, das ist jetzt schon seit Monaten deprecated.

Am besten schaust du in Task::Catalyst, da sind die empfohlenen Komponenten aufgelistet.
<< |< 1 2 >| >> 11 Einträge, 2 Seiten



View all threads created 2006-05-06 01:46.