0

I have a dynamic table that can be edited inline or can have rows dynamically added. I want to be able to hit a save button that runs an UPDATE query to update the database. But I can't figure out how. I am really stuck on this and would appreciate any help.

My DB connection:

<?php
$host="xxxxx"; 
$dbName="xxxxxxxx"; 
$dbUser="xxxx"; 
$dbPass="xxxxxxxxxxxxx";

$dbh = new PDO( "sqlsrv:server=".$host."; Database=".$dbName, $dbUser, $dbPass);
$dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sql = "SELECT * FROM Stage_Rebate_Master ORDER BY MR_ID ASC";
?>

HTML/PHP:

<div id="users-contain" class="ui-widget">
<table id="html_master" class="ui-widget ui-widget-content">
<thead>
    <tr class="ui-widget-header">
    <td>ID</td>
    <td>Vendor</td>
    <td>Buyer ID</td>
    <td>POC Name</td>
    <td>POC Email</td>
    <td>POC Phone</td>
    <td>Edit/Delete</td>
    </tr>
</thead>
<tbody>

<?php
    foreach ($dbh->query($sql) as $rows){
    ?>
    <tr>
        <td class="mr_id" contenteditable="false"><?php echo intval ($rows['MR_ID'])?></td>
        <td class="mr_name" contenteditable="false"><?php echo $rows['MR_Name']?></td>
        <td class="buyer_id" contenteditable="false"><?php echo $rows['Buyer_ID']?></td>
        <td class="poc_n" contenteditable="false"><?php echo $rows['MR_POC_N']?></td>     
        <td class="poc_e" contenteditable="false"><?php echo $rows['MR_POC_E']?></td>
        <td class="poc_p" contenteditable="false"><?php echo $rows['MR_POC_P']?></td>
        <td><input type="button" class="edit" name="edit" value="Edit">
        <input type="button" class="deactivate" name="deactivate" value="Deactivate"></td>
    </tr>
 <?php
  }
 ?>
</tbody>

    <input type="button" class="create-user" value="Add Row">
    <input type="submit" value="Save Table" class="save">

</table>
</div>

    <input type="button" class="create-user" value="Add Row">
    <input type="submit" value="Save Table" class="save">

JavaScript:

// ----- Deactivate/Activate Row -----

$(document).on("click", "#html_master .deactivate", function () {
  var $this = $(this);
  var $tr = $this.closest('tr');
  var action = $tr.hasClass('deactivated') ? 'activate' : 'deactivate';

  // ------ Confirmation box in order to deactivate/activate row -----
  if (confirm('Are you sure you want to ' + action + ' this entry?')) {
    $tr.toggleClass('deactivated');
    $this.val(function (i, t) {
      return t == 'Deactivate' ? 'Activate' : 'Deactivate';
    });
  }
});

// ----- Edit Row -----

$(document).on("click", "#html_master .edit", function () {
  var $this = $(this);
  var tds = $this.closest('tr').find('td').not('.mr_id').filter(function () {
    return $(this).find('.edit').length === 0;
  });
  if ($this.val() === 'Edit') {
    $this.val('Save');
    tds.prop('contenteditable', true);
  } else {
    var isValid = true;
    var errors = '';
    $('#myDialogBox').empty();
    // changed from here.......
    var elements = tds;
    if (tds.find('input').length > 0) {
      elements = tds.find('input');
    }
    elements.each(function (index, element) {
      var type = $(this).attr('class');
      var value = (element.tagName == 'INPUT') ? $(this).val() : $(this).text();
      // changed from here....... to here
      // ----- Switch statement that provides validation -----
      switch (type) {
        case "buyer_id":
          if (!$.isNumeric(value)) {
            isValid = false;
            errors += "Please enter a valid Buyer ID\n";
          }
          break;
        case "poc_n":
          if (value == value.match(/^[a-zA-Z\s]+$/)) {
            break;
          }
          else {
            isValid = false;
            errors += "Please enter a valid Name\n";
          }
          break;
        case "poc_e":
          if (value == value.match(/^[\w\-\.\+]+\@[a-zA-Z0-9\.\-]+\.[a-zA-z0-9]{2,4}$/)) {
            break;
          }
          else {
            isValid = false;
            errors += "Please enter a valid Email\n";
          }
          break;
        case "poc_p":
          if (value == value.match('^[0-9 ()+/-]{10,}$')) {
            break;
          }
          else {
            isValid = false;
            errors += "Please enter a valid Phone Number\n";
          }
          break;
      }
    })
    if (isValid) {
      $this.val('Edit');
      tds.prop('contenteditable', false);
    } else {
      alert(errors);
    }
  }
});

// ----- Dialog Box -----

$( function() {   

    var dialog, form,

      emailRegex = /^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/,
      phoneRegex = /^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$/,
      mr_name = $( "#mr_name" ),
      buyer_id = $( "#buyer_id" ),
      poc_n = $( "#poc_n" ),
      poc_e = $( "#poc_e" ),
      poc_p = $( "#poc_p" ),
      allFields = $( [] ).add( mr_name ).add( buyer_id ).add( poc_n ).add( poc_e ).add( poc_p ),
      tips = $( ".validateTips" );
  console.log(allFields);

    function updateTips( t ) {
      tips
        .text( t )
        .addClass( "ui-state-highlight" );
      setTimeout(function() {
        tips.removeClass( "ui-state-highlight", 1500 );
      }, 500 );
    }

    function checkRegexp( o, regexp, n ) {
      if ( !( regexp.test( o.val() ) ) ) {
        o.addClass( "ui-state-error" );
        updateTips( n );
        return false;
      } else {
        return true;
      }
    }

    function addVendor() {
      var valid = true;
      allFields.removeClass( "ui-state-error" );

      valid = valid && checkRegexp( mr_name, /^[a-z]([0-9a-z_\s])+$/i, "Please enter a valid vendor name" );
      valid = valid && checkRegexp( buyer_id, /^(0|[1-9][0-9]*)$/, "Please enter a valid Buyer ID" );
      valid = valid && checkRegexp( poc_n, /^[a-zA-Z ]*$/, "Please enter a valid name" );
      valid = valid && checkRegexp( poc_e, emailRegex, "Please enter a valid email" );
      valid = valid && checkRegexp( poc_p, phoneRegex, "Please enter a valid phone number" );

      if ( valid ) {
        var $tr = $( "#html_master tbody tr" ).eq(0).clone();
        $.each(allFields, function(){
          $tr.find('.' + $(this).attr('id')).html( $(this).val() );
        });
        $tr.find('.mr_id').html( $( "#html_master tbody tr" ).length + 1 );
        $( "#html_master tbody" ).append($tr);
        dialog.dialog( "close" );
      }
      return valid;
    }

    var dialog = $( "#dialog-form" ).dialog({
      autoOpen: false,
      height: 400,
      width: 350,
      modal: true,
      buttons: {
        "Add Row": addVendor,
        Cancel: function() {
          dialog.dialog( "close" );
        }
      },
      close: function() {
        form[ 0 ].reset();
        allFields.removeClass( "ui-state-error" );
      }
    });

    form = dialog.find( "form" ).on( "submit", function( event ) {
      event.preventDefault();
      addVendor();
    });

    $( ".create-user" ).button().on( "click", function() {
      dialog.dialog( "open" );
    });
  } );


// ----- Save Table -----
$(document).on("click", ".save", function () {

  // ------ Confirmation box in order to deactivate/activate row -----
  if (confirm('Saving will update the entire table. Are you sure you want to save?')) {
      // yourformelement.submit();
  } else {
      return false;
  }
});
Rataiczak24
  • 1,000
  • 11
  • 43
  • 1
    You should have to make an ajax call and post the form data in the php file and make code there to update data in table. – Rahul Patel Oct 21 '16 at 14:21
  • 1
    Which aspect are you struggling with i.e. the form submission, ajax, the update query etc? Also, is there anything you've already tried that didn't work? – Rwd Oct 21 '16 at 14:21
  • http://stackoverflow.com/questions/16323360/submitting-html-form-using-jquery-ajax This has a good example – Neo Oct 21 '16 at 14:32
  • @RossWilson Im pretty much struggling with everything related to submitting the data and getting the call to the database and it reading the update query...not too familiar with doing this but need it done – Rataiczak24 Oct 21 '16 at 14:35
  • Did you use any javascript for inline edit in table row? Need to know it first, because it can be accomplished in many ways.... – Rahman Ashik Oct 21 '16 at 14:56
  • @RahmanAshik yes, i just updated my code and included all of my javascript – Rataiczak24 Oct 21 '16 at 14:59

1 Answers1

0

In your save button click event, write following code:

// ----- Save Table -----
$(document).on("click", ".save", function () {

  // ------ Confirmation box in order to deactivate/activate row -----
  if (confirm('Saving will update the entire table. Are you sure you want to save?')) {
  var tabledata=[];
  $( "#html_master tbody tr" ).each(function( index ) {
      tabledata[index] = {
          mr_id: $( this ).find("td.mr_id").text(),
          mr_name: $( this ).find("td.mr_name").text(),
          buyer_id: $( this ).find("td.buyer_id").text() //add rest of the fields
      };

});
    //now call a normal ajax request to your php process page

    $.ajax({
        url: "process.php",
        type: "post",
        data: {data: tabledata},
        success: function(result){
            //do whatever you want
        }
    })

      // yourformelement.submit();
  } else {
      return false;
  }
});

In your php process page (I assumed process.php), you can now retrieve these post data and run sql query

$data = $_POST['data'];
foreach($data as $row){
    // now you have $row['mr_id'], $row['mr_name'] etc. do normal sql update query in each loop. I suppose mr_id is the primary key. so use it in where clause
}

This is the general idea of saving this whole table at once using ajax. Also note that I didn't test the code. There can be errors. Though there are some rich 3rd party scripts which looks good and make it easier to use.

Rather than saving all rows together which can become slow, I think it is better to save each row separately as there is already a save button when you click edit each row. In that case code needs to be modified a bit.

Hope it will help. Let me know if any clarification needed!

Rahman Ashik
  • 260
  • 1
  • 9
  • Okay got it...so what would it all look like in the process.php page? – Rataiczak24 Oct 21 '16 at 18:07
  • You can do normal update query inside loop, like this: $sql = "UPDATE Stage_Rebate_Master SET MR_Name='$row[mr_name]', MR_POC_N='$row[poc_n]' WHERE MR_ID='$row[mr_id]'"; $dbh->query($sql); – Rahman Ashik Oct 21 '16 at 18:19
  • im pretty sure i have everything and its not working still.....do i need to include my DB connection in the process.php page? – Rataiczak24 Oct 21 '16 at 18:29
  • I put in the connection and still nothing...what do I need to put after the `success: function(result){` in the javascript? – Rataiczak24 Oct 24 '16 at 17:21
  • It depends what you want to do on client side. but I think first priority is if data is inserted in db or not. you can also alert(result); inside success function to see if there is any thing returned. – Rahman Ashik Oct 26 '16 at 04:03