# Thực hiện chức năng crud add (ok)

{% embed url="<https://index.php>" %}

{% file src="/files/-Mgv88hBO8943xmGHJ2w" %}

```
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <!-- The above 3 meta tags *must* come first in the head; any other head content must come *after* these tags -->
  <title>CRUD BackboneJS PHP MySQL</title>
  <!-- Bootstrap -->
  <link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
  <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" rel="stylesheet">
  <link href="https://cdn.datatables.net/1.10.16/css/dataTables.bootstrap.min.css" rel="stylesheet">
  <style>
    .alert.fixed {
      position: fixed;
      top: 20px;
      left: 25%;
      width: 50%;
      margin-bottom: 0;
      box-shadow: 0px 0px 10px #454545;
    }
  </style>
  <!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
  <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
  <!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
  <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
  <![endif]-->
</head>
<body>
<div class="modal fade" id="modalDelete" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
  <div class="modal-dialog">
    <div class="modal-content">
      <div class="modal-header">
        Modal Confirm
      </div>
      <div class="modal-body">
        <div class="content"></div>
      </div>
      <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button>
        <a href="#" id="delete" class="btn btn-success success">Delete</a>
      </div>
    </div>
  </div>
</div>
<div class="container">

  <div class="page-header">
    <h1>MY CRUD</h1>
  </div>
  <div id="message"></div>
  <div class="panel panel-default">
    <div class="panel-body" id="primary-content">
      <!-- this is content -->
    </div>
  </div>
  <button style="margin:10px 0;" class="btn btn-warning" type="button" data-toggle="collapse" data-target="#collapseExample" aria-expanded="false" aria-controls="collapseExample"><i class="fa fa-desktop"></i> Show Output JSON</button>
  <div class="collapse" id="collapseExample">
    <code id="output" style="display:block;white-space:pre-wrap;"></code>
  </div>
</div>
<script type="text/jst" id="formTemplate">
        <div class="row">
            <div class="col-md-6 col-md-offset-3">
                <div class="alert alert-danger fade in" style="display:none;"></div>
                <form>
                    <h2><%= name %></h2>
                    <div class="form-group">
                        <label>Name:</label>
                        <input type="text" class="form-control" name="name" value="<%= name %>" />
                    </div>
                    <div class="form-group">
                        <label>Email:</label>
                        <input type="text" class="form-control" name="email" value="<%= email %>" />
                    </div>
                    <div class="form-group">
                        <label>Phone:</label>
                        <input type="text" class="form-control" name="phone" value="<%= phone %>" />
                    </div>
                    <div class="form-group">
                        <label>Address:</label>
                        <textarea class="form-control" rows="5" name="address"><%= address %></textarea>
                    </div>
                    <div class="form-group">
                        <label>Active:</label>
                        <% if(_.isEmpty(active) == false && active == 1) { %>
                            <input type="checkbox" name="active" value="1" checked>
                        <% } else { %>
                            <input type="checkbox" name="active" value="0">
                        <% } %>
                    </div>
                    <button class="save btn btn-large btn-info" type="submit">Save</button>
                    <a href="#crud/index" class="btn btn-large btn-default">Cancel</a>
                </form>
            </div>
        </div>
    </script>

<!-- the index container -->
<script type="text/template" id="indexTemplate">

  <a style="margin:10px 0px;" class="btn btn-large btn-info" href="#crud/new"><i class="fa fa-plus"></i> Create New Data</a>

  <div id="collapseExample2">
    <% if (_.isEmpty(cruds)){ %>
    <div class="alert alert-warning">
      <p>There are currently no cruds. Try creating some.</p>
    </div>
    <% } %>

    <table id="list-cruds" class="table table-bordered table-striped">
      <thead>
      <tr>
        <th>No.</th>
        <th>Name</th>
        <th>Email</th>
        <th>Phone</th>
        <th>Address</th>
        <th>Active</th>
        <th width="140">Action</th>
      </tr>
      </thead>
      <tbody>
      <% var idx = 1 %>
      <% _.each(cruds, function (crud) { %>
      <tr>
        <td><%= idx++ %></td>
        <td><%= crud.name %></td>
        <td><%= crud.email %></td>
        <td><%= crud.phone %></td>
        <td><%= crud.address %></td>
        <% if (crud.active == 0) {%>
        <td>Disable</td>
        <% } else { %>
        <td>Active</td>
        <% } %>
        <td class="text-center">
          <a class="btn btn-xs btn-info" href="#crud/<%= crud.id %>/edit"><i class="fa fa-pencil"></i> Edit</a>
          <a id="deleteButton" class="btn btn-xs btn-danger item-destroy" data-id="<%= crud.id %>"><i class="fa fa-trash"></i> Delete</a>
        </td>
      </tr>
      <% }); %>
      </tbody>
    </table>
    <a style="margin:10px 0px;" class="btn btn-large btn-info" href="#crud/index"> All</a>
    <a style="margin:10px 0px;" class="btn btn-large btn-info" href="#crud/active"> Active</a>
    <a style="margin:10px 0px;" class="btn btn-large btn-info" href="#crud/disable"> Disable</a>
  </div>

</script>

<!-- jQuery (necessary for Bootstrap's JavaScript plugins) -->
<script src="assets/js/jquery.min.js"></script>
<!-- Include all compiled plugins (below), or include individual files as needed -->
<script src="assets/js/bootstrap.min.js"></script>
<script src="assets/backbone/underscore-min.js"></script>
<script src="assets/backbone/backbone-min.js"></script>
<script src="assets/backbone/backbone.localStorage.js"></script>
<script src="assets/js/pubnub.min.js"></script>
<script src="bower_components/pubnub-backbone/backbone-pubnub.min.js"></script>
<script>
  var pubnub = PUBNUB.init({
    subscribe_key: 'sub-c-4c7f1748-ced1-11e2-a5be-02ee2ddab7fe',
    publish_key: 'pub-c-6dd9f234-e11e-4345-92c4-f723de52df70',
  });
</script>
<script src="routers.js"></script>
<script src="models.js"></script>
<script src="views/view.js"></script>
<script src="views/add.js"></script>
<script src="views/notification.js"></script>
<script src="helpers.js"></script>
<script src="https://cdn.datatables.net/1.10.16/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.16/js/dataTables.bootstrap.min.js"></script>
<script>
  var app = new APP.crudRouter();
</script>
</body>
</html>
```

{% embed url="<https://crud.php>" %}

```
<?php
$db = new PDO('mysql:host=localhost;dbname=backbonejs', 'root', '');
$page = isset($_GET['p'])? $_GET['p'] : '';
if($page=='add'){
  $sql = "INSERT INTO crud values (:id,:nm,:em,:hp,:ad,:at)";
  $query = $db->prepare($sql);
  $query->execute(array(":id"=>null,":nm"=>$_POST['name'],":em"=>$_POST['email'],":hp"=>$_POST['phone'],":ad"=>$_POST['address'],":at"=>$_POST['active']));
} else if($page=='edit'){
  $sql = "UPDATE crud SET name= :nm, email= :em, phone= :hp, address= :ad, active= :at WHERE id = :id";
  $query = $db->prepare($sql);
  $query->execute(array(":id"=>$_POST['id'],":nm"=>$_POST['name'],":em"=>$_POST['email'],":hp"=>$_POST['phone'],":ad"=>$_POST['address'], ":at"=>$_POST['active']));
} else if($page=='trash'){
  $sql = "DELETE FROM crud WHERE id = :id";
  $query = $db->prepare($sql);
  $query->execute(array(":id"=>$_POST['id']));
} else if($page=='item'){
  $statement = $db->query("SELECT * FROM crud WHERE id = ".$_GET['id']);
  $statement->setFetchMode(PDO::FETCH_ASSOC);
  echo json_encode($statement->fetch());
} else{
  $statement = $db->query('SELECT * FROM crud');
  $statement->setFetchMode(PDO::FETCH_ASSOC);
  echo json_encode($statement->fetchAll());
}
?>
```

views/notification.js

```
"use strict";

APP.AlertView = Backbone.View.extend({

    tagName: "div",

    className: "alert fade",

    template: ["<a href=\"#\" data-dismiss=\"alert\" class=\"close\">&times;</a>", "<strong><%= title %></strong>", "<%= message %>"].join("\n"),

    initialize: function (options) {

        _.bindAll(this, "render", "remove");

        this.template = _.template(this.template);

        if (options) {
            this.alert = options.alert || "info";
            this.title = options.title || "";
            this.message = options.message || "";
            this.fixed = options.fixed || false;
        }

    },

    render: function () {
        var that = this,
            output = this.template({title: this.title, message: this.message});

        this.$el.addClass("alert-" + this.alert).html(output).alert();

        if (this.fixed) {
            this.$el.addClass("fixed");
        }

        window.setTimeout(function () {
            that.$el.addClass("in");
        }, 20);

        return this;
    },

    remove: function () {
        var that = this;

        this.$el.removeClass("in");

        window.setTimeout(function () {
            that.$el.remove();
        }, 1000);
    }
});

APP.AlertView.show = function (title, message, alertType) {
    var alert = new APP.AlertView({
        alert: alertType,
        title: title,
        message: message,
        fixed: true
    });

    $(document.body).append(alert.render().el);

    window.setTimeout(function () {
        alert.remove();
    }, 9000);

    return alert;
};


```

views/add.js

```
"use strict";

APP.crudNewView = Backbone.View.extend({
  // functions to fire on events
  // here we are blocking the submission of the form, and handling it ourself
  events: {
    "click button.save": "save",
    "keyup input": "validate",
    "keyup textarea": "validate"
  },
  
  template: _.template($('#formTemplate').html()),

  initialize: function (options) {
    this.model.bind('invalid', APP.helpers.showErrors, APP.helpers);
  },

  save: function (event) {
    event.stopPropagation();
    event.preventDefault();
    var at = this.$el.find('input[name=active]').prop('checked');
    if (at) {
        at = 1;
    } else {
        at = 0;
    }

    // update our model with values from the form
    this.model.set({
      id: this.$el.find('input[name=id]').val(),
      name: this.$el.find('input[name=name]').val(),
      email: this.$el.find('input[name=email]').val(),
      phone: this.$el.find('input[name=phone]').val(),
      address: this.$el.find('textarea[name=address]').val(),
      active: at
    });
    if (this.model.isValid()) {
      // save it
      this.collection.add(this.model);
      if (this.model.save) {
          new APP.AlertView.show("CRUD", "Created Success", "success");
      } else {
          new APP.AlertView.show("Error", "can not be created", "danger");
      }
      var id = this.$el.find('input[name=id]').val();
      var nm = this.$el.find('input[name=name]').val();
      var em = this.$el.find('input[name=email]').val();
      var hp = this.$el.find('input[name=phone]').val();
      var ad = this.$el.find('textarea[name=address]').val();
      $.post("crud.php?p=add", { id: id, name: nm, email: em, phone: hp, address: ad, active: at } , function(data){
        Backbone.history.navigate("crud/index", {trigger: true});
      });
    }
  },

  // populate the html to the dom
  render: function () {
    this.$el.html(
    	this.template(this.model.toJSON())
    );
    return this;
  }
});
```

Source

C:\xampp\htdocs\gulp

{% file src="/files/-MemfxDOa7PowwwT\_JeC" %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://javascriptuse.gitbook.io/advanced/thuc-hien-chuc-nang-crud-add-ok.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
