2013-06-24 2 views
0

Я создал «меню администратора» для переводов моей веб-страницы, включая картинку, чтобы вы были на картинке. pictureCodeigniter Active Record слишком быстро?

Это довольно просто, я сохраняю все в базе данных, и когда я делаю изменения, я регенерирую нужные файлы, например. /languages/english/tank_auth_lang.php. Всякий раз, когда я хочу перевести/редактировать что-то, я просто нажимаю на редактирование поля и выхожу из поля. AJAX отправляет POST моему контроллеру, который заботится о вставке/обновлении/добавлении перевода.

проблема

Это моя функция, которая работает, но всякий раз, когда я быстро повторную отправку (повторное редактирование/добавление новых переводов к столу), иногда я получаю дублировать в базе данных. Есть ли что-нибудь, чего я должен избегать? (например, подождать до отправки или что-то еще).

Если я делаю профилирование, это показывает мне, что есть две одинаковые вставки (не в одном вызове AJAX, но в двух последовательных fast AJAX звонки). сама

Функция осложняется в первую, потому что всякий раз, когда есть больше (strlen()) значение, чем 524 я сохранить его по-другому (я сохранить его в таблице со структурой TEXT не VARCHAR(524)).

функция

public function insert() { 
    //this function is used only with AJAX 
    if ($this->input->is_ajax_request()) { 
     //$this->output->enable_profiler(FALSE); //to work profiler must be turned off 

     $id_kw = $this->input->post('id_kw'); 
     $id_language = $this->input->post('id_language'); 
     $translation_text = $this->input->post('new_translation'); 


     if (strlen($translation_text) < '524') { 
      //short 
      if ($this->general_model->isInDBWhere('layout_short', array('id_keyword' => $id_kw, 'id_language' => $id_language))){ 
       //update short 
       //get id of text_short and update text field in it 
       $text_id = $this->general_model->_getColumnWhere('layout_short', 'id_text', array('id_keyword' => $id_kw, 'id_language' => $id_language)); 
       $this->general_model->updateRow('text_short', $text_id, array('text' => $translation_text)); 
       unset($text_id); 
      }elseif ($this->general_model->isInDBWhere('layout_long', array('id_keyword' => $id_kw, 'id_language' => $id_language))) { 

       $text_id = $this->general_model->_getColumnWhere('layout_long', 'id_text', array('id_keyword' => $id_kw, 'id_language' => $id_language)); //old text_id 
       $this->general_model->_deleteWhere('text_long', array('id' => $text_id)); 
       $this->general_model->_deleteWhere('layout_long', array('id_keyword' => $id_kw, 'id_language' => $id_language)); 
       //insert new entry to short 

       $this->_insert($table = 'short', $id_kw, $id_language, $translation_text); 
      }else{ 
       //insert in short 
       $this->_insert($table = 'short', $id_kw, $id_language, $translation_text); 
      } 
     }else{ 
      //long 
      if ($this->general_model->isInDBWhere('layout_long', array('id_keyword' => $id_kw, 'id_language' => $id_language))){ 
       //update long 
       //get id of text_long and update text field in it 
       $text_id = $this->general_model->_getColumnWhere('layout_long', 'id_text', array('id_keyword' => $id_kw, 'id_language' => $id_language)); 
       $this->general_model->updateRow('text_long', $text_id, array('text' => $translation_text)); 
       unset($text_id); 
      }elseif ($this->general_model->isInDBWhere('layout_short', array('id_keyword' => $id_kw, 'id_language' => $id_language))) { 

       $text_id = $this->general_model->_getColumnWhere('layout_short', 'id_text', array('id_keyword' => $id_kw, 'id_language' => $id_language)); //old text_id 
       $this->general_model->_deleteWhere('text_short', array('id' => $text_id)); 
       $this->general_model->_deleteWhere('layout_short', array('id_keyword' => $id_kw, 'id_language' => $id_language)); 
       //insert new entry to long 

       $this->_insert($table = 'long', $id_kw, $id_language, $translation_text); 
      }else{ 
       //insert in short 
       $this->_insert($table = 'long', $id_kw, $id_language, $translation_text); 
      } 
     } 
     echo "1"; 
    } 
} 

JavaScript

$(".ajax-translate-field").on("focusout", function(){ 
    console.log($(this).prop('name')); 
    console.log($(this).attr('data-language')); 
    console.log($(this).val()); 
    var this_object = $(this); 
    if ($(this).val() === "") { 
     this_object.animate({ backgroundColor: '#FF9494', opacity: '0.6'}, "slow"); 
     this_object.animate({ backgroundColor: '#ffffff', opacity: '1'}, "fast"); 
    }else{ 

     $.ajax({ 
      url: _baseUrl + 'admin/language/insert', 
      type: 'POST', 
      data: {id_kw: $(this).prop('name'), id_language : $(this).attr('data-language'), new_translation: $(this).val()}, 
      success: function (result) { 
       if (result == 1) { 
        this_object.animate({ backgroundColor: '#BCED91', opacity: '0.6'}, "slow"); 
        this_object.animate({ backgroundColor: '#ffffff', opacity: '1'}, "fast"); 
       }else{ 
        //nothing happens here yet 
       } 
      } 
     }); 
    } 

}); 
+1

Пожалуйста, разместите свой javascript. –

+1

Если это два последовательных вызова ajax, чем проблема в вашем javascript, а не ваш контроллер –

+0

, вам нужно назначить вид 'transaction_id' в форму, если вы уже обрабатываете эту транзакцию, игнорируя ее. Чтобы выработать transaction_id, вы можете либо хэш-значения формы, чтобы получить уникальный для каждого изменения, либо фиксированный на странице. – mic

ответ

1

Измените свой ява-скрипт для

var flag = 0; 


$(".ajax-translate-field").on("focusout", function(){ 
    console.log($(this).prop('name')); 
    console.log($(this).attr('data-language')); 
    console.log($(this).val()); 
    var this_object = $(this); 
    if ($(this).val() === "") { 
     this_object.animate({ backgroundColor: '#FF9494', opacity: '0.6'}, "slow"); 
     this_object.animate({ backgroundColor: '#ffffff', opacity: '1'}, "fast"); 
    }else if(flag != $(this).prop('name')){ 
     flag = $(this).prop('name'); 
     $.ajax({ 
      url: _baseUrl + 'admin/language/insert', 
      type: 'POST', 
      data: {id_kw: $(this).prop('name'), id_language : $(this).attr('data-language'), new_translation: $(this).val()}, 
      success: function (result) { 
       if (result == 1) { 
        this_object.animate({ backgroundColor: '#BCED91', opacity: '0.6'}, "slow"); 
        this_object.animate({ backgroundColor: '#ffffff', opacity: '1'}, "fast"); 
       }else{ 
        //nothing happens here yet 
       } 
      }, 
      complete: function (result) { flag = 0;} 
     }); 
    } 

}); 

Я предполагаю, что $(this).prop('name') является уникальным ключом (идентификатор) в коде. ,

+0

yes '$ this.prop ('name')' is unique id, я собираюсь попробовать это. – Kyslik

+0

нет, дубликаты после использования вашего JavaScript. – Kyslik

+0

@Kyslik: в методе 'Complete' установите флаг' flag = 0; ' – mrsrinivas

Смежные вопросы