I hav a rather large form it has 8 fields for entering books .
Now for user to add more books there is a button add more books ,on click of which a javascript function is called and 7 out of 8 fields are duplicated.
User can add maximum 6 books , and all the input fields created dynamically have their names as arrays . I am able to post them and store in a table , Now i want to validate them using javascript.
I have been tryng to do this since a week and am a new to Javascript . Please help me.
MY JAVASCRIPT CODE
function addInput(divName){
var bname1 = new Array();
var abname1 = new Array();
var cost1 = new Array();
var num1 = new Array();
if (counter == limit)
{
alert("You have reached the limit of adding " + counter + " inputs");
}
else
{
var newdiv = document.createElement('div');
newdiv.innerHTML ="<table>"+ "<tr align='right'>" + "<td>"+ " Name of book" + (counter + 1) + " " +" : <input type='text' name='bname1[]' > "+"</td>" + "</tr>"+"<tr align='right'>"+ "<td>"+" Name of Authour"+(counter + 1)+" "+": <input type='text' name='aname1[]'>"+"</td>"+"</tr>"+"<tr align='right'>"+"<td>"+"Publisher"+(counter+1)+" "+": <input tyme='text' name='pub1[]'>"+"</td>"+"</tr>"+ "<tr align='right'>" +"<td>"+ "ISDN Number " + (counter + 1) +" "+ ": <input type='text' name='isdn1[]'> "+"</td>" + "</tr>"+"<tr align='right'>" +"<td>"+ " Edition " + (counter + 1) + " "+": <input type='text' name='edi1[]'> "+"</td>" + "</tr>"+"<tr align='right'>" + "<td>"+ "Price"+(counter + 1) +" "+ " :<input type='number' name='cost1[]'>"+"</td>"+"</tr>"+"<tr align='right'>" + "<td>"+ "Number of copies"+(counter + 1) +" "+ ": <input type='number' name ='num1[]'> "+"</td>" + "</tr>"+ "</table>";
// alert("counter +1 is "+counter+1);
document.getElementById(divName).appendChild(newdiv);
counter=counter+1;
}
}
there is divsion in the html form to which all this is added.
Please help !
thanx in advance ..
here is your solution. http://codebins.com/codes/home/4ldqpbq
HTML
<div id="testDiv">
</div>
<button onclick="addInput('testDiv')">
Add New Items
</button>
<button onclick="validate('testDiv')">
Validate
</button>
JavaScript
var counter = 0;
var limit = 6
function addInput(divName) {
var bname1 = new Array();
var abname1 = new Array();
var cost1 = new Array();
var num1 = new Array();
if (counter == limit) {
alert("You have reached the limit of adding " + counter + " inputs");
} else {
var newdiv = document.createElement('div');
newdiv.innerHTML = "<table>" + "<tr align='right'>" + "<td>" + " Name of book" + (counter + 1) + " " + " : <input type='text' name='bname1[]' > " + "</td>" + "</tr>" + "<tr align='right'>" + "<td>" + " Name of Authour" + (counter + 1) + " " + ": <input type='text' name='aname1[]'>" + "</td>" + "</tr>" + "<tr align='right'>" + "<td>" + "Publisher" + (counter + 1) + " " + ": <input tyme='text' name='pub1[]'>" + "</td>" + "</tr>" + "<tr align='right'>" + "<td>" + "ISDN Number " + (counter + 1) + " " + ": <input type='text' name='isdn1[]'> " + "</td>" + "</tr>" + "<tr align='right'>" + "<td>" + " Edition " + (counter + 1) + " " + ": <input type='text' name='edi1[]'> " + "</td>" + "</tr>" + "<tr align='right'>" + "<td>" + "Price" + (counter + 1) + " " + " :<input type='number' name='cost1[]'>" + "</td>" + "</tr>" + "<tr align='right'>" + "<td>" + "Number of copies" + (counter + 1) + " " + ": <input type='number' name ='num1[]'> " + "</td>" + "</tr>" + "</table>";
// alert("counter +1 is "+counter+1);
document.getElementById(divName).appendChild(newdiv);
counter = counter + 1;
}
}
function validate(divName) {
var container = document.getElementById(divName).getElementsByTagName("input");
for (var len = container.length, i = 0; i < len; i++) {
// if only requried validation
if (container[i].value == "") {
container[i].style.borderColor = "red"
} else {
container[i].style.border = ""
}
//if you want saperate validation for each
switch (container[i].name) {
case "bname1[]":
//validate according to filed
break;
case "aname1[]":
//validate according to filed
break;
case "pub1[]":
//validate according to filed
break;
case "isdn1[]":
//validate according to filed
break;
case "edi1[]":
//validate according to filed
break;
case "cost1[]":
//validate according to filed
break;
case "num1[]":
//validate according to filed
break;
}
}
}
Couple of suggestions for you to consider:
1) consider grouping ALL the fields you want to duplicate inside a single div in your form.
Then when the user wants to add new item (book) all you will need to do will be copy the content of this div. This way you will maintain only one copy of field-set.
2) consider dynamic generic form validation too. You add the validation rules to your form field definition with extra attributes i.e. [<input ... validationRules="mandatory,minimumLength=10..." />] I think that you can achieve something similar with JQuery, but I personally prefer NOT to use large libraries to do small jobs.
3) consider giving your fields unique ids too.
use
var bname= document.getElementsByName('bname1[]');
var aname=document.getElementsByName('aname1[]'); .........
for(var i=0;i<bname.length;i++)
{
//Your validations
}
for(var i=0;i<aname.length;i++)
{
//Your validations
}.....
..
do this for all elements in your code..
Validation function example:
function validate_field(f) { // f is input element
var name = f.name; // or also f.getAttribute('name')
var value = f.value; // or also f.getAttribute('value'), but should be defined
var error_div = document.getElementById(name+'err');
//alert('name '+name+' value '+value);
if (name.indexOf('bname') == 0) { // if validate book name
if (value == '') { // e.g. book name should not be empty string?
error_div.innerHTML = 'book name cannot be empty!';
return false; // field is wrong
}
}
else if (name.indexOf('aname') == 0) { // if validate author name
if (value.length<2) {
error_div.innerHTML = 'author\'s name is too short!';
return false; // at least two characters long name? :)
}
}
else if (name.indexOf('pub') == 0) { // if validate publisher
if (value.length<2) {
error_div.innerHTML = 'publisher\'s name is too short!';
return false;
}
}
else if (name.indexOf('isdn') == 0) { // if validate ISDN Number
if (value == '') {
error_div.innerHTML = 'ISDN cannot be empty!';
return false;
}
}
else if (name.indexOf('edi') == 0) { // if validate Edition
if (value == '') {
error_div.innerHTML = 'edition cannot be empty!';
return false;
}
}
else if (name.indexOf('cost') == 0) { // if validate Price
if (value=='') {
error_div.innerHTML = 'Cannot be empty!';
return false;
}
if (isNaN(value)) {
error_div.innerHTML = 'Please write a price using digits!';
return false;
}
}
else if (name.indexOf('num') == 0) { // if validate Number of copies
if (value=='') {
error_div.innerHTML = 'Cannot be empty!';
return false;
}
if (isNaN(value)) {
error_div.innerHTML = 'Please number of copies via digits!';
return false;
}
}
error_div.innerHTML = 'ok';
return true; // field is ok
// you can also have a look at http://www.javascript-coder.com/html-form/javascript-form-validation.phtml
}
Full working script here: pastebin.com/UkVP2uLb
Related
I am trying to generate dynamically form in table and submit but there is problem in my code which is difficult for me solve,
$(document).ready(function() {
$('#btnsummary').on('click', function() {
var date = $('#dddeliverydate').val();
var soid = $('#sssoid option:selected').val();
$.ajax({
url: "tblsum.php",
method: "POST",
dataType: 'JSON',
data:
"&date=" +
date +
"&soid=" +
soid,
success: function(response) {
if ( response.length == 0 ) {
alert("NO DATA FOUND!");
}
else{
$("#tblsum tbody").empty();
var len = response.length;
for(var i=0; i<len; i++){
var invoiceno = response[i].invoiceno;
var shopname = response[i].shopname;
var paymentmode = response[i].paymentmode;
var finalamount = response[i].finalamount;
if (finalamount==0){
return false
}
else if (paymentmode=="Credit"){
var tr_str = "<tr>" +
"<td align='center'>" + invoiceno + "<input type='hidden' name='invoiceno[]' value='"+invoiceno+"'></td>" +
"<td align='center'>" + shopname + "</td>" +
"<td align='center'>" + paymentmode + "</td>" +
"<td align='center'>" + finalamount + "</td>" +
"<td align='center'><input type='number' id='finalamount' name='finalamount[]' value='0'></td>" +
"</tr>";
$("#tblsum tbody").append(tr_str);
}
else{
var tr_str = "<tr>" +
"<td align='center'>" + invoiceno + "<input type='hidden' name='invoiceno[]' value='"+invoiceno+"'></td>" +
"<td align='center'>" + shopname + "</td>" +
"<td align='center'>" + paymentmode + "</td>" +
"<td align='center'>" + finalamount + "</td>" +
"<td align='center'><input type='number' id='finalamount' name='finalamount[]' value='" + finalamount + "'></td>" +
"</tr>";
$("#tblsum tbody").append(tr_str);
}
}
$("#tblsum tbody").append("<tr><td colspan='5'><button class='btn btn-success' type='button' id='btnsum'onclick='summary()'>Save</button></td></tr>");
}
}
})
});
})
There is two problem if final amount is 0 then save button did not appear, when I submit form first field which is invoiceno don't submit on next page,
below is submit function
function summary(){
$(document).ready(function(e) {
var date = $('#dddeliverydate').val();
var soid = $('#sssoid option:selected').val();
var form = $('#formsum').serialize();
$.ajax({
url: "test.php",
method: "POST",
data:
"&date=" +
date +
"&soid=" +
soid+
"&form=" +
form,
success: function(data) {
var w = window.open('about:blank', 'windowname');
w.document.write(data);
}
})
})
}
Below is my PHP code.
for($count = 0; $count<count($_POST['invoiceno']); $count++){
$data = array(
$invoiceno = $_POST['invoiceno'][$count],
$amount = $_POST['finalamount'][$count],
);
echo "Invoice NO ".$invoiceno." Amount ".$amount.'<br>';
}
sorry for bad english.
I told you before return STOPS executing a function, so all code after it is obsolete. In this case, when finalamount == 0 you stop executing the function and return to the place where it started. So the code to create the submit button never will be reached. With some proper indentation, you could see that:
$(document).ready(function() {
//<< ===== START START START of onclick function
$('#btnsummary').on('click', function() {
....
$.ajax({
url: "tblsum.php",
....
success: function(response) {
if ( response.length == 0 ) { .... }
else{
$("#tblsum tbody").empty();
....
for(var i=0; i<len; i++){
var invoiceno = response[i].invoiceno;
var finalamount = response[i].finalamount;
....
if (finalamount==0){
return false
// STOP EXECUTING THIS FUNCTION
// AND GO DIRECTLY TO END OF FUNCTION ================= >>
// code after this will NOT be executed
}
else if (paymentmode=="Credit"){....}
else{....}
}
// if finalamount == 0, this will never be executed
$("#tblsum tbody").append("<tr><td colspan='5'><button class='btn btn-success' type='button' id='btnsum'onclick='summary()'>Save</button></td></tr>");
}
}
})
});
// ===== END END END of onclick function << ===============
// continue executing script from here
})
So you could use continue instead of return to skip only one itteration in the for loop.
FYI, I am working on localhost with wampserver, using PHP and AJAX, trying to display the JSON data rows (which are around 1526). and the problem is i am not able to display the rows which are based on the search conditions.
Output of print_r($result_array); in console output as below. here in below pic don't worry for console error this error is becoz of PHP array used in parsing JSON. This output i used to test weather my server PHP file is working correctly or not but it is working correctly.
After that i checked my encoding function, for which output of echo json_encode($result_array); i am getting red console error for some search condition and in other search condition i am able to display results correctly.
For example, below two images
I am not able to figure out what is happening to my code.
File search.php
<?php
// send a JSON encoded array to client
include('connection.php');
$sqlFlag = 0;
function queryDelimiter(){
global $sqlFlag;
if ($sqlFlag == 0){
$sqlFlag = 1;
return ' WHERE ';
}else{
return ' AND ';
}
}
$selectSQL = "SELECT * FROM tbl_main_lead_info";
if(isset($_POST['lead_status']) and strlen(trim($_POST['lead_status'])) > 0){
$selectSQL .= queryDelimiter()."LeadStatus = '".$_POST['lead_status']."'";
}
if(isset($_POST['lead_owner']) and strlen(trim($_POST['lead_owner'])) > 0){
$selectSQL .= queryDelimiter()."LeadAddedBy = '".$_POST['lead_owner']."'";
}
if(isset($_POST['company_name']) and strlen(trim($_POST['company_name'])) > 0){
$selectSQL .= queryDelimiter()."Company = '".$_POST['company_name']."'";
}
if(isset($_POST['tech_area']) and strlen(trim($_POST['tech_area'])) > 0){
$selectSQL .= queryDelimiter()."TechArea = '".$_POST['tech_area']."'";
}
if(isset($_POST['firm_size']) and strlen(trim($_POST['firm_size'])) > 0){
$selectSQL .= queryDelimiter()."FirmSize = '".$_POST['firm_size']."'";
}
if(isset($_POST['firm_type']) and strlen(trim($_POST['firm_type'])) > 0){
$selectSQL .= queryDelimiter()."FirmType = '".$_POST['firm_type']."'";
}
if(isset($_POST['country_name']) and strlen(trim($_POST['country_name'])) > 0){
$selectSQL .= queryDelimiter()."Country = '".$_POST['country_name']."'";
}
if(isset($_POST['state_name']) and strlen(trim($_POST['state_name'])) > 0){
$selectSQL .= queryDelimiter()."State = '".$_POST['state_name']."'";
}
if(isset($_POST['city_name']) and strlen(trim($_POST['city_name'])) > 0){
$selectSQL .= queryDelimiter()."City = '".$_POST['city_name']."'";
}
if(isset($_POST['start_date']) and strlen(trim($_POST['start_date'])) > 0){
$selectSQL .= queryDelimiter()."LastContactDate >='".$_POST['start_date']."'";
}
if(isset($_POST['end_date']) and strlen(trim($_POST['end_date'])) > 0){
$selectSQL .= queryDelimiter()."NextContactDate <= '".$_POST['end_date']."'";
}
$selectSQL .= " ORDER BY FirstName ASC, LastName ASC, Lead_Id ASC";
$result_array = array();
$result = $conn -> query ($selectSQL);
if(mysqli_num_rows($result) > 0){
while ($row = $result->fetch_assoc()) {
array_push($result_array, $row);
}
}
// print_r($result_array);
echo json_encode($result_array);
// $selectSQL = "SELECT * FROM tbl_main_lead_info as M, tbl_campaign_info as C";
$conn->close();
?>
File loadtable.js
// This is script to load table based on filter section
$(document).ready(function() {
// Campaign Submit Info
$('[name="search_submit"]').click(function(e) {
$('#load-csv-file-button').attr('style','display:none;');
$("#filterRecords").attr('style','display:block;');
$('#add_lead_info').attr('style','display:none;');
e.preventDefault();
// GET the admin and user id value
var adminvalue = $('#filterformpost').find('[name="adminvalue"]').val();
var useridvalue = $('#filterformpost').find('[name="useridvalue"]').val();
var lead_owner = $('#filterformpost').find('#lead_owner_select option:selected').val();
var lead_status = $('#filterformpost').find('#lead_status_select option:selected').val();
var company_name = $('#filterformpost').find('#company_name_select option:selected').val();
var tech_area = $('#filterformpost').find('#tech_area_select option:selected').val();
var firm_size = $('#filterformpost').find('#firm_size_select option:selected').val();
var firm_type = $('#filterformpost').find('#firm_type_select option:selected').val();
var country_name = $('#filterformpost').find('#country_name_select option:selected').val();
var city_name = $('#filterformpost').find('#city_name_select option:selected').val();
var state_name = $('#filterformpost').find('#state_name_select option:selected').val();
var start_date = $('#filterformpost').find('#start_date_search').val();
var end_date = $('#filterformpost').find('#end_date_search').val();
// console.log('adminvalue: '+adminvalue)
// console.log('useridvalue: '+useridvalue)
// console.log('lead_owner: '+lead_owner)
// console.log('country_name: '+country_name)
// console.log('State: '+state_name)
$.ajax({
type: "POST",
url: "./server/search.php",
data: {
"lead_owner": lead_owner,
"lead_status": lead_status,
"company_name": company_name,
"tech_area": tech_area,
"firm_size": firm_size,
"firm_type": firm_type,
"country_name": country_name,
"city_name": city_name,
"state_name": state_name,
"start_date": start_date,
"end_date": end_date
},
beforeSend: function() {
$('.search_lead_filter_message_box').html(
'<img src="tenor.gif" width="40" height="40"/>'
);
},
success:function(data){
// console.log(data)
console.log("Data Length: "+data.length)
console.log(data)
if(data.length == 0){
$('.search_lead_filter_message_box').html('');
$("#filterRecords").html('No results fetched');
}
var result = $.parseJSON(data);
// console.log(result)
//###########################################
// Pagination code start
//###########################################
$('.search_lead_filter_message_box').html('');
$("#filterRecords").empty();
//###########################################
// Pagination code end
//###########################################
$("#pagination").attr('style', 'display:block;');
$("#number_of_rows").attr('style','display:block;');
$('#button-prev-next').attr('style','display:block;');
paginate_json_data(result, adminvalue, useridvalue)
}
});
});
});
function paginate_json_data(userDetails, adminvalue, useridvalue) {
adminvalue = adminvalue
useridvalue = useridvalue
userDetails = userDetails
var table = '';
table = $("<table></table>");
$('#pagination').html('<div id="nav-numbers" class="col nav"></div>');
$('#number_of_rows').html('');
$('#number_of_rows').html('<p1>Total number of leads fetched: ' + userDetails.length + '</p1>');
$('#button-prev-next').html('<button class="col PreviousButton" id="PreValue"><i class="ion-skip-backward"></i> Previous</button><button class="col NextButton" id="nextValue">Next <i class="ion-skip-forward"></i></button>');
var max_size = userDetails.length;
var sta = 0;
var elements_per_page = 10;
var limit = elements_per_page;
if(max_size<10){
// #####################################
// NUMBER OF ROWS A < 10 START START
// #####################################
table.append('<thead><th>#</th><th>Name</th><th>Company</th><th>Website</th><th>Designation</th><th>Email</th><th style="width: 150px;">Phone</th><th>City</th><th>State</th><th>Country</th><th>Lead Status</th></thead>');
table.append('<tbody id="myTable"></tbody>');
goFun_Modified(sta, max_size);
function goFun_Modified(sta, limit) {
for (var i = sta; i < limit; i++) {
var tab = '<tr><td>' + (i+1) + "\n" + '</td><td>' + "<a target='_blank' href=./lead/index.php?lead_id=" + userDetails[i].Lead_Id + " </a>" + userDetails[i].FirstName + ' ' + userDetails[i].LastName + "\n" + '</td><td>' + userDetails[i].Company + "\n" + '</td><td>' + userDetails[i].Website + "\n" + '</td><td>' + userDetails[i].Designation + "\n" + '</td><td>' + "" + userDetails[i].Email + "" + "\n" + '</td><td style="width: 150px;" >' + userDetails[i].Phone + "\n" + '</td><td>' + userDetails[i].City + "\n" + '</td><td>' + userDetails[i].State + "\n" + '</td><td>' + userDetails[i].Country + "\n" + '</td><td>' + userDetails[i].LeadStatus + "\n" + '</td></tr>';
console.log(tab)
$('#myTable').append(tab)
}
} // Function ended
$("#filterRecords").html(table);
$('#nextValue').click(function() {
// checks if it's the last page
if (currentPage < maxPage) {
currentPage++;
$pagingBtn.removeClass('active');
$pagingBtn.eq(currentPage).addClass('active')
} else {
alert("End of page");
}
});
$('#PreValue').click(function() {
// checks if it's the first page
if (currentPage > 0) {
currentPage--;
$pagingBtn.removeClass('active');
$pagingBtn.eq(currentPage).addClass('active')
} else {
alert("Start of page")
}
});
var number = Math.round(userDetails.length / elements_per_page);
for (i = 0; i <= number; i++) {
$('.nav').append('<button class="nav-numbers btn" id=' + i + '>' + (i+1) + '</button>');
}
$('.nav button').click(function() {
var start = $(this).text()-1;
// $(this).css({"background-color": "#e67e22", "color": "#ffffff"});
$('#myTable').empty();
limit = 10 * (parseInt(start) + 1) > max_size ? max_size : 10 * (parseInt(start) + 1)
goFun_Modified(start * 10, limit);
let $self = $(this);
// gets index of button relative to it's siblings
// https://api.jquery.com/index/
currentPage = $self.index();
$pagingBtn.removeClass('active');
$self.addClass('active');
});
// saves all the paging buttons for reusing, instead of calling $() every time
let $pagingBtn = $('#nav-numbers .btn');
let maxPage = $pagingBtn.length - 1;
let currentPage = 0;
$('.nav button')[0].click()
// #####################################
// NUMBER OF ROWS A < 10 END
// #####################################
}else{
// #####################################
// NUMBER OF ROWS A > 10 START
// #####################################
table.append('<thead><th>#</th><th>Name</th><th>Company</th><th>Website</th><th>Designation</th><th>Email</th><th>Phone</th><th>City</th><th>State</th><th>Country</th><th>Lead Status</th></thead>');
table.append('<tbody id="myTable"></tbody>');
goFun(sta, limit);
function goFun(sta, limit) {
for (var i = sta; i < limit; i++) {
var tab = '<tr><td>' + (i+1) + "\n" + '</td><td>' + "<a target='_blank' href=./lead/index.php?lead_id=" + userDetails[i].Lead_Id + " </a>" + userDetails[i].FirstName + ' ' + userDetails[i].LastName + "\n" + '</td><td>' + userDetails[i].Company + "\n" + '</td><td>' + userDetails[i].Website + "\n" + '</td><td>' + userDetails[i].Designation + "\n" + '</td><td>' + "" + userDetails[i].Email + "" + "\n" + '</td><td>' + userDetails[i].Phone + "\n" + '</td><td>' + userDetails[i].City + "\n" + '</td><td>' + userDetails[i].State + "\n" + '</td><td>' + userDetails[i].Country + "\n" + '</td><td>' + userDetails[i].LeadStatus + "\n" + '</td></tr>';
$('#myTable').append(tab)
}
$("#filterRecords").html(table);
}// FUNCTION ENDED
$('#nextValue').click(function() {
var next = limit;
if (max_size >= next) {
def = limit + elements_per_page;
limit = def
$('#myTable').empty();
if (limit > max_size) {
def = max_size;
}
goFun(next, def);
}
// checks if it's the last page
if (currentPage < maxPage) {
currentPage++;
$pagingBtn.removeClass('active');
$pagingBtn.eq(currentPage).addClass('active')
} else {
alert("End of page");
}
});
$('#PreValue').click(function() {
var pre = limit - (2 * elements_per_page);
if (pre >= 0) {
limit = limit - elements_per_page;
$('#myTable').empty();
goFun(pre, limit);
}
// checks if it's the first page
if (currentPage > 0) {
currentPage--;
$pagingBtn.removeClass('active');
$pagingBtn.eq(currentPage).addClass('active')
} else {
alert("Start of page")
}
});
var number = Math.round(userDetails.length / elements_per_page);
for (i = 0; i <= number; i++) {
$('.nav').append('<button class="nav-numbers btn" id=' + i + '>' + (i+1) + '</button>');
if(i == number){
}
}
$('.nav button').click(function() {
var start = $(this).text()-1;
$('#myTable').empty();
limit = 10 * (parseInt(start) + 1) > max_size ? max_size : 10 * (parseInt(start) + 1)
goFun(start * 10, limit);
let $self = $(this);
// gets index of button relative to it's siblings
// https://api.jquery.com/index/
currentPage = $self.index();
$pagingBtn.removeClass('active');
$self.addClass('active');
});
// saves all the paging buttons for reusing, instead of calling $() every time
let $pagingBtn = $('#nav-numbers .btn');
let maxPage = $pagingBtn.length - 1;
let currentPage = 0;
$('.nav button')[0].click()
// #####################################
// NUMBER OF ROWS A > 10 END
// #####################################
}
}
Updated:
Try add content-type specs to http header:
header("Content-Type: application/json");
and set UNICODE feature in json_encode:
echo json_encode($result_array, JSON_UNESCAPED_UNICODE);
I created a Reports module in a medication administration webapp.
A medication can be stopped, and when it happens, it's value in the database turns to 1 (1=stopped 0=active). I need the report to show "STOPED" in the "administered by" column instead of the administrator's name when a medication is stopped so here is my code, but it's not working :( It returns "STOPED" for everything. What am I doing wrong ?
Any help will be appreciated!
for (var i = 0; i < medi.length; i++) {
keys_str += "<tr>";
keys_str += "<td>" + medi[i].date + "</td>";
if (medi[i].isprn == 'y' || medi[i].isprn == "Y")
keys_str += "<td>PRN</td>";
else
keys_str += "<td>" + medi[i].time + "</td>";
keys_str += "<td>" + medi[i].medicationame + "</td>";
keys_str += "<td>" + medi[i].dosage + "</td>";
if (medi[i].is_stop !== '1' || medi[i].is_stop !== "1")
keys_str += "<td>STOPED</td>";
else
keys_str += "<td>" + medi[i].administeredby + "</td>";
keys_str += "<td>" + medi[i].witness + "</td>";
keys_str += "<td>" + medi[i].notes + "</td>";
keys_str += "<td > <img width='150px' src='" + medi[i].e_sign + "' /></td>";
keys_str += "</tr>";
}
$("#medication_hid_pdf").html();
$("#medication_hid_pdf").html(keys_str);
var date;
var time;
var medicationame;
var dosage;
var addministered;
var witness;
var str = "";
var count = 0;
for (property in medi) {
if (medi.hasOwnProperty(property)) {
str += "<tr class='gradeX'>";
date = medi[count].date;
time = medi[count].time;
medicationame = medi[count].medicationame;
dosage = medi[count].dosage;
addministered = medi[count].administeredby;
witness = medi[count].witness;
mid = medi[count].id;
str += "<td>" + date + "</td>";
if (medi[count].isprn == 'y' || medi[count].isprn == "Y")
str += "<td>PRN</td>";
else
str += "<td>" + time + "</td>";
str += "<td>" + medicationame + "</td>";
str += "<td>" + dosage + "</td>";
if (medi[count].is_stop !== '1' || medi[count].is_stop !== "1")
str += "<td>STOPED</td>";
str += "<td>" + addministered + "</td>";
str += "<td>" + witness + "</td>";
str += "<td>" + medi[count].notes + " </td>";
str += "<td ><img width='150px' src='" + medi[count].e_sign + "' /> </td>";
str += "</tr>";
count++;
}
}
$("#medicationreport_data").html(str);
}
});
I don't know exactly what your error is, but there is a lot of minor "issues" and messyness.
Now as this question is tagged PHP and you mention getting the data from the database I will assume that there is some PHP file giving this data to Javascript. How that is happening I cant tell by what is posted.
But my point is, that you should format as much of this data as you can on the PHP ( backend ) side of things. Most of this is stuff like:
....
if (medi[count].isprn == 'y' || medi[count].isprn == "Y")
str += "<td>PRN</td>";
else
str += "<td>" + time + "</td>";
....
if (medi[i].is_stop !== '1' || medi[i].is_stop !== "1")
keys_str += "<td>STOPED</td>";
else
keys_str += "<td>" + medi[i].administeredby + "</td>";
......
Basically we are just checking a value and changing it, so here PHP's loosly typed nature will help you more then JavaScripts weakly typed.
In PHP this would be something like this
$formatted = [];
foreach( $medi as $row ){
$data = []; //create a clean array if you have to
$data['isprn'] = strtolower($row['isprn']) == 'y' ? 'PRN' : $row['time'];
$data['is_stop'] = $row['is_stop'] != '1' ? 'STOPED' : '';
//include other stuff in $data you need
$formatted[] = $row;
}
Then if you get it clean enough, in Javascript you can do stuff like this
var str = '';
for (var i = 0; i < medi.length; i++) {
str += '<tr>';
str += '<td>' + medi[i].join('</td><td>') + '</td>';
str += '</tr>';
}
There are many many ways to do this, and there is a lot of "necessary" information missing for me to really be able to do much more. But I would "Strongly" suggest, normalizing all this data on the server side as best as can be done. Then on the client side you will really reduce the amount of work needed to display it to the end user.
$.each(data, function (index, info) {
var a = info.notes;
var b = info.permission;
//var c = null;
var c = null;
$.ajax({
url: "assets/getExpiration.php?expiry=" + info.expiration,
type: "GET",
dataType: "text"
}, function(data){
c = data;
});
var z = null;
switch(info.stars) {
case 0: z = "<img src='assets/img/0star.png'/>"; break;
case 1: z = "<img src='assets/img/1star.png'/>"; break;
case 2: z = "<img src='assets/img/2star.png'/>"; break;
case 3: z = "<img src='assets/img/3star.png'/>"; break;
default: z = "<label class='label label-danger'>" + c + "</label>"; break;
}
var notes = a.length > 0 ? "<i class='fa fa-file'></i>" : "";
var permission = b.length > 0 ? "<i class='fa fa-warning'></i>" : "";
if (info.status == 'EXPIRED') {
$("#pendingCall" + info.callNum).append("<button onclick=\"loadPlayer('" + info.playerTag+ "', '" + info.status + "', "+ info.callNum +")\"class='btn btn-danger disabled'>" + info.username + " " + permission + " " + notes + "</button>");
} else {
$("#pendingCall" + info.callNum).append("<button onclick=\"loadPlayer('" + info.playerTag+ "', '" + info.status + "', "+ info.callNum +")\"class='btn btn-primary'>" + info.username + " " + permission + " " + notes + "<br> " + z + "</button>");
}
});
c is not being edited. HOWEVER when I console.log(c) inside the $.ajax() it gives me the proper value. However when I console.log() outside of the $.ajax() it gives me 'null'. I've looked up MANY MANY MANY MANY stackoverflow similar questions but all the answers did not work or maybe I was just missing something.
Are you assuming that the code from:
var z = null;
switch(info.stars) {....
will wait for your ajax request to complete? If so, that's not quite how it works.
Ajax is going to fire of a request asynchronously whilst the rest of your code continues to execute (assuming you don't specify it should run synchronously <-- that's not a good idea though).
If you want to work with values returned by AJAX you need to add this code to the ajax options success property or similar which will be executed when it completes.
$.ajax is an asynchronous method that instantly returns, but will run the success and error functions after the HTTP request is completed in the background.
You will need to move your code into it's own function that is called inside the $.ajax method. Below is an example.
$.ajax({
url: "assets/getExpiration.php?expiry=" + info.expiration,
type: "GET",
dataType: "text"
}, function (data) {
c = data;
var z = null;
switch(info.stars) {
case 0: z = "<img src='assets/img/0star.png'/>"; break;
case 1: z = "<img src='assets/img/1star.png'/>"; break;
case 2: z = "<img src='assets/img/2star.png'/>"; break;
case 3: z = "<img src='assets/img/3star.png'/>"; break;
default: z = "<label class='label label-danger'>" + c + "</label>"; break;
}
var notes = a.length > 0 ? "<i class='fa fa-file'></i>" : "";
var permission = b.length > 0 ? "<i class='fa fa-warning'></i>" : "";
if (info.status == 'EXPIRED') {
$("#pendingCall" + info.callNum).append("<button onclick=\"loadPlayer('" + info.playerTag+ "', '" + info.status + "', "+ info.callNum +")\"class='btn btn-danger disabled'>" + info.username + " " + permission + " " + notes + "</button>");
} else {
$("#pendingCall" + info.callNum).append("<button onclick=\"loadPlayer('" + info.playerTag+ "', '" + info.status + "', "+ info.callNum +")\"class='btn btn-primary'>" + info.username + " " + permission + " " + notes + "<br> " + z + "</button>");
}
});
In this case, I made a row with jquery additional mechanism to obtain the parameters that I will use in data search.
$(document).ready(function() {
DataProvide();
ManipulationHere();
$('table').delegate('input[type=text].onlyDate', 'focusin', function(event) {
$(this).datepicker({
dateFormat: "yy-mm-dd",
changeMonth: true,
changeYear: true,
yearRange: '1972:2020',
});
});
$('table').delegate('input[type=text].onlyMonth', 'focusin', function(event) {
$(this).monthpicker();
});
}); //Tutup Document Ready
function ManipulationHere(){
var count = 1;
$(".button").click(function(){
count += 1;
var $row = $('<tr>'
+ '<td>' + '</td>'
+ '<td>' + '<input id="data2_' + count + '" type="text" name="data2_' + count + '" class="data2" />' + '</td>'
+ '<td>' + '<input id="rows_' + count + '" name="rows[]" value="'+ count +'" type="hidden">'
+ 'Remove' + '</td>'
+ '</tr>').appendTo("#customFields");
var copyData = $("#data1_1").clone();
var repID = copyData.attr('id', 'data1_' + count + '');
var repName = copyData.attr('name', 'data1_' + count + '');
$row.find('td:first').append(repID)
var check = $row.find('td:first').html();
var get = $(check).attr('id')
});
$("#customFields").on('click','.remCF',function(){
$(this).parent().parent().remove();
count -= 1;
});
$("#customFields").on('change', '.tabelBaru', function() {
var validator = $("#signupForm").validate();
validator.resetForm();
var $this = $(this),
nilai = $this.val();
console.log(nilai);
if(nilai=='gender'){
$this.closest("tr").find(".data2").replaceWith(
'<select name="data2_' + count + '" class="data2">'
+ '<option value="man" selected >Man</option>'
+ '<option value="woman">Woman</option>'
+ '</select>'
)
}
else if(nilai=='religion'){
$this.closest("tr").find(".data2").replaceWith(
'<select name="data2[]" class="data2">'
+ '<option value="protestan" selected >Protestan</option>'
+ '<option value="khatolik">Khatolik</option>'
+ '<option value="islam">Islam</option>'
+ '<option value="budha">Budha</option>'
+ '<option value="hindu">Hindu</option>'
+ '</select>'
)
}
else if(nilai=='blood'){
$this.closest("tr").find(".data2").replaceWith(
'<select name="data2_' + count + '" class="data2">'
+ '<option value="gol_a" selected >A</option>'
+ '<option value="gol_b">B</option>'
+ '<option value="gol_ab">AB</option>'
+ '<option value="gol_o">O</option>'
+ '</select>'
)
}
else if(nilai=='birth_date'){
$this.closest("tr").find(".data2").replaceWith(
'<input type="text" id="data2_' + count + '" name="data2_' + count + '" value="" placeholder="Date Format" class="onlyDate"/>'
)
}
else if(nilai=='start_date'){
$this.closest("tr").find(".data2").replaceWith(
'<input type="text" id="data2_' + count + '" name="data2_' + count + '" value="" placeholder="Date Format" class="onlyDate"/>'
)
}
else if(nilai=='end_date'){
$this.closest("tr").find(".data2").replaceWith(
'<input type="text" id="data2_' + count + '" name="data2_' + count + '" value="" placeholder="Date Format" class="onlyDate"/>'
)
}
else if(nilai=='join_date'){
$this.closest("tr").find(".data2").replaceWith(
'<input type="text" id="data2_' + count + '" name="data2_' + count + '" value="" placeholder="Date Format" class="onlyDate"/>'
)
}
else if(nilai=='los_month'){
$this.closest("tr").find(".data2").replaceWith(
'<input type="text" id="data2_' + count + '" name="data2_' + count + '" value="" placeholder="Month Format" class="onlyMonth"/>'
)
}
else{
$this.closest("tr").find(".onlyDate").replaceWith(
'<input type="text" id="data2_' + count + '" name="data2_' + count + '" value="" class="data2"/>'
)
}
});
}
function DataProvide(){
selectValues = {
"pilih" : "-Pilih-",
"id" : "ID",
"emp_name" : "Employee Name",
"photo_path" : "Photo Path",
"emp_id" : "Employee ID",
"birth_place" : "Birth Place",
"birth_date" : "Birth Date",
"age" : "Age",
"gender" : "Gender",
"religion" : "Religion",
};
$.each(selectValues, function(key, value) {
$('#data1_1')
.append($("<option></option>")
.attr("value",key)
.text(value));
});
}
The results of the above process, I have a line that will be used as a parameter.
For example, when a row is added :
I want to create query generated after the SAVE process is :
SELECT * from my_table_name WHERE id='123'
If I add one more line parameters with example :
I want to create query generated after the SAVE process is :
SELECT * from my_table_name WHERE id='123' and employee_name='Testing'
And if I want to add another parameter search by adding a third line :
I want to query is generated after clicking the button in the process is :
SELECT * from my_table_name WHERE id='123' and employee_name='Testing' and employee_id='111'
I have made a function to try to read the data from the form POST results like this :
$Query = "SELECT * from my_table_name WHERE ....... << from looping"
foreach ($_POST['rows'] as $key => $count ){
$Data1 = $_POST['data1_'.$count];
$Data2 = $_POST['data2_'.$count];
echo $Data1." >> ".$Data2;
echo "<br>";
}
How do I get the data key and value from the POST results for later input into my query?
You are almost there, you just need to change your loop a little bit.
$query = "SELECT * from my_table_name WHERE ";
$first = true;
foreach ($_POST['rows'] as $key => $count ) {
$field = $_POST['data1_' . $count];
$value = $_POST['data2_' . $count];
if ($first) {
$query .= $field . " = '" . $value . "'";
$first = false;
} else {
$query .= " AND " . $field . " = '" . $value . "'";
}
}
Keep in mind, this will only work if you submit at least one item to be queried against.
This also assumes that what you get back from $field is the name of the field in the database.
As an additional exercise, I strongly suggest that you look to see if you database implementation can use prepared statements. They are significantly more secure.