codeigniter3应用程序:通过ajax更新mysql表列和相应的视图

n8ghc7c1  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(328)

我正在使用codeigniter3和twitter引导程序开发一个注册和登录应用程序。
我有一个“users”mysql表和相应的“users.php”视图,该视图以html格式呈现“users”表,如下图所示:

引导表中的“actions”列在每一行上都有一个“enable”或“disable”按钮,具体取决于用户的状态。视图这部分的代码是:

// Status column
<td>
   <?php if ($user->active == 1) {
    echo '<span class="text-success">' . 'Enabled' . '</span>';
    } else {
    echo '<span class="text-danger">' . 'Disabled' . '</span>';
    }
   ?>
</td>

// Enable/Disable buttons
<?php if ($user->active == 1) { ?>
    <a href="<?php echo base_url(); ?>users/deactivate/<?php echo $user->id ?>" title="Deactivate" class="btn btn-success btn-xs state-change" data-role="deactivate" data-id="<?php echo $user->id ?>"><span class="glyphicon glyphicon-ban-circle"></span> Disable</a>
<?php } else { ?>
   <a href="<?php echo base_url(); ?>users/activate/<?php echo $user->id ?>" title="Activate" class="btn btn-success btn-xs state-change" data-role="activate" data-id="<?php echo $user->id ?>"><span class="glyphicon glyphicon-ok"></span> Enable</a>
<?php } ?>

我通过ajax在不刷新页面的情况下激活/停用用户:

$('.state-change').on('click', function(evt) {
    evt.preventDefault();
    var id = $(this).data('id');
    var role = $(this).data('role');
    if (role == "activate") {
        var stateUrl = 'users/activate/';
    } else {
        var stateUrl = 'users/deactivate/';
    }
    $.ajax({
        url: stateUrl + id,
        method: 'GET',
        dataType: 'php',
        success: function(){
            console.log(id);
            console.log(role);
        }
    });
});

问题是,有关用户状态的数据不会返回到视图,“status”和“actions”列也不会正确呈现。
我希望我不必使用jquery的 html() 方法或类似的东西。

function(){
    console.log(id);
    console.log(role);
    //change columns html here
}

如何“动态”更新视图?

ss2ws0br

ss2ws0br1#

上面的答案已经足够了-您必须根据您的场景使用javascript。问题似乎在于从动态网页到动态html的飞跃。
请在此处阅读总结的最后一行:https://en.wikipedia.org/wiki/dynamic_html

tjjdgumg

tjjdgumg2#

取回数据后,需要使用javascript修改表。因为您已经在使用jquery了,所以您可以使用一些工具使之非常简单。
您的问题可以分为两个步骤:确定要更新的页面的正确部分,然后修改感兴趣的单元格。
由于传递给函数的鼠标事件包含对所单击对象的引用,因此可以简化对正确单元格的标识。
为了更容易地找到table的正确部分,最好给每个 <td> a类:

// Status column
<td class="status-column">
    // your php status stuff from above
</td>

// Button column
<td class="activate-column">
    // your php button-drawing stuff from above
</td>

现在很容易找到要修改的内容。
下面是您的ajax调用,其中添加了一些内容来重新绘制有问题的单元格:

$('.state-change').on('click', function(evt) {
    evt.preventDefault();
    var id = $(this).data('id');
    var role = $(this).data('role');
    if (role == "activate") {
        var stateUrl = 'users/activate/';
    } else {
        var stateUrl = 'users/deactivate/';
    }
    $.ajax({
        url: stateUrl + id,
        method: 'GET',
        dataType: 'php',
        success: function(){
            console.log(id);
            console.log(role);

            // find the row that is the parent of the clicked button - http://api.jquery.com/parent/
            var row = evt.target.parent('tr');

            // use the class of the table cell to identify it. http://api.jquery.com/find/
            var statusCell = row.find('.status-column').first();

            // now put in the new status. http://api.jquery.com/html/
            if (role == "activate") {
                statusCell.html('<span class="text-success">Enabled</span>');
            } else {
                statusCell.html('<span class="text-danger">Disabled</span>');
            }
        }
    });
});

我会留下按钮栏让你练习:)。
edit:您还可以使用非jquery方法操纵dom,这些方法可能更符合您的喜好。这就是jquery在幕后所做的。
您可以在mdn上阅读更多关于它们的信息。

// build the new DOM node
var newStatusCellContent = document.createElement('span');
newStatusCellContent.setAttribute('class', role == 'activate' ? 'text-enabled' : 'text-danger');
newStatusCellContent.textContent = role == 'activate' ? 'Enabled' : 'Disabled';

// get the parent <td> node from the jQuery object
var statusCell = row.find('.status-column').get(0);

// swap the old contents for the new
var oldChild = statusCell.childNodes[0]
statusCell.replaceNode(newStatusCellContent, oldChild);

仔细研究上述链接中的文档可能会发现一些方法,使您的特定案例更有效。请记住,这与jquery是一样的 html() 方法确实可以-或者Angular 或任何其他-虽然它使您远离html,但在本例中它并没有真正改进您的代码。我真的很讨厌html,但它是我们得到的工具。
注意,php还有dom库;如果你想的话,你也可以用它们来构建你的原始页面,并且永远使用html。但我不推荐,除非在某些情况下。

相关问题