Program edytuje dane podane w wirtualnej liście za pomocą okienka modalnego (sheet)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
axios
  .get("http://localhost/data") //pobranie danych do wirtualnej listy
  .then(response => {
    var virtualList = app.virtualList.create({ //inicjacja wirtualnej listy
      // List Element
      el: ".virtual-list",
      // Pass array with items
      items: response.data, //dane pobrane z serwera
      // Custom search function for searchbar
      searchAll: function(query, items) {
        var found = [];
        for (var i = 0; i < items.length; i++) {
          if (
            items[i].title.toLowerCase().indexOf(query.toLowerCase()) >= 0 ||
            query.trim() === ""
          )
            found.push(i);
        }
        return found; //return array with mathced indexes
      },
      // List item Template7 template
      itemTemplate:
        '<li data-id="{{id}}">' +
        '<a href="#" class="item-link item-content item-sheet">' +
        '<div class="item-inner">' +
        '<div class="item-title-row">' +
        '<div class="item-title">{{nazwa}}</div>' +
        "</div>" +
        '<div class="item-subtitle">{{cena}}</div>' +
        "</div>" +
        "</a>" +
        "</li>",
      // Item height
      height: app.theme === "ios" ? 63 : app.theme === "md" ? 73 : 46
    });

    $$(".virtual-list").on("click", "li", function() { //zdarzenie po kliknięciu w element listy
      let _this = this;

      var dynamicSheet = app.sheet.create({ //formularz do edycji
        content: `<div class="sheet-modal">
                        <div class="toolbar">
                        <div class="toolbar-inner">
                        <div class="left"></div>
                        <div class="right">
                        <a class="link sheet-close">Done</a>
                        </div>
                        </div>
                        </div>
                        <div class="sheet-modal-inner">
                        <div class="block">
                        <div class="list no-hairlines-md">
                        <ul>
                            <li class="item-content item-input">
                                <div class="item-inner">
                                    <div class="item-input-wrap">
                                    <input type="text" placeholder="Tytuł" id="title">
                                    <span class="input-clear-button"></span>
                                    </div>
                                </div>
                            </li>
                            <li class="item-content item-input">
                                <div class="item-inner">
                                    <div class="item-input-wrap">
                                    <input type="number" placeholder="tekst" id="subtitle">
                                    <span class="input-clear-button"></span>
                                    </div>
                                </div>
                            </li>
                            <li class="item-content item-input">
                                <div class="item-inner">
                                    <div class="item-input-wrap">
                                    <button class="col button button-fill" id="save">Zapisz</button>
                                    <span class="input-clear-button"></span>
                                    </div>
                                </div>
                            </li>
                        </ul>
                        </div>
                       
                        <p><a href="#" class="link sheet-close">Close me</a></p>
                        </div>
                        </div>
                        </div>`,
        // Events
        on: {
          open: function(sheet) { //po otwarciu sheet'a
            let id = _this.dataset.id; //pobranie id klikniętego elementu listy
            let title = _this.getElementsByClassName("item-title");
            let subtitle = _this.getElementsByClassName("item-subtitle");

            let titleInput = sheet.el.querySelector("#title"); //pobranie uchwytu do inputów z otwartego sheet'a
            let subtitleInput = sheet.el.querySelector("#subtitle");

            titleInput.value = title[0].innerText; //podanie aktualnych danych do inputów
            subtitleInput.value = subtitle[0].innerText;

            let saveBtn = sheet.el.querySelector("#save");

            saveBtn.addEventListener("click", function() { //po kliknięciu w przycisk "zapisz"
              title[0].innerText = titleInput.value; //nadpisanie danych w liście
              subtitle[0].innerText = subtitleInput.value;

              //wysyłanie na serwer danych do edycji
              app.request.post(
                "http://localhost/data/update.php",
                {
                  nazwa: titleInput.value, //dane z inputa
                  cena: subtitleInput.value,
                  id: id //id wpisu w bazie danych
                },
                function(data) {
                  console.log("Load was performed", data);
                }
              );
            });
          }.bind(_this),
          opened: function(sheet) {
            console.log("Sheet opened");
          }
        }
      });
      // Open dynamic sheet
      dynamicSheet.open();
    });
  });

Szablon html wirtualnej listy

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<div class="page" data-name="list">
    <div class="navbar">
        <div class="navbar-bg"></div>
        <div class="navbar-inner sliding">
            <div class="title">Virtual List</div>
            <div class="subnavbar">
                <form data-search-container=".virtual-list" data-search-item="li" data-search-in=".item-title" class="searchbar searchbar-init">
                    <div class="searchbar-inner">
                        <div class="searchbar-input-wrap">
                            <input type="search" placeholder="Search" />
                            <i class="searchbar-icon"></i>
                            <span class="input-clear-button"></span>
                        </div>
                        <span class="searchbar-disable-button if-not-aurora">Cancel</span>
                    </div>
                </form>
            </div>
        </div>
    </div>
    <div class="searchbar-backdrop"></div>
    <div class="page-content">
        <div class="list simple-list searchbar-not-found">
            <ul>
                <li>Nothing found</li>
            </ul>
        </div>
        <div class="list virtual-list media-list searchbar-found"></div>
    </div>
</div>

Api na serwerze wystawiające json’a z bazy

1
2
3
4
5
6
7
8
9
10
<?php
$conn = new mysqli("localhost", "root", "", "virtuallist");
$conn->set_charset("utf8");
if ($result = $conn->query("SELECT * FROM produkty")) {
    $arr = [];
    while($row = $result->fetch_array(MYSQLI_ASSOC)) {
            $arr[] = $row;
    }
    echo json_encode($arr);
}

Kod na serwerze obierający dane z aplikacji

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
header('Content-Type: text/html; charset=utf-8');
if(isset($_POST["nazwa"])&&isset($_POST["cena"])&&isset($_POST["id"])) {
    $conn = new mysqli("localhost", "root", "", "virtuallist");
    $conn->set_charset("utf-8");
    $conn->query("SET NAMES utf8");

    $nazwa = $_POST["nazwa"];
    $cena = $_POST["cena"];
    $id = $_POST["id"];

    $stmt = $conn->prepare("UPDATE produkty SET nazwa=?, cena=? WHERE id=?");
    $stmt->bind_param('sii', $nazwa, $cena, $id);
    $stmt->execute();
    $result = $stmt->get_result();
}