PHP CodeIgniter: обновление динамического массива, связанного с полем ввода - PullRequest
0 голосов
/ 14 сентября 2018

То, что я собираюсь показать, может быть самым ужасным из существующих кодов, так что будьте готовы.Я новичок в PHP и получил проект CodeIgniter.Вот и мы:

В моем представлении edit_article я динамически генерирую поля <input> и делаю их доступными для контроллера, публикуя их в виде массива, уведомление name="pricelevel_checked_array[]":

<form id="form-work" class="form-horizontal" role="form" autocomplete="off" method="post">
    <!-- excluded code to display form content -->
    <?php
    $pricelevel_array = array();
    $count = 0; ?>

    <?php foreach($array_used_for_loop as $item_used_for_loop): ?>
        <?php $article_group_price = ""; ?>
        <!-- excluded code to fill $article_group_price -->

        <div class="col-sm-2">
            <div class="checkbox">
                <span class="bg-transparent left">
                    <input type="checkbox" data-init-plugin="switchery" data-size="small" data-color="primary" id="<?=$count?>"
                    <?php if($article_group_price !== ""): ?>
                        <?php array_push($pricelevel_array, 1); ?>
                        checked="checked"
                    <?php else: array_push($pricelevel_array, 0); ?>
                    <?php endif; ?>
                    onchange="groupprice_active_changed(this)"/>
                </span>
            </div>
        </div>
        <input hidden type="number" id="pricelevel_checked_array" name="pricelevel_checked_array[]" value="<?=$pricelevel_array[$count];?>">
        <?php $count++; ?>
    <?php endforeach; ?>
</form>

Как видите, я заполняю этот массив 1 или 0 в зависимости от значения $article_group_price (я получаю эти значения из контроллера и исходной базы данных).

Все отлично работает при первой загрузке представления и массив заполнен правильно, но я не могу обновить массив, когда я ставлю или снимаю флажок.

Я пытался сделать это быстрои грязный, используя javascript onchange="groupprice_active_changed(this)", где я бы использовал переменную $count для изменения индекса массива, но, к сожалению, это не сработало, поскольку я получаю только одно значение, а не весь массив:

<script>
function groupprice_active_changed(obj) {
  if($(obj).is(":checked")){
    alert("Yes checked");
    var input_value_array = document.getElementById('pricelevel_checked_array').value;
    console.log(input_value_array);
    for (index = 0; index < input_value_array.length; index++) {
      console.log(input_value_array[index]);
    }
  }else{
    alert("not checked")
  }
}
</script>

Как лучше всего обновить этот массив или изменить мой код, чтобы я мог публиковать динамически сгенерированные флажки на контроллере? Другая проблема заключается в том, что мне нужен идентификатор checkbox в контроллере, даже если он ложный.И что браузер не публикует непроверенное значение флажка. Итак, просто передать флажки не вариант.

Я, конечно, готов опубликовать больше кода.
Спасибо

Отказ от ответственности: Пожалуйста, не крадите
Просмотр : Полный код
Контроллер : Полный код

Правка 1 : в последнем разделе изменено значение 'php' на 'браузер'
Правка 2 : добавлено так же, как ивесь код, потому что фильтрация только усложнит его.

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

В итоге я принял решение отказаться от подхода с использованием целого массива и следовать принципу KISS, передавая мой индекс контроллеру.Я использую эти индексы только для сохранения проверенных строк.Спасибо @ryantxr за то, что показали мне, что я все это обдумываю.

v_edit_article

<?php $index = 0; ?>
<?php foreach($array_used_for_loop as $item_used_for_loop): ?>
    <?php $article_group_price = ""; ?>
    <!-- excluded code to fill $article_group_price -->

    <div class="col-sm-2">
        <div class="checkbox">
            <span class="bg-transparent left">
                <input type="checkbox" name="group_active[]" data-init-plugin="switchery" data-size="small" data-color="primary" value="<?=$index;?>"
                    <?php if($article_group_price !== ""): ?>
                    checked="checked"
                    <?php endif; ?>/>
                </span>
            </div>
        </div>
    </div>
    <?php $index++; ?>
<?php endforeach; ?>

admin (controller)

public function edit_article($id) {
    // Excluded code

    $group_prices_active = array();
    if(isset($data['group_active'])):
        echo "<script>console.log('GROUP_ACTIVE ".print_r($data['pricelevel_checked'])."');</script>";

        foreach($data['group_active'] as $value):
            array_push($group_prices_active, $group_prices[$value]);
        endforeach;
        echo "<script>console.log('GROUP_PRICES_ACTIVE ".print_r($group_price_active)."');</script>";

        unset($data['group_active']);
    endif;

    // Excluded code
    $this->m_articles->edit_article($data, $id, $article_types, $group_prices_active);

    $this->session->set_flashdata('succes', $this->lang->line('edit_success'));
    redirect('/administrator/articles', 'refresh');
}
0 голосов
/ 14 сентября 2018

Одна техника, которую я видел, использовала, чтобы заставить флажки вести себя лучше, это использовать скрытый ввод с тем же именем, что и флажок. Поместите скрытый ввод перед флажок. Если флажок не установлен, значение скрытого ввода получает отправлено. Если вы отметите флажок, то значение флажка переопределяет скрытый ввод. Это работает, потому что отправлено только одно из значений. Браузер отправляет более позднюю версию.

Взгляните на следующий пример.

<html>
<head>
</head>
<body>
<div>
<form method="post">
    <input type="hidden" name="foo" value="off">
    <input type="checkbox" name="foo" /> Foo
    <input type="submit" />
</form>
</div>
</body>
</html>
<?php if ( ! empty($_POST) ) : ?>
    <div> Hello </div>
    <div>
        Checkbox is <?= $_POST['foo']?>
    </div>
<?php endif ?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...