Problem
I am trying to display field values into a table using Zend Framework 2 and PHP/MySQL. Given the following table which is dynamically generated, I am trying to get the values shown below. Unfortunately, I only get empty values for the cell locations.
Question
How can I solve this issue to populate values into their cell locations?
Code
Controller.php
public function summaryAction()
{
return new ViewModel(array(
'actionitems' => $this->getActionItemTable()->fetchAll(),
));
}
Table.php
public function fetchAll()
{
$select = new Select();
$select->from('actionitems', array('*'))
->join('users', 'actionitems.OwnerID = users.UserID', array('OwnerLastName' => new Expression('users.lastName'), 'OwnerFirstName' => new Expression('users.firstName')));
$resultSet = $this->tableGateway->selectWith($select);
return $resultSet;
}
index.phtml
<table class="actionitemsummary">
<tr>
<th>
Team
</th>
<th>
Item #
</th>
<th>
Action Item Title
</th>
<th>
Criticality
</th>
<th>
Status
</th>
<th>
Assigned Date
</th>
<th>
Original Due Date
</th>
<th>
ECD
</th>
<th>
Closed Date
</th>
<th>
Owner
</th>
<th>
Actions
</th>
</tr>
<?php
use Application\Model\ActionItem;
/* @var $actionItem ActionItem */
?>
<?php foreach($actionitems as $actionItem): ?>
<tr>
<td class="team">
<?php echo $actionItem->team; ?>
</td>
<td class="itemnum">
<?php echo $actionItem->actionItemID; ?>
</td>
<td class="actionitemtitle">
<?php echo $actionItem->actionItemTitle; ?>
</td>
<td class="criticality">
<?php echo $actionItem->criticality; ?>
</td>
<td class="status <?php echo $actionItem->status; ?> onschedule">
<?php echo $actionItem->status; ?>
</td>
<td class="assigneddate">
<?php echo $actionItem->assignedDate; ?>
</td>
<td class="originalduedate">
<?php echo $actionItem->dueDate; ?>
</td>
<td class="ecd">
<?php echo $actionItem->ecd; ?>
</td>
<td class="closeddate">
<?php echo $actionItem->closedDate; ?>
</td>
<td class="owner">
<?php echo $actionItem->ownerID; ?>
</td>
<td class="actions">
<a href="">View</a>
</td>
</tr>
<?php endforeach; ?>
</table>
EDIT:
var_dump($resultSet);
object(Zend\Db\ResultSet\ResultSet)[287]
protected 'allowedReturnTypes' =>
array (size=2)
0 => string 'arrayobject' (length=11)
1 => string 'array' (length=5)
protected 'arrayObjectPrototype' =>
object(Application\Model\ActionItem)[258]
public 'actionItemID' => null
public 'status' => null
public 'actionItemTitle' => null
public 'railName' => null
public 'team' => null
public 'criticality' => null
public 'assignedDate' => null
public 'ecd' => null
public 'dueDate' => null
public 'closedDate' => null
public 'completionDate' => null
public 'closureCriteria' => null
public 'notes' => null
public 'assignorID' => null
public 'ownerID' => null
public 'altOwnerID' => null
public 'approverID' => null
public 'rejectionJustification' => null
public 'approvalStatement' => null
public 'closureStatement' => null
public 'actionItemStatement' => null
protected 'returnType' => string 'arrayobject' (length=11)
protected 'buffer' =>
array (size=0)
empty
protected 'count' => int 15
protected 'dataSource' =>
object(Zend\Db\Adapter\Driver\Pdo\Result)[264]
protected 'statementMode' => string 'forward' (length=7)
protected 'fetchMode' => int 2
protected 'resource' =>
object(PDOStatement)[265]
public 'queryString' => string 'SELECT `actionitems`.*, users.lastName AS `OwnerLastName`, users.firstName AS `OwnerFirstName` FROM `actionitems` INNER JOIN `users` ON `actionitems`.`OwnerID` = `users`.`UserID`' (length=178)
protected 'options' => null
protected 'currentComplete' => boolean true
protected 'currentData' =>
array (size=22)
'ActionItemID' => string '1' (length=1)
'Status' => null
'Team' => null
'Criticality' => string '1 - High' (length=8)
'AssignedDate' => string '2015-06-11' (length=10)
'DueDate' => string '2015-06-02' (length=10)
'CompletionDate' => null
'ECD' => string '2015-06-07' (length=10)
'ClosedDate' => null
'ActionItemTitle' => string 'test' (length=4)
'ActionItemStatement' => string 'test' (length=4)
'AssignorID' => string '1' (length=1)
'OwnerID' => string '1' (length=1)
'AltOwnerID' => string '1' (length=1)
'ApproverID' => null
'RejectionJustification' => null
'ApprovalStatement' => null
'ClosureCriteria' => string 'test' (length=4)
'ClosureStatement' => null
'Notes' => string 'test' (length=4)
'OwnerLastName' => string 'TEST' (length=13)
'OwnerFirstName' => string 'TEST' (length=4)
protected 'position' => int 0
protected 'generatedValue' => string '0' (length=1)
protected 'rowCount' => int 15
protected 'fieldCount' => int 22
protected 'position' => int 0
The following returns all records as above:
for ($i = 0; $i < $resultSet->count(COUNT_NORMAL); $i++)
{
var_dump($resultSet);
$resultSet->next();
}
Answer
The exchange array method shown below needs to have proper case for the $data array elements. I revised all lines starting with the sample one below to have the proper case. Since ActionItemID is a string it needs to have to the proper case of the ActionItemID.
Answer Snippet Code (within exchangeArray method)
How I arrived at the solution...
Step 1) In order to detect the issue I used the following code to see what was happening within fetchAll() of my Table class.
Step 2) Then after inspecting the var_dump output produced
Step 3) I observed the last line from the code above signaled the proper case for ActionItemID which then led to changing the case below.
Step 4) I changed my code from having 'actionItemID'
Step 5) To this (Note Capitalization of 'ActionItemID')
$this->actionItemID = (isset($data['ActionItemID'])) ? $data['ActionItemID'] : null;
Conclusion
Since strings are Case Sensitive, one must adhere to the proper capitalization especially when using that string within an associative array as in this case. Otherwise the array element will not have a value and will not be set and it would lead to null being assigned to the actionItemID and all other fields as was observed in the question.