Issue Tracker

From FiFormsWiki

Jump to: navigation, search

- 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:

Jcfiform1.jpg



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&currentRec=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&currentRec=0&I=1\">Open Issues</a> | 
<a href=\"issues.php?sheetView=YES&status=OPEN&assignedTo=Jared&currentRec=0&I=1\">Jared's Issues</a> |
<a href=\"issues.php?sheetView=YES&status=OPEN&assignedTo=Eddie&currentRec=0&I=1\">Eddie's Issues</a> |
<a href=\"issues.php?sheetView=YES&status=CLOSED&currentRec=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:

Jcfiform2.jpg

- That's it! With a little modification, this code can be tailored for your own uses.

Personal tools