• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Fehler bei duplizieren von Elementen

mitch26

New member
Schönen guten Tag.

Ich möchte aus einer vorher (mit cakephp erstellten) definierten Tabellenstruktur per JavaScript Tabellenzeilen duplizieren. Den Code habe ich mir aus einer Beispielanwendung rauskopiert und angepasst. So wie nachfolgend dargestellt funktioniert das ganze leider nicht. Wenn ich aber die Zeile <?php echo $this->Form->input('Copy.' . $key . '.id'); ?> auskommentiere werden die neuen Tabellenzeilen erstellt. Das Problem dabei ist, dass beim erneuten abspeichern immer wieder neue Datensätze angelegt werden. Selbst für die schon vorhanden. Ich denke das liegt dann klar an der nicht vorhandenen ID (weil auskommentiert).

Die Frage ist nun was ist an dem Code falsch?

Vielen Dank für die Hilfe.

mitch26

PHP:
<div class="col-md-12">
        <div class="col-xs-12 table-responsive">
                <table id="tableCopies" class="table table-striped">
                    <thead>
                        <tr>
                            <th style="width: 120px">CC</th>
                            <th style="width: 150px">Aktion</th>
                        </tr>
                    </thead>
                    <tbody class="table-rows">
                        <?php foreach ($this->request->data['Copy'] as $key => $value) : ?>
                            <tr class="data-rows">
                                <td>                                   
                                    <?php echo $this->Form->input('Copy.' . $key . '.id'); ?>
                                    <br />
                                    <?php echo $this->Form->input('Copy.' . $key . '.user_id', array('div'=>false, 'label'=>false, 'class'=>'form-control', 'empty'=>'Empfänger auswählen')); ?>
                                </td>
                                    
                                <td class="action">
                                    <?php if ($key != 0) : ?> <!--In der ersten Zeile (Array) wird der Remove Button nicht angezeigt -->
                                            <a onclick="removeRow(this)" href="#" class="btn btn-danger btn-xs btn-remove-row">Remove</a>
                                    <?php endif; ?>
                                </td>
                            </tr>
                        <?php endforeach; ?>
                    </tbody>
                    <tfoot>
                        <tr>
                            <td>
                                <a name="btnAddNewRow"></a>
                                <a id="btnAddNewRow" href="#" class="btn btn-default btn-xs">Add new row</a>
                            </td>
                        </tr>
                    </tfoot>
                </table>
            </div>


Code:
$('#btnAddNewRow').click(function () {
            event.preventDefault();

            var newRow = $('.data-rows:first').clone();

            var rowNo = $('#tableCopies >tbody >tr').length + 1;

            newRow.find('input').each(function (index, element) {
                // init default properties    
                element.name = replaceAll(element.name, '0', rowNo.toString());
                element.id = replaceAll(element.id, '0', rowNo.toString());

                if (element.type == 'hidden') {
                    element.value = '';
                }

                if (element.type == 'text') {
                    element.value = '';
                }

                if (element.type == 'number') {
                    element.value = '0.0';
                }

                if (element.type == 'Select') {
                    element.value = '';
                }


                var id = 'Copy' + rowNo.toString() + 'Quantity';

                if (element.id == id) {
                    alert (element.id);
                    element.value = '0';
                }

                console.log(element);
            });

            // add remove button
            var removeBtn = '<a onclick="removeRow(this)" href="#" class="btn btn-danger btn-xs btn-remove-row">Remove</a>';

            newRow.find('td.action').append(removeBtn);

            $('.table-rows').append(newRow);

            //$('.input-price-unit,.input-price').number(true, 2);

            rowNo += 1;
        });

    removeRow = function (el) {
            event.preventDefault();
            $(el).parents("tr").remove();
        };
 
Die Frage ist nun was ist an dem Code falsch?

Laesst sich mit diesem Code-Snippet nicht beantworten, weil wir nicht wissen, mit welchem HTML-Code dein JS arbeitet.

ansonsten kann ich nur noch sagen, dass 'Select' kein input type ist und ein <select> kein <input>

Das Problem dabei ist, dass beim erneuten abspeichern immer wieder neue Datensätze angelegt werden. Selbst für die schon vorhanden.
Dann ist da wohl die PHP-Logik falsch.

Weitere Anmerkung: echo/print haben in einer Klasse nichts zu suchen!
 
Hallo Dormilich,

danke für die Antwort.

Ich habe das echo sowie Select als input rausgenommen.

Anbei der Quelltext der Seite:

HTML:
<div id="wrapper">

      <!-- Main Header -->
  <header class="main-header">

  </header>  


            <!-- Content Wrapper. Contains page content -->
            <div class="content-wrapper" style="min-height: 314px;">
                <!-- Content Header (Page header) -->
                <section class="content-header">
                    <h1>
                        Tasks                        <small></small>
                    </h1>
                    
                </section>

                <!-- Main content -->
                <section class="content">
                                        <div class="row">
<div class="col-xs-12">
  <div class="box box-primary">
    <div class="box-header">
      <h3 class="box-title">Aktivität bearbeiten</h3>
        <div class="col-md-4>
          <div class=" tasks="" form"="">
            <script type="text/javascript" src="/pgg/js/jquery-2.2.0.js"></script>        <script type="text/javascript" src="/pgg/js/bootstrap-datepicker.js"></script>
            <form action="/pgg/tasks/edit/419" id="TaskEditForm" method="post" accept-charset="utf-8"><div style="display:none;"><input type="hidden" name="_method" value="PUT"></div>                       
            
    <fieldset>
      <input type="hidden" name="data[Task][id]" value="419" id="TaskId"><div class="input select required"><label for="TaskPropertyId">Immobilie</label><select name="data[Task][property_id]" class="input form-control" id="TaskPropertyId" required="required">
      <option value="9">Teststr. 1111</option>
      <option value="10">Teststr. 2</option>


<option value="2713" selected="selected">Kleine Präsidentenstraße 2</option>
</select></div><div class="input textarea required"><label for="TaskAktivitaet">Aktivität</label><textarea name="data[Task][aktivitaet]" class="input form-control" cols="30" rows="6" id="TaskAktivitaet" required="required"></textarea></div><div><div class="abstand" style="float:left" width:33%=""><div class="input text"><label for="TaskAuftragsdatum">Auftragsdatum</label><input name="data[Task][auftragsdatum]" class="form-control input-append date" data-date-format="yyyy-mm-dd" type="text" value="2017-02-02" id="TaskAuftragsdatum"></div></div><div style="float:left" width:33%=""><div class="input text required"><label for="TaskWiedervorlagedatum">Wiedervorlage</label><input name="data[Task][wiedervorlagedatum]" class="form-control input-append date" data-date-format="yyyy-mm-dd" type="text" id="TaskWiedervorlagedatum" required="required"></div></div><div style="float:right"><div class="input text"><label for="TaskErledigtdatum">Erledigtdatum</label><input name="data[Task][erledigtdatum]" class="form-control input-append date" data-date-format="yyyy-mm-dd" type="text" id="TaskErledigtdatum"></div></div></div><div class="input select required"><label for="TaskUserId">Zuständig</label><select name="data[Task][user_id]" class="input form-control" id="TaskUserId" required="required">
<option value="">Verantwortlichen wählen...</option>
<option value="1">AA</option>
<option value="2">BB</option>
<option value="5">CC</option>
<option value="6">DD</option>
</select></div><div class="input checkbox"><input type="hidden" name="data[Task][oeffentlich]" id="TaskOeffentlich_" value="0"><input type="checkbox" name="data[Task][oeffentlich]" class="" value="1" id="TaskOeffentlich"><label for="TaskOeffentlich">Öffentlich</label></div>Ab hier Copy                </fieldset>

<div style="float:left;" "="">
<div class="input file"><label for="TaskAnhang">Anhang:</label><input type="file" name="data[Task][anhang]" accept="/*" id="TaskAnhang"></div><input type="hidden" name="data[Task][anhang_dir]" value="" id="TaskAnhangDir"></div>

    <!--TEST FÜR CC-->
    <div class="col-md-12">
        <div class="col-xs-12 table-responsive">
                <table id="tableCopies" class="table table-striped">
                    <thead>
                        <tr>
                            <th style="width: 120px">CC</th>
                            <th style="width: 150px">Aktion</th>
                        </tr>
                    </thead>
                    <tbody class="table-rows">
                                                    <tr class="data-rows">
                                <td>                                   
                                    <input type="" name="data[Copy][0][id]" value="58933413-82b4-4c3f-a62d-0c4885c3f55b" id="Copy0Id">                                    <br>
                                    <select name="data[Copy][0][user_id]" class="form-control" id="Copy0UserId">
<option value="">Empfänger auswählen</option>
<option value="1">AA</option>
<option value="2">BB</option>
<option value="5">CC</option>
<option value="6">DD</option>
</select>                                </td>
                                    
                                <td class="action">
                                                                    </td>
                            </tr>
                                            </tbody>
                    <tfoot>
                        <tr>
                            <td>
                                <a name="btnAddNewRow"></a>
                                <a id="btnAddNewRow" href="#" class="btn btn-default btn-xs">Add new row</a>
                            </td>
                        </tr>
                    </tfoot>
                </table>
            </div>
<!--ENDE TEST-->

<div class="submit"><input type="submit" value="Speichern"></div></div></form>


</div>
</div>

<script>
        $('#TaskWiedervorlagedatum').datepicker({
         format: 'yyyy-mm-dd',
         todayBtn: 'linked',
         autoclose: 'true',
         language: 'de'
        });

         $('#TaskErledigtdatum').datepicker({
         format: 'yyyy-mm-dd',
         todayBtn: 'linked',
         autoclose: 'true',
         language: 'de'
        });


         //TESTEN FÜR CC
          $('#btnAddNewRow').click(function () {
            event.preventDefault();

            var newRow = $('.data-rows:first').clone();

            var rowNo = $('#tableCopies >tbody >tr').length + 1;

            newRow.find('input').each(function (index, element) {
                // init default properties    
                element.name = replaceAll(element.name, '0', rowNo.toString());
                element.id = replaceAll(element.id, '0', rowNo.toString());

                if (element.type == 'hidden') {
                    element.value = '';
                }

                if (element.type == 'text') {
                    element.value = '';
                }

                if (element.type == 'number') {
                    element.value = '0.0';
                }

                if (element.type == 'Select') {
                    element.value = '';
                }


                var id = 'Copy' + rowNo.toString() + 'Quantity';

                if (element.id == id) {
                    alert (element.id);
                    element.value = '0';
                }

                console.log(element);
            });

            // add remove button
            var removeBtn = '<a onclick="removeRow(this)" href="#" class="btn btn-danger btn-xs btn-remove-row">Remove</a>';

            newRow.find('td.action').append(removeBtn);

            $('.table-rows').append(newRow);

            //$('.input-price-unit,.input-price').number(true, 2);

            rowNo += 1;
        });

    removeRow = function (el) {
            event.preventDefault();
            $(el).parents("tr").remove();
        };
        //ENDE TEST

</script>
                </div></div></div></section><!-- /.content -->
            </div><!-- /.content-wrapper -->

<footer class="main-footer">

</footer>
<div id="redirect">
</div>
</div>

In der Fehlerkonsole bekomme ich folgende Meldung:

419:2898 Uncaught ReferenceError: replaceAll is not defined

Für mich ist es seltsam das es ohne Anzeige der ID funktioniert und wenn ich die ID mit reinnehme diese Fehlermeldung kommt.
 
Das ist es aber in der Beispielanwendung auch und da funktioniert es.

Code:
<?= $this->Form->input('InvoiceItem.' . $key . '.id') ?>
 
Welche Beispielanwendung? Dein Code enthält kein solches Formularfeld.

- - - Aktualisiert - - -

Wäre es nicht einfacher zu schauen, warum replaceAll() nicht definiert ist?
 
Ich meinte die Beispielanwendung aus der ich dieses Code übernommen habe. Dort steht geschrieben:

PHP:
<?php foreach ($this->request->data['InvoiceItem'] as $key => $value) : ?>
                                <tr class="data-rows">
                                    <td>
                                        <?= $this->Form->input('InvoiceItem.' . $key . '.id') ?>
                                        <?= $this->Form->input('InvoiceItem.' . $key . '.item', array('placeholder' => 'Item name')) ?>
                                        <br />
                                        <?= $this->Form->input('InvoiceItem.' . $key . '.description', array('type' => 'text', 'placeholder' => 'Item description')) ?>
                                    </td>
                                    <td>
                                        <?php
                                        echo $this->Form->input('InvoiceItem.' . $key . '.price_unit', array(
                                            'default' => '0.0',
                                            'class' => 'form-control input-price-unit',
                                            'onblur' => 'reCalculatePrice(this)',
                                            'beforeInput' => '<div class="input-group"><span class="input-group-addon">$</span>',
                                            'afterInput' => '</div>',
                                            'type' => 'text',
                                        ));
                                        ?>
                                    </td>
                                    <td><?= $this->Form->input('InvoiceItem.' . $key . '.quantity', array('default' => '0', 'class' => 'form-control input-quantity', 'onchange' => 'reCalculatePrice(this)')) ?></td>
                                    <td>
                                        <?php
                                        echo $this->Form->input('InvoiceItem.' . $key . '.price', array(
                                            'default' => '0.0',
                                            'class' => 'form-control input-price',
                                            'readonly' => 'readonly',
                                            'beforeInput' => '<div class="input-group"><span class="input-group-addon">$</span>',
                                            'afterInput' => '</div>',
                                            'type' => 'text',
                                        ));
                                        ?>
                                    </td>
                                    <td class="action">
                                        <?php if ($key != 0) : ?>
                                            <a onclick="removeRow(this)" href="#" class="btn btn-danger btn-xs btn-remove-row">Remove</a>
                                        <?php endif; ?>
                                    </td>
                                </tr>
                            <?php endforeach; ?>


Daher die Zeile:

<?= $this->Form->input('InvoiceItem.' . $key . '.id') ?>

Und wie gesagt dort funktioniert es.

- - - Aktualisiert - - -

In einer externen Datei ist sie definiert:

Code:
function escapeRegExp(string) {
    return string.replace(/([.*+?^=!:${}()|\[\]\/\\])/g, "\\$1");
}

function replaceAll(string, find, replace) {
    return string.replace(new RegExp(escapeRegExp(find), 'g'), replace);
}
 
Zurück
Oben