in reply to Re^4: How to skip certain values in a foreach loop
in thread How to skip certain values in a foreach loop

Thank you Mr. Anonymous Monk ;-)

The idea you had is surely great when being able to define the template structure used yourself. Unfortunatly, I'm forced to use what the Bugzilla Crew gives me to work with :-(
What I'm programming is an addon for my company for Bugzilla.

I've been able to modify the code so far, that the users are selected from the database and written into an array. the code looks like this:
--> in the external module, embedded in a sub: # Get user realnames for project my $sql = "SELECT DISTINCT realname FROM database.time_data WHERE vers +ion='$Version' AND product_id='$ProductID' AND milestone='$MileStone' +"; #user_id, my $sth = $dbh->prepare($sql); $sth->execute(); while(my @RowAdmin = $sth->fetchrow_array()) { push (@$AdminUsers, $RowAdmin[0]); } my $vars2 = { Users => [@$AdminUsers], Dates => [ { Day => 'day1', EndDates => [qw(dl1 dl2 dl3 dl4 dl5)], }, { Day => 'day2', EndDates => [qw(dl6 dl7 dl8 dl9 dl10)], }, { Day => 'day3', EndDates => [qw(dl11 dl12 dl13 dl14 dl15)], }, ], }; return($vars2); --> in the main script (buglist.cgi): # call subroutine my $vars2 = Admin(\@ReturnValues, \@AdminUsers); # pass results to template $vars->{'vars2'} = $vars2; --> in the template (table.html.tmpl): <table class=table> <tr class="[% loop.parity %]"> <td class=title_td colspan=6>Coordinator overview:</td> </tr> <tr class="[% loop.parity %]"> <td class=title_td>date</td> [% FOREACH realname IN vars2.Users %] [% FOREACH realname IN realname %] <td class=title_td>[% realname %]</td> [% END %] [% END %] </tr> [% FOREACH row IN vars2.Dates %] <tr class="[% loop.parity %]"> <td class=var_td>[% row.Day %]</td> [% FOREACH date IN row.EndDates %] <td class=var_td>[% date %]</td> [% END %] </tr> [% END %] </table>
Output: date user1 user2 user3 user4 user5 day1 dl1 dl2 dl3 dl4 dl5 day2 dl6 dl7 dl8 dl9 dl10 day3 dl11 dl12 dl13 dl14 dl15 What I don't quite see yet, is how I can get the days and the deadline part to be automated. I don't know how many days there are in the database and each day, a new dataset is added to the database and maybe there will be more than 5 users on a project at any time, so I have to somehow get the results I select from the database into the code you showed (wow, that rhymes). Embedding a while loop in the Dates=> part isn't possible, that was my first idea. So I would somehow have to rebuild the code, in order to automate the whole thing. I've only been programming in Perl for 4 weeks now so, to tell the truth, I'm a bit overstrained with the rebuilding needed here.
What would I need to do, to keep the output the same, but change the way it's processed beforehand to arrays or hashes?
Really sorry so being so helpless :-(

Regards

Fred

Replies are listed 'Best First'.
Re^6: How to skip certain values in a foreach loop
by Anonyrnous Monk (Hermit) on Dec 29, 2010 at 11:06 UTC

    My main point was that it's much easier to transform your data with Perl, than to cope with data structures that are suboptimal for the template in question on the Template Toolkit side.  Perl is a very powerful general purpose programming language, while the Template Toolkit mini language is special purpose and (deliberately) limited in features — otherwise you might as well directly embed Perl code into the HTML template... (as some other templating systems do, btw).

    In other words, to transform a linear array of deadlines (as you seem to get from your db query) into a more appropriate structure, you could do something like this:

    #!/usr/bin/perl -w use strict; my @dls = 'dl01'..'dl20'; # what you start out with my $nusers = 5; my $vars; for (my $i = 0; $i < @dls; $i += $nusers) { push @{ $vars->{Dates} }, { EndDates => [ @dls[$i..$i+$nusers-1] ] }; } use Data::Dumper; print Dumper $vars; __END__ $VAR1 = { 'Dates' => [ { 'EndDates' => [ 'dl01', 'dl02', 'dl03', 'dl04', 'dl05' ] }, { 'EndDates' => [ 'dl06', 'dl07', 'dl08', 'dl09', 'dl10' ] }, { 'EndDates' => [ 'dl11', 'dl12', 'dl13', 'dl14', 'dl15' ] }, { 'EndDates' => [ 'dl16', 'dl17', 'dl18', 'dl19', 'dl20' ] } ] };

    This is just an example, which you'd have to tailor to your circumstances, like adding the Day entries, etc.

      YOU sir, are a VERY nice person :-)

      Thank you very much for the help - added the users and days and everything's working as intended! :-D

      Regards,

      Fred