[Catalyst] Submitting Multiple Arrays

Jay Varner jayvarner at gmail.com
Thu Jan 31 01:35:49 GMT 2008


In short, I'm new to Catalyst and a near intermediate Perl programmer.
I've converted (and vastly improved) my app from CGI::Application to
Catalyst within an amount of time that made me feel like I wasted
those months I spent prior to using Catalyst. However, the past few
days I have been struggling with this one function that I just can't
get.

Honestly, I feel the easiest way for me to explain is to say that this
headache began by me trying to translate this bit of PHP code to
Perl/Catalyst: http://www.gregphoto.net/index.php/2007/01/16/scriptaculous-sortables-with-ajax-callback/

I'm just stuck. I've tried many things. My current/pressing attempt to
implement this is in a newsletter app where there is a "has many"
relationship between a Newsletter table and a table for Articles. The
join table has 3 columns – newsletter_id, article_id and ordering. So
I want to use that PHP and Ajax to allow a user to set the order that
articles will appear in a given newsletter. However, some articles
might appear in multiple newsletters. I might be going about this all
wrong and I would love to hear any suggestion of a better way.

For what it is worth, here is my current effort. I don't know if this
is the closest I've gotten, but it's where I'm at right now. This is
not actually my attempt at the the above, it's really just a scaled
back attempt to just figure out the DBIx for it begin sent by a basic
HTML form and not any Ajax shenanigans.

sub reorder : Local {
    my ($self, $c ) = @_;

	# This just gets the the value for the later redirect to stay on the same page
	my $link = $c->request->params->{link};

	# This is from a hidden value in a loop in the template [% article.id %]
	my @articles = $c->request->params->{article_id};

	# Value for the newsletter we're working on. Again, this is from a hidden value
	my $newsletter_id = $c->request->params->{newsletter_id};

	# This is obviously where I start trying shit to see if I can get it to work
	# The basic goal is to drop in the new value for ordering for each unique
	# article_id and newsletter_id in turn
	foreach my $article ( @articles ) {
            	my $newsletter  = $c->model('SASSDB::ArticleNewsletter')->search(
                                            {
                                            article_id => $article,
                                            newsletter_id => $newsletter_id
                                            }
                                            );
            		my @orderings = $c->request->params->{ordering};
            			foreach my $ordering ( @orderings ) {
                				$newsletter->update(
                            			{
                            			ordering => $ordering
                            			}
                            		);


            			}
		}

	$c->response->redirect($c->uri_for("/admin/newsletters/picked_articles/$link"));

}

This reasonably gives me the following:
DBIx::Class::ResultSet::update(): DBI Exception: DBD::mysql::st
bind_param failed: Illegal parameter number [for Statement "UPDATE
articles_newsletters SET ordering = 1 WHERE ( ( ( article_id = ? ) OR
( article_id = ? ) ) AND newsletter_id = ? )" with ParamValues:
1='12', 0='2', 2='18'] at ../lib/SASS/Controller/Admin/Newsletters.pm
line 200

Line 200 is  "$newsletter->update("

The body_parameters are:
body_parameters  => {
                        _submit => "Update",
                        _submitted_edit_menu => 1,
                        "_submitted_form_create" => 1,
                        article_id => [12, 18],
                        id => 1,
                        "link" => "Test",
                        newsletter_id => 1,
                        ordering => [1, 2],
                      },

Let me know if you want to see anything else.

Humbly placing myself on the mercy of the community,
Jay



More information about the Catalyst mailing list