Search code examples
phphtmlformslaravellaravel-3

Best way to handle dynamic amount of form fields in PHP?


I have a system where I need to list an arbitrary amount of employees with a textfield for each day of the week where an "hours worked" value can be entered.

So I need to generate a table with a dynamic number of rows, and each row is going to contain 7 text fields. I'm just wondering what is the best convention to use when assigning ID's to these fields to make it easy to iterate over once I receive the input data on my back end?

Each row will have an ID number associated with the row that represents the employee's ID.

It would be awesome to be able to do something like:

foreach($rows as $row)
{
     $id = $row['id'];

     $employee = Employee::find($id);

     foreach($row['hoursWorked'] as $dailyHours)
     {
           $timecard = new Timecard();
           $timecard->hours = $dailyHours;
           $employee->timecards->insert($timecard);
     }
}

What's the best way to structure my form and ID my inputs on the HTML side to make this as painless as possible?

As a sidenote, I'm working within the Laravel 3 framework in case that opens up any other solutions.


Solution

  • <input type="text" name="hoursWorked[]" /> will internally convert to an array under $_POST['hoursWorked']. That means you can do something like this:

    <input type="text" name="hoursWorked[12345][]" /> <!-- Sunday -->
    <input type="text" name="hoursWorked[12345][]" /> <!-- Monday -->
    <input type="text" name="hoursWorked[12345][]" /> <!-- Tuesday -->
    <input type="text" name="hoursWorked[12345][]" /> <!-- Wednesday -->
    <input type="text" name="hoursWorked[12345][]" /> <!-- Thursday -->
    <input type="text" name="hoursWorked[12345][]" /> <!-- Friday -->
    <input type="text" name="hoursWorked[12345][]" /> <!-- Saturday -->
    

    Then, in PHP:

    <?php
    foreach ($_POST['hoursWorked'] as $employeeId=>$dayArray) {
        foreach ($dayArray as $dayOfWeek=>$hoursWorked) {
            // $employeeId will be 12345
            // $dayOfWeek will be 0, 1, 2, 3, 4, 5 ,6
            // $hoursWorked will be the value of the text field
        }
    }