2013-11-26 144 views
0

我想實現的是刪除整行。首先我顯示錶格,然後如果你點擊每一行的「刪除」按鈕,那麼確認模式會顯示詢問你是否要刪除該行。用jquery json ajax刪除整行php

我正在嘗試使用jquery,ajax,json和PHP。我當然還在學習。

到目前爲止,我有什麼是這樣的:

JavaScript文件:

function callToModal(data){ 
$('#myModal3 .modal-body p').html("Desea eliminar al usuario " + '<b>' + data + '</b>' + ' ?'); 
$('#myModal3').modal('show'); 
$('.confirm-delete').on('click', function(e) { 
e.preventDefault(); 
var id = $(this).data('id'); 
$('#myModal3').data('id', id).modal('show'); 
}); 


$('#btnYes').click(function() { 
// handle deletion here 
var id = $('#myModal3').data('id'); 
alert(id); 
$.ajax({ 
    url: "deleteFrontUser", 
    type: 'POST', 
    data: { 
     id:id 
      }, 
     success: function(html){ 
     //alert(html); 
     $('[data-id='+id+']').parents('tr').remove(); 
     $('#myModal3').modal('hide'); 
     }  
    }); 
    return false; 
}); 
}; 

在我的admin.php的文件:

public function deleteFrontUser(){ 
    // var_dump($_POST['id']);die(); 
    $rowId = $_POST['rowId']; 

    $result = array(); 

    $front = UserDs::getInstance()->getUserById($id); 
    UserDs::getInstance()->deleteItem($front); 

    $result["message"] = "Usuario eliminado"; 

    echo json_encode($result); 
} 

視圖(請注意,我正在使用Smarty模板引擎):

<div class="portlet-body"> 
     <table class="table table-striped table-hover table-users"> 
      <thead> 
       <tr> 
        <th>Avatar</th> 
        <th class="hidden-phone">Usuario</th> 
        <th>Nombre</th> 
        <th>Apellido</th> 
        <th class="hidden-phone">Email</th> 
        <th class="hidden-phone">Provincia</th> 
        <th class="hidden-phone">Miembro desde</th> 
        <th>Estado</th> 
        <th></th> 
        <th></th> 
       </tr> 
      </thead> 

      <tbody> 
       {foreach $frontusers as $frontuser} 
       <tr> 
        {if $frontuser->frontavatar_id eq null} 
        <td><img src="{site_url()}assets/img/avatar.png" alt="" /></td> 
        {else} 
        <td><img src="{site_url()}assets/img/avatar1.jpg" alt="" /></td> 
        {/if} 
        <td class="hidden-phone">{$frontuser->username}</td> 
        <td>{$frontuser->name}</td> 
        <td>{$frontuser->lastname}</td> 
        <td class="hidden-phone">{$frontuser->email}</td> 
        <td class="hidden-phone">{$frontuser->state}</td> 
        <td class="hidden-phone">{$frontuser->creation_date|date_format:"%Y/%m/%d"}</td> 

        {if $frontuser->status eq 2} 
        <td ><span class="label label-success">Activo</span></td> 
        {else} 
        <td ><span class="label label-warning">No Activo</span></td> 
        {/if} 

        <td><a class="btn mini blue-stripe" href="{site_url()}admin/editFront/{$frontuser->id}">Modificar</a></td> 

        <td><a href="#" class="btn mini red-stripe confirm-delete" role="button" onclick="callToModal('{$frontuser->username}');" data-id="{$frontuser->id}">Eliminar</a></td> 
       </tr> 



       <!-- modal --> 
       <div id="myModal3" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel3" aria-hidden="true"> 
        <div class="modal-header"> 
         <button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button> 
         <h3 id="myModalLabel3">Eliminar</h3> 
        </div> 
        <div class="modal-body"> 
         <p></p> 
        </div> 
        <div class="modal-footer"> 
         <button class="btn" data-dismiss="modal" aria-hidden="true">Cerrar</button> 
         <button data-dismiss="modal" class="btn red" id="btnYes">Confirmar</button> 
        </div> 
       </div> 
       <!-- end modal --> 

       {foreachelse} 
        <tr> 
         <td colspan="2"><span class="text-error"><i class="icon-exclamation"></i> No hay Usuarios cargados.</span></td> 
        </tr> 
       {/foreach} 
      </tbody> 
     </table> 
    </div> 

當您點擊特定行的刪除按鈕時,模式顯示,但這裏有趣的是:第一次按刪除時,它不會刪除該行。當您按下該行或任何其他行時(按下一次刪除後),該行將被刪除。所以這是一個問題,另一個問題是我無法將數據發送到我的php文件,所以我可以從數據庫中刪除它。

我該如何解決這個問題?

我有一個自定義的撥弄着這一點,如果你想看看:code

+0

當你按下刪除時,你是否檢查過它是否真的從數據庫中刪除了該行,並且它沒有被html反映出來? – echochamber

+0

@echochamber它只反映在瀏覽器中,不在我的數據庫中。 – Limon

回答

0

解決方案是這樣的:

見我以前的帖子纔能有正確的js文件和查看:post

從數據庫中刪除整個行PHP代碼將是:

public function deleteFrontUser(){ 

    $rowId = $_POST['id']; 

    $result = array(); 

    $front = UserDs::getInstance()->getUserById($rowId); 
    UserDs::getInstance()->deleteItem($front); 

    $result["message"] = "Usuario eliminado"; 

    echo json_encode($result); 
} 
1

url中具有T o是位於您的網站內的有效網站,您不能在url之內獲得函數名稱,因爲AJAX調用將不知道該函數位於哪個文件中。

所以你url必須是:

url: "admin.php" 

你可以,但是,添加其他參數到您AJAX電話告訴admin.php哪個函數應該執行,像這樣的工作:

$.ajax({ 
    url: "admin.php", 
    type: 'POST', 
    data: { 
     id:id, 
     func:"deleteFrontUser" 
    }, 
    success: function(html) 
    { 
     //alert(html); 
     $('[data-id='+id+']').parents('tr').remove(); 
     $('#myModal3').modal('hide'); 
    }  
}); 

admin.php您必須在輸入函數之前收到發佈的數據,並且您可以分析函數變量以確定要執行哪個函數:

$rowId = $_POST['id']; 
$func = $_POST['func']; 

switch ($func) 
{ 
    case 'deleteFrontUser': 
     deleteFrontUser($rowId); 
    break; 
    default: 
     // function not found. 
    break; 
} 

Wherea deleteFrontUser看起來是這樣的:

public function deleteFrontUser($rowId) 
{ 
    $result = array(); 
    // Rest of the code. 
    echo json_encode($result); 
} 

也許你需要修改這個有點,但是這應該給你的想法。請致電$.ajax documentation

注:

最佳做法的原因,請使用php's isset函數來確定數據是否實際上帳。該ternary操作使得這個非常容易和短:

$emptyString = ""; 
$rowId = isset($_POST['id']) ? $_POST['id'] : $emptyString; 
$func = isset($_POST['func']) ? $_POST['func'] : $emptyString; 

我還建議使用jQuery的.on功能,讓它走參數「咔嗒」聲,這些都會對點擊事件觸發功能。 .click通常是不好的做法,因爲它無法檢測到DOM樹內的更改,所以當您用新的HTML更新它時,.on允許您將新元素添加到dom樹,但仍然能夠偵聽對應於他們。

+0

非常令人印象深刻,你是如何解釋它的。只有我的代碼適用於url:'nameOfTheFunction'。沒有必要把admin.php,如果我這樣做,然後自動有很多錯誤,因爲路徑如何符合。你後來所說的最佳做法,我當然會記住:)感謝 – Limon

+0

也許它在某些框架中有效。但是如果它提供了一些有用的信息,那麼投票就不會受到傷害。 – Jonast92

+0

我認爲它只適用於我的路由配置!當然是upvote,抱歉沒有在整個週末進入這裏。 :) 謝謝 – Limon