Issue Tracker
From FiFormsWiki
- This tutorial is designed for someone who has a good understanding of the principles of interactive development using PHP, Apache, and MySQL. (A decent understanding of the principles of Object oriented programming couldn't hurt either).
- An issue tracking database could be used by a company maintenance department for tracking broken equipment and service calls.
Requirements
- PHP 5 or later
- Apache 2 or later
- MySQL 5 or later
- and Fiforms
Recommendations
- xampp
- SciTE (free text editor)
Start
- Create a new database called "tutorials", and add a table to it called "issues".
CREATE TABLE `issues` ( `id` INT( 7 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `status` varchar(20) NOT NULL , `description` VARCHAR( 50 ) NOT NULL , `assignedTo` VARCHAR(15) NOT NULL , `workLog` TEXT NULL , `department` VARCHAR(20) NOT NULL , `startDate` DATE NOT NULL , `dueDate` DATE NUll , `endDate` DATE NULL ) ENGINE = MYISAM;
- Now create a file called issues.php and place it into your apache root folder. And put this inside it:
<?php
require_once("FiForms_FiForm.inc.php"); //include FiForms
$frm = new FiForm("Issue Tracker"); // issue tracker constructor declaration
$frm->dataServer = "localhost"; // the server the data is on
$frm->dataDB = "tutorials"; // the database you are going to connect to
$frm->dataTable = "issues"; // the name of the table.
$frm->autoinputs(); // method used for automatically generating iInputs
echo $frm->drawFormPage(); //the method used to create the form.
?>
- Go to http://localhost/issues.php
- Enter a user and password that has the access rights in your MySQL database to view/edit the tutorials database.
- Once you are logged in, you should see a form that looks something like this:
Final Code
<?php
/*All manual additions to the ‘$_GET’ array are kept by FiForms automatically.
I am adding “I” as an element to the $_GET array for the purpose of redirection
to a path with the proper $_GET elements if they are not present.
*/
if($_GET['I'] != 1)
{
header('Location: issues.php?sheetView=YES¤tRec=0&I=1');
}
require_once("FiForms_FiForm.inc.php"); //include FiForms
$frm = new FiForm("Issue Tracker"); // issue tracker constructor declaration
$frm->dataServer = "localhost"; // the server the data is on
$frm->dataDB = "tutorials"; // the database you are going to connect to
$frm->dataTable = "issues"; // the name of the table.
$frm->name = "Issue Tracker"; // Setting the name of the form
// For creating the proper where clause depending on which link is clicked.
if($_GET['assignedTo'])
{
switch ($_GET['status'])
{
case null:
case 'OPEN':
//Add assignedTo value if, for example, "Jared's issues" is clicked
$frm->where = 'status != "CLOSED" and assignedTo = "'.$_GET['assignedTo'].'"';
break;
case 'CLOSED':
$frm->where = 'status = "CLOSED" assignedTo = "'.$_GET['assignedTo'].'"';
} // end of first switch statement
} else {
switch ($_GET['status'])
{
case null:
case 'OPEN':
$frm->where = 'status != "CLOSED"';
break;
case 'CLOSED':
$frm->where = 'status = "CLOSED"';
} // end of second switch statement
} // end of if($_GET['assignedTo'])
//Set the data-member orderBy equal to the ORDER BY sql syntax 'ORDER BY startDate' is a part of the MySQL query.
$frm->orderBy = 'ORDER BY startDate';
// add in an object that will give me the edit option for each record in sheetView.
$frm->addIn('iLinkBack');
// Add in an the object iROText that links to the 'id' column in the 'issues' table, and Assigning it the caption of 'ID'
$frm->addIn('iROText', 'id', 'ID');
// same as the id column, but with no caption
$frm->addIn('iText', 'description');
// add an 'iDBSelect object thats value is linked to the 'issues' table column 'assignedTo'
$frm->addIn('iDBSelect', 'assignedTo', 'Assigned To:');
/*This if statement assigns the default value of the 'assignedTo' depending on what link is pressed */
if($_GET['assignedTo'])
{
$frm->inputs['assignedTo']->value = $_GET['assignedTo'];
} else{
$frm->inputs['assignedTo']->value = 'IT';
}
//create the array of values for the 'assignedTo' iDBSelect object
$frm->inputs['assignedTo']->rowQuery = array('IT','Eddie', 'Jared', 'Daniel');
//add, set the default value, and array values of the iDBSelect object 'status'
$frm->addIn('iDBSelect', 'status');
$frm->inputs['status']->value = 'OPEN';
$frm->inputs['status']->rowQuery = array('OPEN', 'CLOSED', 'PENDING', 'IN PROGRESS');
//Add iDateText objects 'startDate' and 'dueDate'
$frm->addIn('iDateText', 'startDate');
$frm->addIn('iDateText', 'dueDate');
// An if statement that adds the workLog text area when in edit mode.
if($_GET['sheetView'] != 'YES')
{
$frm->addIn('iTextArea','workLog');
//setting the size of the text area for workLog
$frm->inputs['workLog']->rows = 10;
$frm->inputs['workLog']->cols = 50;
}
//Add an iDBSelect object called department, set the default value, and create an array of values for the drop-down selection
$frm->addIn('iDBSelect', 'department');
$frm->inputs['department']->value = 'Company';
$frm->inputs['department']->rowQuery = array('Company', 'Accounting','plant', 'warehouse', 'Executive office');
// set the startDate default value to 'today' when in edit mode
if($_GET['currentRec'] == 'new')
{
$frm->inputs['startDate']->value = date("Y-m-d");
}
if($_GET['status'] == 'CLOSED')
{
// if you click on Closed Issues, the endDate field is shown
$frm->addIn('iDateText', 'endDate');
//and when in Closed Issues edit mode the default value for status is 'CLOSED'
$frm->inputs['status']->value = 'CLOSED';
//if in edit mode show the field endDate
} elseif ($_GET['sheetView'] != 'YES') {
$frm->addIn('iDateText', 'endDate');
}
//if you select the CLOSED value in form edit mode
if ($frm->inputs['status']->valueToSave == 'CLOSED')
{
//and if I don't set the value for the field endDate
if(!$frm->inputs['endDate']->valueToSave)
{
//then set the value of endDate to today's date
$frm->inputs['endDate']->valueToSave = date("Y-m-d");
}
}
//Add the html links at the bottum of the page, with the proper $_GET array values
//(remember the period means Concatenate in PHP)
$frm->wrapper->pageFooter .= "<p><hr />
<a href=\"issues.php?sheetView=YES&status=OPEN¤tRec=0&I=1\">Open Issues</a> |
<a href=\"issues.php?sheetView=YES&status=OPEN&assignedTo=Jared¤tRec=0&I=1\">Jared's Issues</a> |
<a href=\"issues.php?sheetView=YES&status=OPEN&assignedTo=Eddie¤tRec=0&I=1\">Eddie's Issues</a> |
<a href=\"issues.php?sheetView=YES&status=CLOSED¤tRec=0&I=1\">Closed Issues</a>";
//If the form is in sheetView, then center the form on the page
if($_GET['sheetView'] == 'YES')
{
$frm->wrapper->pageHeader .= '<center>';
$frm->wrapper->pageFooter .= "</center></p>";
} else {
//else do not center
$frm->wrapper->pageFooter .= "</p>";
}
echo $frm->drawFormPage(); //the method used to create the form.
?>
- Copy the above code into the file called issues.php. The code is commented, so reading it shouldn't be that difficult.
- If you followed the steps correctly, you should have a page that looks something like this:
- That's it! With a little modification, this code can be tailored for your own uses.



