Я создал «меню администратора» для переводов моей веб-страницы, включая картинку, чтобы вы были на картинке. Codeigniter 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
}
}
});
}
});
Пожалуйста, разместите свой javascript. –
Если это два последовательных вызова ajax, чем проблема в вашем javascript, а не ваш контроллер –
, вам нужно назначить вид 'transaction_id' в форму, если вы уже обрабатываете эту транзакцию, игнорируя ее. Чтобы выработать transaction_id, вы можете либо хэш-значения формы, чтобы получить уникальный для каждого изменения, либо фиксированный на странице. – mic