Брояч

teroristd

Registered
Здравейте, извинявам се за заглавието, но не можах да измисля нещо което описва проблема.

Имам view в което визуализирам продукти и всеки продукт има брояч(не знам дали това е правилно наименование) за количество. Ето пример.

Id: 1 | Title: Product 1 | Quantity: -1+
Id: 2 | Title: Product 2 | Quantity: -1+

Искам когато се натисне плюс на дадения продукт, броячът да се увеличава с едно и да се упдейтва поле в базата данни. За минус обратното.

Принципно го бях направил така.

View
PHP:
<form method="post"">

        <?php
        foreach ($this->_image as $value)
        {
        ?>

         <input name="idProduct" type="hidden" value="<?php echo $value['id']; ?>"/>
         <input name="minus" type="submit" value="-"/>
         <span id="counter"><?php echo $value['counter']; ?></span>
         <input name="plus" type="submit" value="+"/>

        <?php
        }
        ?>

    </form>

Controller
PHP:
$id = $this->_normalize->post('idProduct');
$plus = $this->_normalize->post('plus');
$minus = $this->_normalize->post('minus');

if (isset($plus))
    {
       $this->_cartModel->cartUpdatePlus($id);
     }
if (isset($minus))
     {
       $this->_cartModel->cartUpdateMinus($id);
      }

Проблемът е че работи само за единия продукт. В смисъл не идва ид-то според това на кой продукт натискам плюса или минуса, ами идва само последното ид. Как да оправя този проблем?
 
<form action="/url/to/update/$id" method="post">
твоето вю с бутоните за + и - тук
</form>

всичко това в for loop-a, който имаш. Съответно в контролера вече ще имаш $id.

Съвет 1 - ID-тата трябва да са уникални в една страница - <span id="counter">

Съвет 2: не използвай { } когато работиш в темплейта. Ето така е по-красиво :)

Код:
<?php foreach($this as $that): ?>
<html tags><?=$that ?>
<?php endforeach; ?>
 
Това, което написа @djman е много яко.

Само ще добавя, че всъщност ти се ъпдейтва един продукт, защото имаш много полета с едно и също име (name="idProduct") и взима последното такова поле, когато събмитваш формата.
 
Ето едно по-различно решение с vue.js (https://vuejs.org/)

Малко по-опростена версия ( без ajax ) можеш да видиш тук - https://jsfiddle.net/wv74matg/1/ .

Зареждаме vuejs
Код:
<script src="http://cdnjs.cloudflare.com/ajax/libs/vue/1.0.24/vue.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue-resource/0.7.0/vue-resource.js"></script>

Използваме м v-for, за да създадем списък с данни от масив. ( https://vuejs.org/v2/guide/list.html ). Това един вид foreach цикъл, но във vue.js .

Код:
<table id="template-item">
    <tr v-for="item in items" is="item" :key="item.id">
      <td class="col-md-6">
        {{ item.title}}
      </td>
      <td>
        {{ item.count }}
      </td>                           
      <td>  
        <a @click="plusItem(item.id)" href="#" title="+">+</a>
        <a @click="minusItem(item.id)" href="#" title="-">-</i></span></a>
<a @click="deleteItem(item.id)" href="#" title="-">Delete</i></span></a>
  </td>
  </tr>
</table>

Данните подаваме чрез метода fetchItems ( в случая http://site.com/api/items връща json масив в данните от db ), който се изпълнява при зареждане или като отговор при извикването на другите методи. addItem и removeItem съответно добавят/изваждат предмет. deleteItem трие предмета.


Код:
<script type="text/javascript">
                    new Vue({
                        el: '#template-item',
                        data: {
                            items: []
                        },
                        ready: function () {
                            this.fetchItems()
                        },
                        methods: {
                            fetchItems: function () {
                                let vm = this;
                                items_url = '/api/items'
                                this.$http.get(items_url)
                                    .then(function (response) {
                                        vm.$set('items', response.data.data)
                                    });
                            },
                            plusItem: function (item_id) {
                                let vm = this;
                                item_url = "/api/plus/"+item_id
                                this.$http.get(item_url)
                                    .then(function (response) {
                                        this.fetchItems();
                                    });
                            },
                            minusItem: function (item_id) {
                                let vm = this;
                               item_url = "/api/minus/"+item_id
                                this.$http.get(item_url)
                                    .then(function (response) {
                                        this.fetchItems();
                                    });
                            },
                            deleteItem: function (item_id) {
                                let vm = this;
                               item_url = "/api/delete/"+item_id
                                this.$http.get(item_url)
                                    .then(function (response) {
                                        this.fetchItems();
                                    });
                            }
                        }
                    });   
</script>

Само трябва да си навържеш PHP-то да ти прави съответните действия на добавяне, изваждане и триене спрямо ид-то на записа ( /api/items, /api/plus, /api/minus, /api/delete )
 

Горе