I have the following form generated form a php class called 'form'. In this form i have a section which need to add multiple form elements dynamically (the table with id="pro_tasks").
In this form user should be able to add more tasks.
<?php
h2("Add Project");
echo $form->create(array( 'id' =>'addProject',
'name' =>'addProject',
'method' =>'get',
'action' =>'index.php'));
$form->open_fieldset();
onebreak();
$form->legend("Project Detals");
echo $form->text (array( 'id' =>'pro_name',
'label' =>'Project Name : ',
'name' =>'pro_name',
'required' =>'required',
'length' =>255));
twobreaks();
echo $form->select(array( 'id' =>'pro_type',
'label' =>'Project Type : ',
'name' =>'pro_type',
'data' =>$form->option_array("SELECT DISTINCT id,pro_type
FROM project_types",
'id', 'pro_type')));
twobreaks();
echo '<label for="client">Client : </label>
<input type="radio" name="NA" value="company" checked="checked">Company
<input type="radio" name="NA" value="person">Person';
echo '<div id="client">';
//The client list generated inside this dive tag, based on the redio button selected above
//The Company list has selected by default
echo '<div id="companydiv">';
echo $form->select(array( 'id' =>'client',
'label' =>' ',
'name' =>'client',
'data' =>$form->option_array("SELECT DISTINCT id, name
FROM companies
WHERE addressbook_id='1' OR addressbook_id='2' OR addressbook_id='3' OR addressbook_id='4'",
'id', 'name')));
echo '</div>';
echo '</div>';
twobreaks();
echo $form->date (array( 'id' =>'start_date',
'label' =>'Start Date : ',
'name' =>'start_date',
'required' =>'required',
'class' =>'datepicker',
'length' =>255));
bigspace();
echo $form->date (array( 'id' =>'comp_date',
'label' =>'Completion Date : ',
'name' =>'comp_date',
'required' =>'required',
'class' =>'datepicker',
'length' =>255));
twobreaks();
echo $form->select (array('id' =>'status',
'label' =>'Project Status : ',
'name' =>'status',
'data' =>array('pending' =>'pending',
'ongoing' =>'ongoing',
'suspended' =>'suspended',
'terminated' =>'terminated',
'completed' =>"completed"),
'value'=>'pending'));
twobreaks();
echo $form->select(array( 'id' =>'resp_id',
'label' =>'Responsibility',
'name' =>'resp_id',
'data' =>$form->option_array("SELECT DISTINCT id, CONCAT( first_name, ' (',user_type,')') AS resp_name
FROM users
WHERE status='ACTIVE'",
'id', 'resp_name')));
twobreaks();
echo $form->select (array('id' =>'priority',
'label' =>'Priority : ',
'name' =>'priority',
'data' =>array('low' =>'low',
'moderate' =>'moderate',
'high' =>'high',),
'value'=>'low'));
twobreaks();
echo $form->textBox(array ('id' =>'description',
'label' =>'Description : ',
'name' =>'description',
'columns' =>'50',
'rows' =>'5'));
twobreaks();
echo $form->text(array ('id' =>'tec',
'label' =>'Total Estimated Cost (Rs) : ',
'name' =>'tec'));
twobreaks();
echo $form->textBox(array ('id' =>'remarks',
'label' =>'Remarks : ',
'name' =>'remarks'));
twobreaks();
$form->close_fieldset();
$form->open_fieldset();
onebreak();
$form->legend("Project Tasks");
?>
<div class="overflowTable">
<table id="pro_tasks">
<tr align="center" class="FormTableHeader">
<th>Task Name </th>
<th>Start Date </th>
<th>Completion Date </th>
<th>Responsibility </th>
<th>Status </th>
<th>TEC </th>
<th>Description </th>
</tr>
<?php //Need some code to repeat the rows when this is a update form?>
<tr id="task">
<td> <?php echo $form->text (array('id' =>'task_name',
'name' =>'task_name[]',
'required' =>'required'));?> </td>
<td> <?php echo $form->date (array('id' =>'tsk_start_date',
'name' =>'tsk_start_date[]',
'required' =>'required',
'class' =>'datepicker',));?> </td>
<td> <?php echo $form->date (array('id' =>'tsk_comp_date',
'name' =>'tsk_comp_date[]',
'required' =>'required',
'class' =>'datepicker',));?> </td>
<td> <?php echo $form->select(array('id' =>'assignedto',
'name' =>'assignedto[]',
'data' =>$form->option_array("SELECT DISTINCT id, CONCAT( first_name, ' (',user_type,')') AS resp_name
FROM users
WHERE status='ACTIVE'",
'id', 'resp_name')));?></td>
<td> <?php echo $form->select(array( 'id' =>'tsk_status','name'=>'tsk_status[]',
'required' =>'required',
'data' =>array('pending' =>'pending',
'ongoing' =>'ongoing',
'suspended' =>'suspended',
'terminated' =>'terminated',
'completed' =>'completed'),
'value' =>'pending'));?> </td>
<td><?php echo $form->text (array('id' =>'tec','name'=>'tec[]'));?> </td>
<td><?php echo $form->textBox(array('id' =>'description','name'=>'description[]'));?></td>
</tr>
</table>
</div>
<div id="addProject_errorloc" class="error_strings"></div>
<img src="../../images/add.png" alt="addtask" id="addtask">
<img src="../../images/remove.png" alt="removetask" id="removetask">
<?php
$form->close_fieldset();
echo $form->submit(array('id'=>'submit', 'name'=>'submmit'));
echo $form->close();
?>
Since these form element generated by php i cannot just use JavaScripts to generate the task row dynamically. So, i created another php page which can generate the task row and added to the form using jQuery GET method as bellow
<?php require_once(dirname(__FILE__).'/../../../includes/initialize.php');
$rowCount="";
if(isset($_GET['rowCount'])){
$rowCount = $_GET['rowCount'];
}
?>
<tr id="task">
<td> <?php echo $form->text (array('id' =>'task_name',
'name' =>'task_name['.$rowCount.']',
'required' =>'required'));?> </td>
<td> <?php echo $form->date (array('id' =>'tsk_start_date',
'name' =>'tsk_start_date['.$rowCount.']',
'required' =>'required',
'class' =>'datepicker',));?> </td>
<td> <?php echo $form->date (array('id' =>'tsk_comp_date',
'name' =>'tsk_comp_date['.$rowCount.']',
'required' =>'required',
'class' =>'datepicker',));?> </td>
<td> <?php echo $form->select(array('id' =>'assignedto',
'name' =>'assignedto['.$rowCount.']',
'data' =>$form->option_array("SELECT DISTINCT id, CONCAT( first_name, ' (',user_type,')') AS resp_name
FROM users
WHERE status='ACTIVE'",
'id', 'resp_name')));?></td>
<td> <?php echo $form->select(array( 'id' =>'tsk_status','name'=>'tsk_status['.$rowCount.']',
'required' =>'required',
'data' =>array('pending' =>'pending',
'ongoing' =>'ongoing',
'suspended' =>'suspended',
'terminated' =>'terminated',
'completed' =>'completed'),
'value' =>'pending'));?> </td>
<td><?php echo $form->text (array('id' =>'tec','name'=>'tec['.$rowCount.']'));?> </td>
<td><?php echo $form->textBox(array('id' =>'description','name'=>'description['.$rowCount.']'));?></td>
$(document).ready(function(){
$("#addtask").click(
function(){
var rowCount = $('#pro_tasks tr').length;
$.ajax({
url: "task.php?rowCount="+rowCount,
type: "GET",
success: function(data){
$("tbody").append(data);//Do something here with the "data"
}
});
});
});
All of the codes above works correctly except the (var rowCount = $('#pro_tasks tr').length;). That does not counts the number of rows in the table. therefore i cannot identify the dynamically generated rows separately.
All the times, row count is 2...
I'm not an expert in this field, please be good enough to advise me on this issue.
Thanks.
It should be
var rowCount = $('#pro_tasks tr').length;
you forgot the hash-sign (for an id).
I think that, there is a caching in my javascript.
So, instead of sending rowCount with the url, I used the following code. Problem solved. :)
$(document).ready(function(){
$("#addtask").click(
function(){
$.ajax({
url: "task.php",
type: "GET",
success: function(data){
$("tbody").append(data);
}
});
});
$('#submit').click(function(){
$('#pro_tasks tr').each(function(index,item){
$('input#task_name',item).attr('name','task_name['+index+']');
$('input#tsk_start_date',item).attr('name','tsk_start_date['+index+']');
$('input#tsk_comp_date',item).attr('name','tsk_comp_date['+index+']');
$('select#assignedto',item).attr('name','assignedto['+index+']');
$('select#tsk_status',item).attr('name','tsk_status['+index+']');
$('input#tec',item).attr('name','tec['+index+']');
$('textarea#description',item).attr('name','description['+index+']');
});
});
});
when submitting the form, this function add row number to each name.
Thanks