У материала есть поле "количество репостов" по клику на кнопку "поделиться", меняется его значение field_reposts_value в таблицах, field_data_field_reposts и field_revision_field_reposts, но после обновления страницы или при редактировании материала, по-прежнему стоит старая цифра, пока не сброшу кэш,
обновляю вот так
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 , который помогает перезапистаь значние поля. Сейчас работает так.
Клиентская сторона:
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');?>
обновляет, но мне кажется очистка кэша при каждом клике не самый универсальный вариант
Комментарии
Drupal-way:
<?php
$commands = array();
/**
* 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[] = 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'),
),
));
?>
В вашем примере каждый раз идёт пересохранение ноды? -Правильно?
В таком случае более проивоводильным вариантом наверное будет запись напрямую в базу, с последующим сбросом кэша полей у данной ноды (пример в вопросе)
Или оба варианта одинаково рабочие?
Один вариант - костыль, не гарантирующий полностью правильную работу. Другой - более стандартная реализация. Если костыльный вариант и будет хоть сколько производительнее, то это из разряда экономии на спичках.
Пример Ajax ссылки, это код который должен быть расположен в теле страницы? При этом создастся ссылка с классом use-ajax, при клике на которую данные уйдут на сервер, все верно?
Да, все верно.
По клику данные этого поля обновится, но пока не обновлю страницу, изменений не увижу кажется?
Как дополнить код, чтобы данные на странице обновились без её обновления?
Хочу все таки чтобы правильно было. Пока использую костыль, в нем переменная result записывается вместо текущей цифры.
Или ваш вариант полностью рабочий?
В этом месте:
<?php
$commands[] = ajax_command_replace('.needle_selector', $count);
?>
Нужно заменить .needle_selector на нужный Jquery-селектор, в который методом replaceWith будет подставлено новое значение.
Про команды можно почитать тут и здесь.