Как обновить значения флажков с помощью пользовательского ввода - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь получить фрагмент кода, который отображает данные из таблицы, сохраняет данные внутри флажка, который, если выбран, отправляет его вперед. Но я застрял в проблеме с попыткой выбрать количество, отличное от исходного, оно всегда выберет максимальное количество из-за того, что флажок установлен на камень при загрузке страницы, могу ли я каким-то образом обновить значения флажка ? Код флажка выглядит так:

$order = wc_get_order( $ordernumber );

  foreach ($order->get_items() as $item ){

    $unitprice = $item->get_total() / $item->get_quantity();

       echo "<input type='checkbox' name='productinfo[]' value='" . " " . $item->get_name() . "  ,  " . $item->get_quantity() . " units" . " | " . $item->get_total() ."'>";

, и это отображает выбор суммы для количеств 2 и более:

  if($item->get_quantity() > 1) {
                echo "Amount: " . "<input type='number' name='numberqty' value='" . $item->get_quantity() . "'max='" .$item->get_quantity() . "' min='1' > " . "<br/>";
              }

это то, как это отображается на самом сайте: (обратите внимание, сверху вниз они означают «Название продукта», «Количество», «Цена за единицу», «Общая цена продуктов») enter image description here

После выбора нужных флажков пользователь нажимает кнопку, которая направляет их на следующий сайт с выбранными продуктами с более ранней страницы

если пользователь выбрал здесь 2, я хочу, чтобы число на следующей странице было 2, а если выбрано 1, то будет 1. Но сейчас, даже если выбрано 2, на следующей странице будет отображаться 3 вместо желаемого 2.

Есть ли способ заставить эту работу, обновив заданную сумму в значение флажка, который был установлен ранее?

edit: согласно запросу, для выяснения того, что я хочу сделать, это. Чтобы позволить мне выбрать количество с номером типа ввода внутри уже определенного флажка, созданного с помощью foreach, который сохраняет данные внутри флажка вручную, цель состоит в том, чтобы позволить обновить значение флажка до единицы с новым количеством, которое установлено первоначально в этом куске кода:

$quant = $item->get_quantity();
echo "<input type='checkbox' name='productinfo[]' value='" . " " . $item->get_name() . "  ,  " . $quant . " kpl" . " | " . $item->get_total() ."'>";

вот полный код страниц 2 и 3.

  <div class="Etusivu">
        <form action="" method="post" style="border:0px solid #ccc">
            <fieldset><legend><b>Tuotteiden palautus</b></legend>
              <div class="step">
            <legend>Askel 2/3</legend>
          </div>
          <br />
              <p class="important">Tilauksen tiedot</p>
              <br />
              <div class="valitse">

            <p class="important">Valitse kaikki tuotteet, jotka haluat palauttaa</p>
          </div>
            <hr>

            <script>
            //function for making a checkbox to check all checkboxes
            function toggle(source) {
              checkboxes = document.getElementsByName('productinfo[]');
              for(var i=0, n=checkboxes.length;i<n;i++) {
                checkboxes[i].checked = source.checked;
              }
            }
            function checkboxupdate {
              document.getElementById("numberqty").value = "<?php " " . $item->get_name() . "  ,  " . "2" . " kpl" . " | " . $item->get_total() ?>"
            }
            </script>

              <input type='checkbox' onClick='toggle(this)' />

            <p class="selectall">Valitse kaikki tuotteet</p>

            <label>Tilauksessa tulleet tuotteet:</p>
            <br />


            <?php
            //Gets and displays data based on certain variables from the database, connects quantity and product name into one string in array
            $order = wc_get_order( $ordernumber );
            foreach ($order->get_items() as $item ){
              $max = $item->get_quantity();
              $quant = $item->get_quantity();
              $unitprice = $item->get_total() / $item->get_quantity();

              echo "<input type='checkbox' name='productinfo[]' value='" . " " . $item->get_name() . "  ,  " . $quant . " kpl" . " | " . $item->get_total() ."'>";
              echo '<p>';
              echo __('Tuotteen nimi: ' ) . $item->get_name() . '<br>';
              if($item->get_quantity() > 1) {
                echo "Määrä: " . "<input type='number' name='numberqty' value='" . $quant . "'max='" . $quant . "' min='1' > " . "<br/>";

              }
              else {
              echo __('Määrä: ' ) . $quant . '<br>';
            }
            if ($item->get_quantity() > 1) {

              echo __('Tuotteen kappalehinta: ') . $unitprice . '€' . '<br/>';
            }
              echo __('Tuotteiden kokonaishinta: ' )  . wc_price($item->get_total()) . '</p>' . '<br/>';

           }
            echo '<p>'. __('Tilauksen yhteishinta: ') . $order->get_total() . '</p>';
            echo "<button onclick='checkboxupdate()'>kokeile</button>";
            ?>
            <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

            <input type="submit" id='check' value="Seuraava"/>
            <script>
            //Checks if any checkboxes have been checked, if not, displays an error
            function checkBoxCheck() {
              if($('input[name="productinfo[]"]:checked').length) {
                console.log("at least one checked");
                return true;
              }
              else {
                alert("Valitse vähintään yksi tuote.");
                return false;
              }
            }
            //runs the script for checking the checkboxes
            $('#check').on('click', checkBoxCheck);
          </script>

            </label>

            <div class="clearfix">
              <input type="hidden" name="page" value="2">

            </div>
          </fieldset>
        </form>
        <br />
    </div>
    </body>
    </html>



 <?php
    //checks if the 2nd page submit button has been pressed successfully, if so continues to the next page
  } if ($page == 2) {
    global $wbdb;
    //prints errors, for debugging
    if($wpdb->last_error !== ''){
      $wpdb->print_error();
      //creates a new variable for later input of a comment within a textarea
      $comments = $_SESSION['commentone'] = $_POST['comments'];
  }
?>

<body>
    <div class="Etusivu">
        <form action="" method="post" style="border:0px solid #ccc">
            <fieldset><legend><b>Tuotteiden palautus</b></legend>
              <div class="step">
            <legend>Askel 3/3</legend>
          </div>
          <br />
              <p class="important">Palautuksen varmistus</p>
              <br />
              <div class="valitse">
            <p class="important">Haluatko varmasti palauttaa seuraavat tuotteet?</p>
          </div>
            <hr>
            <?php
            //Makes an array from given data from the previous page
            $test = $_POST['productinfo'];
            //variable for counting total price of the chosen items
            $total2 = 0;
            //variable for counting the total quantity of the selected items
            $totalquantity = 0;
            //Loop for displaying every selected product individually and their prices and quantities and adding each price and quantity to eachother to allow calculation of total price and quantity
            for($i=0; $i < sizeof($test); $i++) {
            list($name, $total) = explode("|", $test[$i]);
            echo "Nimi: ".$name;
            echo "<br>";
            echo "Hinta: ".$total . "€";
            echo "<br>";
            echo "<br/>";
            $total2 += $total;
            $totalquantity += $quantity;
            $names[] = $name;

}
            //Sets the total price, quantity into a session
            $_SESSION['totalprice'] = $total2;
            $_SESSION['totalquantity'] = $totalquantity;
            //Uses Json encoding to set the array including the displayed names into session data to allow the displayment of each within the secondary form to insert the data into the database
            $_SESSION['product'] = json_encode($names, JSON_UNESCAPED_UNICODE );
            ?>

            <br />
            <br />
            <h4>Kirjoita alas, miksi haluat palauttaa tuotteen/tuotteet?</h4>

            <?php

            //variable for textarea comment to allow insertion into database
            $comments = $_POST['comments'];

            //Inside textarea $comments displays the data inside it to save it and insert it into database that way?>
            <textarea id='commenter' name='comments' cols='30' rows='4' placeholder='Kirjoita tähän:'><?php echo $comments; ?></textarea>

            <div class="refundprice">
              <?php //inside label is a $total2 variable which is the total price of everything that was checked and taken to this page ?>
            <?php echo '<label>Palautettavien tuotteiden yhteishinta: ' . $total2 . '€' . '</label>'
            ?>
          </div>
            <div class="clearfix">

           <input type="hidden" name="page" value="3">
          <input type="submit" class="signupbtn" name="sendrqst" value="Lähetä">
          </div>
        </fieldset>
        </form>
    </div>
    </body>
    </html>
    <?php

  }

?>

1 Ответ

0 голосов
/ 06 ноября 2018

Прежде всего, давайте "оптимизируем" вашу toggle() функцию:

  • function toggle(source) {
      // 1. Define `checkboxes` and `i` as local variables using the `var`
      // keyword.
      var checkboxes = document.getElementsByName('productinfo[]'), i;
    
      // 2. I also "simplified" your `for` expression - no extra "n" here.
      for (i=0; i<checkboxes.length; i++) {
        checkboxes[i].checked = source.checked;
      }
    }
    

    или почему бы не использовать jQuery:

    function toggle(source) {
      jQuery( ':checkbox[name="productinfo[]"]' )
        .prop( 'checked', source.checked );
    }
    

Теперь выберите один из этих вариантов или попробуйте оба:

Решение 1: JavaScript + PHP

Я видел, что вы пытались использовать функцию checkboxupdate() для динамического обновления значения checkbox & mdash; или, точнее, количество, которое пользователь ввел в поле количества. Но это не работает, потому что нет элементов с id из numberqty и, во-вторых, переменная PHP $item там не определена и вызовет фатальную ошибку. (И даже если вы исправили это, вам все равно придется изменить код, чтобы он действительно работал.)

Обратите внимание, что это и другое решение основаны на вашем формате для значения checkbox & mdash; обратите внимание на пробел в начале: {item name} , {quantity} kpl | {total price}.

  1. На шаге 2 в цикле foreach примените следующие изменения:

    foreach ($order->get_items() as $item ){
      // 1. Wrap the item inside this `div`.
      echo '<div class="order-item">';
    
      ... your code here ...
      // 2. For the quantity field, replace the name='numberqty' with
      //    class='numberqty'. I.e. use `class` instead of `name`.
      if($item->get_quantity() > 1) {
        echo "Määrä: " . "<input type='number' class='numberqty' value='" . $quant . "'max='" . $quant . "' min='1' > " . "<br/>";
    
      }
      ... your code here ...
    
      // 3. Make sure to close the `div`.
      echo '</div>';
    }
    
  2. Затем используйте это checkboxupdate(), которое использует jQuery:

    function checkboxupdate() {
      jQuery( ':checkbox[name="productinfo[]"]' ).each( function() {
        var $order_item = jQuery( this ).closest( '.order-item' ),
          $qty = $order_item.find( 'input.numberqty' );
    
        if ( $qty.length ) {
          jQuery( this ).val( this.value.replace(
            /\d+ (kpl \| [0-9\.]+)$/,
            ( $qty.val() || 1 ) + ' $1'
          ) );
        }
      });
    }
    
  3. и , если необходимо (поскольку ваш $name ниже уже содержит количество), на шаге № 3, в цикле for вы можете получить количество (без единицы или текст kpl) вроде так:

    for($i=0; $i < sizeof($test); $i++) {
      list($name, $total) = explode("|", $test[$i]);
    
      // 1. Retrieve the preferred refund quantity.
      list( $name2, $quantity ) = explode( ' , ', $name );
      $quantity = intval( $quantity ); // strips the " kpl"
      echo 'The quantity: ' . $quantity . '<br>'; // test
    
      ... your code here ...
    }
    

А для кнопки, которая вызывает функцию checkboxupdate(), убедитесь, что кнопка type установлена ​​правильно & mdash; если вы этого не сделаете, по умолчанию используется кнопка «Отправить», и при нажатии на нее будет отправлена ​​форма, а не просто обновлено значение checkbox:

<button onclick='checkboxupdate()' type="button">kokeile</button>

или добавьте return false; к атрибуту onclick, чтобы предотвратить действие по умолчанию:

<button onclick='checkboxupdate(); return false'>kokeile</button>

Решение 2: только для PHP

Обратите внимание, что это только один из различных способов перенести выбранное количество на следующую страницу (или перейти с шага № 2 к шагу № 3). И с этой опцией вы просто проигнорируете кнопку checkboxupdate() и , которая вызывает функцию.

  1. Выполните эти изменения в цикле foreach на шаге № 2:

    // 1. Add the `$i => `
    foreach ($order->get_items() as $i => $item ){
      ... your code here ...
    
      // 2. Add the `; $i` to the value - at the end.
      echo "<input type='checkbox' name='productinfo[]' value='" . " " . // wrapped
        $item->get_name() . "  ,  " . $quant . " kpl" . " | " . $item->get_total() ."; $i'>";
      ... your code here ...
      // 3. Change the `name` to numberqty[ $i ].
      if($item->get_quantity() > 1) {
        echo "Määrä: " . "<input type='number' name='numberqty[" . $i . "]' value='" // wrapped
          . $quant . "'max='" . $quant . "' min='1' > " . "<br/>";
    
      }
      ... your code here ...
    
    }
    

    Или просто удалите " , " . $quant . " kpl" . из поля productinfo, где разметка будет:

    echo "<input type='checkbox' name='productinfo[]' value='" . " " . // wrapped
      $item->get_name() . " | " . $item->get_total() ."; $i'>";
    
  2. До цикла for на шаге # 3, добавьте переменную $qty_array, как вы можете видеть ниже, затем внесите другие изменения внутри этого цикла:

    // 1. Retrieve all the POSTed numberqty values.
    $qty_array = isset( $_POST['numberqty'] ) ? (array) $_POST['numberqty'] : array();
    
    for($i=0; $i < sizeof($test); $i++) {
      list($name, $total) = explode("|", $test[$i]);
    
      // 2. Retrieve the preferred refund quantity.
      list( $total, $index ) = explode( '; ', $total );
      $quantity = isset( $qty_array[ $index ] ) ? intval( $qty_array[ $index ] ) : 1;
      echo 'The quantity: ' . $quantity . '<br>'; // test
    
      // 3. Update the quantity in the item *name*.
      list( $name ) = explode( ' , ', $name );
      $name .= ' , ' . $quantity . ' kpl';
    
      echo 'Nimi: ' . $name . '<br>';
      ... your code here ...
    }
    

    Если вы удалили " , " . $quant . " kpl" . из поля productinfo, игнорируйте следующее list():

    //list( $name ) = explode( ' , ', $name ); // purposely commented out
    

И это действительно все, что вам нужно, пользовательский JavaScript не нужен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...