Как обновить знание в поле материала напрямую через sql? (Почти получилось код внутри я в тупике)

Главные вкладки

Аватар пользователя engenes engenes 29 апреля 2017 в 15:06

У материала есть поле "количество репостов" по клику на кнопку "поделиться", меняется его значение field_reposts_value в таблицах, field_data_field_reposts и field_revision_field_reposts, но после обновления страницы или при редактировании материала, по-прежнему стоит старая цифра, пока не сброшу кэш,
обновляю вот так

db_query("UPDATE {field_data_field_reposts} SET field_reposts_value = :field_reposts_value WHERE entity_id = :entity_id", array(':field_reposts_value' => $repsumm, ':entity_id' => $nid));
db_query("UPDATE {field_revision_field_reposts} SET field_reposts_value = :field_reposts_value WHERE entity_id = :entity_id", array(':field_reposts_value' => $repsumm, ':entity_id' => $nid));

$repsumm - количество репостов+1
захожу проверяю в обоих таблицах значение изменилось
Подскажите может быть кто-то обновлял значения полей напрямую через mysql?
в какой таблице еще нужно обновить его значение, Пробую искать field_reposts_value пишет найдены соответствия в таблицах кэшей, но при открытии я так и не понял в каком месте это соответствие если в таблице ни поля ни значения field_reposts_value нет

Или может быть есть hook , который помогает перезапистаь значние поля. Сейчас работает так.
Клиентская сторона:

$('.social li').once().click(function() {
        var socid = $(this).data('id');//получаем название кнопки (пока в скриптах не участвует)
        if(socid) {
                nid=$('.field-name-nid .field-item').text();//получаем nid из поля
                var ids = 'ids='+socid+'&nid='+nid;
                $.ajax({
                        url: '/reposts',
                        type: 'POST',
                        data: ids,
                        cache: false,
                        success: function(result) {
                          console.log(result);
                        }
                  })

        }
});

Серверная:

<?php
function caunt_reposts_menu() {
    
$items=array();
    
$items['reposts'] = array(
        
'page callback' => 'share',
        
'access callback' => TRUE,
        
'type' => MENU_CALLBACK,
    );
    return 
$items;
}

function 

share () {
    if(
$_POST['ids']){
        
$ids $_POST['ids'];
        
$nid $_POST['nid'];
        
$repsumm db_query("SELECT field_reposts_value FROM {field_data_field_reposts} WHERE entity_id = :entity_id", array(':entity_id' => $nid))->fetchField();
        
$repsumm++;
        
db_query("UPDATE {field_data_field_reposts} SET field_reposts_value = :field_reposts_value WHERE entity_id = :entity_id", array(':field_reposts_value' => $repsumm':entity_id' => $nid));
        
db_query("UPDATE {field_revision_field_reposts} SET field_reposts_value = :field_reposts_value WHERE entity_id = :entity_id", array(':field_reposts_value' => $repsumm':entity_id' => $nid));
cache_clear_all("field:node:".$nid'cache_field');
        echo (
$repsumm);
    }
}
?>

дописал вот это:
<?phpcache_clear_all("field:node:".$nid, 'cache_field');?> обновляет, но мне кажется очистка кэша при каждом клике не самый универсальный вариант

Лучший ответ

Аватар пользователя bumble bumble 29 апреля 2017 в 18:34

Drupal-way:

<?php
/**
 * Implements hook_menu.
 */
function MYMODULE_menu() {
  
$items['reposts/%node'] = array(
    
'page callback'     => 'mymodule_reposts_callback',
    
'page arguments'    => array(1),
    
'access callback'   => TRUE,
    
'delivery callback' => 'ajax_deliver',
    
'type'              => MENU_CALLBACK,
  );

  return 

$items;
}

/**
 * Page callback.
 */
function mymodule_reposts_callback($node) {
  
$node_wrapper entity_metadata_wrapper('node'$node);
  
$count $node_wrapper->field_data_field_reposts->value() + 1;
  
$node_wrapper->field_data_field_reposts->set($count);
  
$node_wrapper->save();

  

$commands   = array();
  
$commands[] = ajax_command_replace('.needle_selector'$count);

  return array(
    

'#type'     => 'ajax',
    
'#commands' => $commands,
  );
}
?>

Пример AJAX-ссылки:

<?php
$link 
l(t('Repost'), "reposts/$nid", array(
    
'attributes' => array(
      
'class' => array('use-ajax'),
    ),
  ));
?>

Комментарии

Аватар пользователя bumble bumble 29 апреля 2017 в 18:34

Drupal-way:

<?php
/**
 * Implements hook_menu.
 */
function MYMODULE_menu() {
  
$items['reposts/%node'] = array(
    
'page callback'     => 'mymodule_reposts_callback',
    
'page arguments'    => array(1),
    
'access callback'   => TRUE,
    
'delivery callback' => 'ajax_deliver',
    
'type'              => MENU_CALLBACK,
  );

  return 

$items;
}

/**
 * Page callback.
 */
function mymodule_reposts_callback($node) {
  
$node_wrapper entity_metadata_wrapper('node'$node);
  
$count $node_wrapper->field_data_field_reposts->value() + 1;
  
$node_wrapper->field_data_field_reposts->set($count);
  
$node_wrapper->save();

  

$commands   = array();
  
$commands[] = ajax_command_replace('.needle_selector'$count);

  return array(
    

'#type'     => 'ajax',
    
'#commands' => $commands,
  );
}
?>

Пример AJAX-ссылки:

<?php
$link 
l(t('Repost'), "reposts/$nid", array(
    
'attributes' => array(
      
'class' => array('use-ajax'),
    ),
  ));
?>
Аватар пользователя engenes engenes 29 апреля 2017 в 20:03

В вашем примере каждый раз идёт пересохранение ноды? -Правильно?
В таком случае более проивоводильным вариантом наверное будет запись напрямую в базу, с последующим сбросом кэша полей у данной ноды (пример в вопросе)

Аватар пользователя bumble bumble 29 апреля 2017 в 20:11

Один вариант - костыль, не гарантирующий полностью правильную работу. Другой - более стандартная реализация. Если костыльный вариант и будет хоть сколько производительнее, то это из разряда экономии на спичках.

Аватар пользователя engenes engenes 29 апреля 2017 в 20:17

Пример Ajax ссылки, это код который должен быть расположен в теле страницы? При этом создастся ссылка с классом use-ajax, при клике на которую данные уйдут на сервер, все верно?

Аватар пользователя engenes engenes 29 апреля 2017 в 21:01

По клику данные этого поля обновится, но пока не обновлю страницу, изменений не увижу кажется?
Как дополнить код, чтобы данные на странице обновились без её обновления?
Хочу все таки чтобы правильно было. Пока использую костыль, в нем переменная result записывается вместо текущей цифры.
Или ваш вариант полностью рабочий?

Аватар пользователя bumble bumble 29 апреля 2017 в 21:19
1

В этом месте:

<?php
$commands
[] = ajax_command_replace('.needle_selector'$count);
?>

Нужно заменить .needle_selector на нужный Jquery-селектор, в который методом replaceWith будет подставлено новое значение.

Про команды можно почитать тут и здесь.