Как увеличить сгенерированное значение на динамически отображаемой веб-странице

#javascript #php #mootools

#javascript #php #mootools

Вопрос:

У меня есть страница, которая позволяет пользователю добавлять дочерние задания к родительскому заданию, нажимая кнопку для отображения новой строки в таблице (для заполнения сведений о дочернем задании). Одно из полей в этой строке является ссылочным номером, который генерируется PHP-скриптом. Проблема в том, что номер ссылки одинаков в каждой строке.

Я попытался прочитать значение поля с помощью JavaScript, а затем удалить число и увеличить его, а затем собрать все это вместе, но это показалось излишним. Должен быть более простой способ сделать это. Я также не мог понять, как заставить его записать новое значение в строку, которая должна быть сгенерирована.

Мой босс не хочет, чтобы я писал новые функции, если я могу помочь этому, а скорее использовать существующие функции. Я думаю обновить getNewJobRef(), чтобы передать ему текущее значение, чтобы он автоматически получал следующее значение, но я не уверен, как передать текущее значение, как это изложено ниже в коде. Я также не уверен, сколько других мест в коде вызывают эту функцию, поэтому я не хочу их портить.

 <button id="add-new-row" style="text-align:center;margin-top:5px;width:85px;" class="boxbutton">Add New</button>
  

И:

 $(document.body).addEvent('click:relay(#add-new-row)', function (e, el) {
                try{
                    e.preventDefault();
                    addChildJobRow();
                }catch(e){
                    ...
                }
            });
  

И:

 function addChildJobRow() {
                try {
                    lastrow  ;
                    let cl = (lastrow % 2 ? 'odd' : 'even');
                    showHeaderRow();
                    Elements.from(connectedjobtemplate({
                        rownum: lastrow,
                        cl: cl,
                        nysid: '',
                        dinNum: '',
                        warrantNum: ''
                    })).inject($('linkedJobsBody'));
                } catch (e) {
                    ...
                }
            }
  

И:

 <script id="connectedjobtemplate" type="text/template">
            <tr id="childjobrow<%= rownum %>" class="<%= cl %>" data-row-id="<%= rownum %>">
                <td colspan="7">
                    <table width="100%">
                        <tr>
                            <td style="width: 15%;">
                                <input data-row-id="<%= rownum %>" id="reference[<%= rownum %>]" name="childjobid[<%= rownum %>][reference]" value="<?php echo $this->MJob->getNewJobRef(232); ?>" class="ref" size="14" style="background-color: transparent; border: none;" />
                            </td>
                        </tr>
                    </table>
                </td>
            </tr>
        </script>
  

PHP-скрипт является:

 function getNewJobRef($jobtypeid) {
    if (empty($jobtypeid)) {
        return '';
    }
    $select = $this->db->query('select * from jobtypecounters where jobtypeid =?', array($jobtypeid));
    $this->db->query('update jobtypecounters set counter = last_insert_id(counter)   1 where jobtypeid = ?', array($jobtypeid));
    // read from write server to avoid replica lag
    $Q = $this->db->query('select concat(prefix, lpad(last_insert_id(), 5, "0")) as newjobref from jobtypecounters where jobtypeid = ?', array($jobtypeid));
    if ($Q->num_rows() == 1)
        return $Q->row()->newjobref;
    else
        return '';
}
  

Любая помощь или руководство были бы очень признательны.

РЕДАКТИРОВАТЬ: страница использует MooTools, поэтому мне сказали, что я не могу использовать jQuery на той же странице, потому что они конфликтуют. Итак, как мне передать переменную обратно в PHP-скрипт без обновления страницы / Ajax, чтобы получить текущий ссылочный номер, который будет передан обратно в скрипт.

Я обновил свой код следующим образом:

 function addChildJobRow() {
                try {
                    lastrow  ;
                    let cl = (lastrow % 2 ? 'odd' : 'even');
                    showHeaderRow();
                    var refNum = '<?php echo $this->MJob->getNewJobRef(232); ?>';
                    Elements.from(connectedjobtemplate({
                        rownum: lastrow,
                        cl: cl,
                        ref: refNum,
                        nysid: '',
                        dinNum: '',
                        warrantNum: ''
                    })).inject($('linkedJobsBody'));
                } catch (e) {
                    console.log(e);
                    logevent({jobid: jid, event: 'add-new-row', uri: window.location.href, eventdata: e});
                }
            }
  

И:

 <input data-row-id="<%= rownum %>" id="reference[<%= rownum %>]" name="childjobid[<%= rownum %>][reference]" value="<%= ref %>" class="ref" size="14" style="background-color: transparent; border: none;" />

function getNewJobRef($jobtypeid, $refNum = 0) {
//check $refNum
    if (empty($jobtypeid)) {
        return '';
    }
    $select = $this->db->query('select * from jobtypecounters where jobtypeid =?', array($jobtypeid));
    $this->db->query('update jobtypecounters set counter = last_insert_id(counter)   1 where jobtypeid = ?', array($jobtypeid));
    $Q = $this->db->query('select concat(prefix, lpad(last_insert_id(), 5, "0")) as newjobref from jobtypecounters where jobtypeid = ?', array($jobtypeid));
    if ($Q->num_rows() == 1)
        return $Q->row()->newjobref;
    else
        return '';
}
  

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

Комментарии:

1. Если у содержащего table или tbody нет узлов после последней строки, вы можете получить строку (и, следовательно, ее ссылочный номер), как var tr = myTableBody.lastChild ( developer.mozilla.org/en-US/docs/Web/API/Node/lastChild ) Чтобы избежать прерывания других вызовов функции, вы должны иметь возможность добавлять необязательный параметр типа function getNewJobRef($jobtypeid, $refNum = 0) , затем передавать ненулевой ссылочный номер при добавлении новой строки (и игнорировать аргумент, если он равен 0.) Я не уверен, какую проблему вы имеете в виду, когда говорите, что «не смогли понять, как заставить его записать новое значение …»

2. @Cat, спасибо за ваш ответ. Я попытался установить значение (document.getElementById …) на новое значение, но оно не записывалось на веб-страницу. Я еще немного посмотрю на ваш ответ завтра и посмотрю, что я смогу выяснить.

Ответ №1:

РЕДАКТИРОВАТЬ: теоретически это работает, но для работы с базой данных функция должна быть вызвана, поэтому она возвращается к чертежной доске.

Я добавил проверку, чтобы увидеть, было ли уже определено значение ссылки. Если нет, он вызвал PHP-скрипт и установил значение; если да, он выделил текстовую часть, преобразовал в целое число и увеличил число, а затем собрал все это вместе.

Это мой код:

 if (typeof refNum === 'undefined') {
   refNum = '<?php echo $this->MJob->getNewJobRef(232); ?>';
} else {
   var num = refNum.replace('ABC', '').toInt();
   num  = 1;
   refNum = 'ABC'   num;
}