[Catalyst] Generate dynamic list

Gavin Henry ghenry at perl.me.uk
Mon Apr 9 08:43:10 GMT 2007


<quote who="Gavin Henry">
> <quote who="Danny Warren">
>> I just insclude the prototype.js script directly in my html template
>> whenever I need to use prototype.  More info:
>>
>> http://www.prototypejs.org/
>> http://wiki.script.aculo.us/scriptaculous/show/Prototype
>>
>> Danny Warren
>>
>>
>
> Yeah, Javascript is the way to go. Here's what I do with Dojo:
>
> myapp.yml:
>
> # Used to expose subusers as JSON data for Dojo
> View::JSON:
>     expose_stash: users
>
>
>
> Controller:
>
> 399 	sub repousers : Local {
> 400 	    my ( $self, $c ) = @_;
> 401 	    my $subid = $c->req->param('subscriber');
> 402
> 403 	    my $users;
> 404 	    if ($subid eq 'all') {
> 405 	        $users = [ $c->model('AdminDB::SubUsers')->all() ];
> 406 	    }
> 407 	    else {
> 408 	        $users = [ $c->model('AdminDB::SubUsers')
> 409 	            ->search( { subscriber_id => $subid } )->all() ];
> 410 	    }
> 411
> 412 	    $c->stash->{users} = {};
> 413 	    for my $user (@{$users}) {
> 414 	        $c->stash->{users}->{$user->account_id} = $user->email;
> 415 	    }
> 416
> 417 	    $c->detach('Admin::View::JSON');
> 418 	}
>
>
> This make a JSON object like {"10": "name at name.com", "11":
> "name1 at name.com"}
>
>
> Now in the include that has js in:
>
> dojo.require("dojo.lfx.html");

Normally I would use dojo.event.connect in dojo.addOnLoad(init), but the
below content is pulled in via a ContentPane, so the Id isn't there yet
;-)

>
> 212 function getRepoUsers(subid, selectid) {
> 213 	users = dojo.byId(selectid);
> 214 	dojo.io.bind({
> 215 	    url: "[% c.uri_for('/admin/subscribers/repousers'); %]",
> 216 	    method: "POST",
> 217 	    content: { subscriber: subid },
> 218 	    // Setting this mimitype and dojo automatically converts
> 219 	    // the incoming data from JSON to an object. Without it
> 220 	    // we need: var repousers = dojo.json.evalJson(data);
> 221 	    mimetype: 'text/json',
> 222 	    load: function(type, repousers) {
> 223 	       users.options.length = 0;
> 224 	       users.options[0] = new Option('Select...', 'all', true);
> 225 	       var i = 0;
> 226 	       for (var key in repousers) {
> 227 	           users.options[(i+1)] = new Option(repousers[key], key,
> false);
> 228 	           i++;
> 229 	       }
> 230 	       dojo.lfx.html.highlight(selectid, '#F5FF97', 700).play(300);
> 231 	     }
> 232   });
> 233 }
>
> content: { subscriber: subid } is for the first select box, and we set a
> onchange="getRepoUsers();" for it.
>
> That POSTs the subid, we do the search via the DB and then send back JSON
> data which is also used in above inside the "load:" to create the second
> select box data and highlight, then fade the new info.
>
> TT:
>
> 3 	[% IF deexadmin %]
> 4 	<tr>
> 5 	    <td><label for="subidfilter">Subscriber:</label></td>
> 6 	    <td><select name="subidfilter" id="subidfilter"
> onchange="getDeexRepoUsers(this.value, 'users');">
> 7 	            <option value="all">All</option>
> 8 	        [% FOREACH subscriber IN subscribers %]
> 9 	            <option value="[% subscriber.subid %]">[%
> subscriber.suborgname %]</option>
> 10 	        [% END %]
> 11 	        </select>
> 12 	    </td>
> 13 	</tr>
> 14 	[% END %]
> 15 	<tr>
> 16 	<td><label for="users">User:</label></td>
> 17 	<td>
> 18 	    <select name="users" id="users">
> 19 	            <option value="all">All</option>
> 20 	        [% FOREACH user IN users %]
> 21 	            <option value="[% user.account_id %]">[% user.email
> %]</option>
> 22 	        [% END %]
> 23 	    </select>
> 24 	</td>
> 25 	</tr>
>
> Easy! ;-)
>
> Gavin.
>
> --
> Walking the road to enlightenment... I found a penguin and a camel on the
> way..... Fancy a yourname at perl.me.uk? Just ask!!!
> http://perlmonks.org/?node_id=386673
>
> _______________________________________________
> List: Catalyst at lists.rawmode.org
> Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst
> Searchable archive:
> http://www.mail-archive.com/catalyst@lists.rawmode.org/
> Dev site: http://dev.catalyst.perl.org/
>




More information about the Catalyst mailing list