PHP и jQuery в динамическом поле


я хотел бы знать, что я терпю неудачу в следующем коде, идея заключается в представлении с CodeIgniter, я загружаю array в select, и нажатие кнопки может добавить новый select, но когда я загружаю новый select с jQuery, он не работает.

это мой код:

<div class="row">
    <div class="col-lg-12">
        <div class="form-group">
            <label style="text-transform: uppercase">Piezas</label>
            <select id="marca" name="marca" class="form-control select2" style="width: 100%;" required>
            <?php foreach ($piezas->result() as $fila) { ?>
            <option value="<?= $fila->id_pieza; ?>"><?= $fila->descripcion; ?></option>
            <? } ?>
            </select>
        </div>
    </div>
</div>

<div class="agregando1"></div>

<div class="row">
    <div class="col-lg-12" style="text-align: left;">
        <a id="agregar_pza" href="#" title="Agregar Otro Contacto" class="btn btn-flat btn-primary">AGREGAR</a>
    </div>
</div>

и код jQuery:

$('#agregar_pza').click(function(event) {
        /* Act on the event */
        event.preventDefault();
        $('.agregando1').append('<div class="row"><div class="col-lg-12"><div class="form-group"><label style="text-transform: uppercase">Piezas</label><select name="piezas[]" class="form-control select2" style="width: 100%;" required><?php foreach ($piezas->result() as $fila) { ?><option value="<?= $fila->id_pieza; ?>"><?= $fila->descripcion; ?></option><? } ?></select></div></div></div>');
    });
Author: Alvaro Montoro, 2016-03-03

2 answers

Не видя примера сгенерированного кода и не зная, есть ли ошибки в консоли (и какие из них), очень трудно определить, где проблема с кодом, который вы показываете. Это может произойти по разным причинам.

Возможная причина 1: short-open tag не поддерживается

Как указывает Диего Гальегос в своем ответе, может быть, у вас есть <? } ?> в части PHP; но это не обязательно. <? } ?> (short-open tag) и <?php } ?> эквивалентны и должны запуск обоих (в зависимости от версии PHP и конфигурации сервера).

Кроме того, из того, что упоминается в вопросе ("Когда я загружаю новый select с jquery, он не работает") кажется, что оригинальный select работает нормально, проблема заключается в том, что кнопка нажата и новый select динамически генерируется, поэтому все указывает на код в JavaScript/jQuery.

Решение, если это была проблема: измените <? } ?> на <?php } ?>.


Возможная причина 2: в JavaScript встроен PHP-код

В коде jQuery, которым Вы делитесь:

$('#agregar_pza').click(function(event) {
    /* Act on the event */
    event.preventDefault();
    $('.agregando1').append('<div class="row"><div class="col-lg-12"><div class="form-group"><label style="text-transform: uppercase">Piezas</label><select name="piezas[]" class="form-control select2" style="width: 100%;" required><?php foreach ($piezas->result() as $fila) { ?><option value="<?= $fila->id_pieza; ?>"><?= $fila->descripcion; ?></option><? } ?></select></div></div></div>');
});

Есть PHP код<?php foreach ($piezas->result() as $fila) { ?><option value="<?= $fila->id_pieza; ?>"><?= $fila->descripcion; ?></option><? } ?>.

Где находится этот код? Если он находится в документе с расширением .js, часть PHP не будет выполняться и будет считаться строкой, как и любая другая, поэтому новый select не будет иметь выбора (или будет иметь один вариант с "мусором-PHP" как значение и текст).

Возможное решение, если это была проблема: переместите часть JS со встроенным PHP в PHP-файл, таким образом, команды PHP будут выполняться, и select должен быть сгенерирован нормально.

Что-то говорит мне, что это реальная причина проблемы.


Возможная причина 3: неправильные кавычки

Если ни один из вышеперечисленных вариантов не работает, проблема может заключаться в том, что любое из значений имеет кавычки, которые не они правильно убегают. В части HTML вам не нужно было беспокоиться об этом, но теперь, когда PHP генерируется внутри строки JavaScript.

Например, представьте, что одно из значений Frenos O'hara. Поскольку в имени/значении есть одинарная кавычка, а строка JavaScript вы также определяете ее одинарными кавычками ('<div class="row">...'), тогда строка сломается, и JavaScript потерпит неудачу при запуске. Хорошо, если это так: вы можете увидеть ошибку в консоли JavaScript. Плотно закройте его, нажав F12 в IE, o Ctrl+Shift+J в Chrome или Firefox и посмотрите, появляется ли сообщение об ошибке при нажатии кнопки.

Решение, если это была проблема: он избегает строк перед записью их на экране (это всегда хорошая практика, которая предотвратит возможные атаки XSS). В зависимости от того, куда они идут, вы можете использовать htmlspecialchars или json_encode. В этом случае второй вариант.


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

Похоже, что select (и структура вокруг него), которая генерируется с помощью jQuery, такая же, как и изначально генерируемая на странице, поэтому вы можете изменить код, чтобы получить эквивалентный, но не зависящий от PHP результат и без кавычек:

  1. Добавляет класс специфический (например, fila-a-copiar) к исходной строке:

    <div class="row fila-a-copiar">
        <div class="col-lg-12">
            ....
    
  2. В контроллере click:

    1. Выберите последнюю строку с добавленным классом:

      var $div = $('div.fila-a-copiar:last');
      
    2. Клонирует последнюю строку с классом Row-to-copy

      var $clon = $div.clone();
      
    3. Добавьте клон, куда он должен идти в документе.

Таким образом, код будет намного чище (я не пробовал, вам может понадобиться изменения):

$('#agregar_pza').click(function(event) {
    /* Act on the event */
    event.preventDefault();
    var $div = $('div.fila-a-copiar:last');
    var $clon = $div.clone();
    $('.agregando1').append($clon);
});
 3
Author: Alvaro Montoro, 2016-03-03 13:11:52

Я думаю, что ваша ошибка находится в закрывающем кронштейне:

У вас есть это:

<?php foreach ($piezas->result() as $fila) { ?>
   <option value="<?= $fila->id_pieza; ?>"><?= $fila->descripcion; ?></option>
<? } ?>   <---ERROR AQUI

Должно быть:

<?php } ?>

Я не запустил код, но, похоже, это так.

 0
Author: Diego Gallegos, 2016-03-03 05:26:20