Добрый день.
У пользователя есть возможность когда он смотрит на данные VIEW'шки нажать кнопочку для принудительного обновления данных.
Запускается скрипт, который получает свежие данные и заносит их в базу данных, откуда VIEWшка их и показывает.
Встает вопрос: обновить на экране пользователя эти данные.
Например:
Выводится на экран : Иванова Алена Валерьевна.
Пока пользователь рассматривает эти данные на своем компьютере, Алена вышла замуж и сменила фамилию - стала Петровой.
Пользователь, чувствует, что хочет видеть самую свежую информацию. Нажимает кнопочку скажем "Получить свежие данные". Через JQuery запускается пользователю сообщение, к примеру: "обработка запроса, ждите". Запукается в фоне скрипт на сервере, который получив свежую информацию, заносит в базу данных эту новую ее фамилию. Все наша база актуальна. Теперь нужно пользователю ее показать через VIEWшку.
Способы:
1. На стороне пользователя запускаем через JavaScript: location.reload(true);
Не работает. Браузер пользователя быстро ему показывает все из своего кэша.
Хорошо. В отдаваемой первоначально странице VIEW'шки пишем заголовки:
Expires: Sun, 19 Nov 1978 05:00:00 GMT
Cache-Control: no-cache, must-revalidate, post-check=0, pre-check=0
и снова у пользователя делаем : location.reload(true);
И снова не работает. Браузер кладет на нас с прибором и выдавливает все из своего локального кэша.
Тут только помогает Ctrl-F5.
Сидим, думаем....
2. Можно попробовать через AJAX наверное получить данные. Хорошо, получим их. Как сказать VIEWшке что их следует обновить?
Какие способы подскажете, гуру?
Спасибо.
Комментарии
drupal view ajax refresh
https://www.drupal.org/project/ajax_views_refresh
https://www.drupal.org/node/1781988
http://azbukaweb.ru/drupal-ajax--how-to-dynamically-update-view-display
О, пищу для мозгов подкинули
Благодарствую
@tlito, тут можно юзать bbcode module
ajax_views_refresh
Да, 4 ссылка с гугла которую мне подкинули. Смотрю
Спасибо за быстрые отклики.
Поставил модуль: https://www.drupal.org/project/views_flag_refresh
В настройках VIEWшки появилась опция FLAG referesh.
Ни разу с флагами не сталкивался, но догадываюсь что вкусная штука. То, что раньше делалось ручками теперь можно через этот модкль.
Где можно примеры на русском посмотреть, чтобы понять как оно работает и как оно настраивается?
В чем соль фишки?
Я делал при помощи этого модуля "простую" корзину.
Добавлял материалу-товару флаг "Купить"
В шапке выводиля вьюс - блок "Корзина", в котором выводились товары, отмеченные флагом "Купить". Который обновляется при клике по флагу "Купить"
Т.е. когда пользователь жмет на флаг "Купить" у конкретного товара, товар отмечается этим флагом и обновляется вьюс "Корзина"(в корзину добавляется отмеченный товар)..
ИМХО, для Вашей задачи это лишнее-)
Если включить в настройках вьюса ajax, пейджер будет работать почти так как Вам надо..только в пейджере нет ссылки на текущую страницу, чтобы ее подгрузить аяксом.
Т.е. надо просто добавить ссылку на текущую страницу, по аналогии с пейджером, и она должна работать как "Обновить страницу" при помощи аякса.
Возможно такую сылку можно добавить в шапку или подвал вьюса (элемент "Пользовательский текст", или как он там называется)..
Сгенерировать токенами ссылку на текущую страницу.. и наверное добавить класс, по которому js "подхватит" эту ссылку для подгрузке аяксом (см. пейджер)
Спасибо огромное, что нашли время все это расписать.
Алгоритмически как все это происходит я понимаю, так как все это давно делалось при помощи голого PHP в редакторе FAR.
Проблема у меня пока что в том, что я не совсем могу объяснить DRUPAL что я от него хочу. Не хватает знаний по настройке и увязке модулей в одну задачу. То есть, грубо говоря, "зашел туда, выбрал то, создал это, птичку поставил здесь, сохранил. вышел, зашел теперь сюда, здесь появилось то, отметил его и вставил сюда. сохранил. и т.д.". Сижу методом тыка пытаюсь осознать как все это работает. осваиваю - куда деваться. В любом случае спасибо за помощь. Многое из того что вы написали (вторая половина) мне уже понятно. и это хорошо
Пейджер - это сверху\снизу нумерация страниц для обзора с кнопками управления?
Интересно.
Попробую ее соорудить при помощи токенов как вы сказали.
не хочет пейджер показываться на странице.
Вероятно потому, что у меня выводится информация об ОДНОМ "товаре" , все его характеристики.
То есть не список с нумерацией страниц в "пейджере"
Иду смотреть шаблоны.
В пейджере засветился разве что MORE link. но он просто дергает страницу без всякого AJAX.
Я имел ввиду "соорудить" линк "Обновить" по "принципу" пейджера.
Добавил страницу вьюс по адресу test/%
Добавил контекстный фильтр Nid материала
В шапку вьюса добавил поле Глобальный.Нефильтруемый текст
В поле вставил
<li class="pager-next last"><a href="/test">Обновить</a></li>
</ul>
По нажатии на кнопку Обновить вывод вьюса обновляется аяксом.
Ключевые моменты:
1.Аякс в настройках вьюса должен быть включен.
2.У тега ul в котором находиться аякс-ссылка Обновить, должен быть класс "pager"
3.UPD. Включить в настройках вьюс пейджер.
"
Благодарю за столь подробный пример (всегда бы так .
Вечером опробую на одном из ВЬЮСе.
Правда он чистый обновляльщик.
Приведу здесь и свой пример, когда и ОБНОВЛЯЕТСЯ база данных (через вызванный внешний скрипт) и затем уже обновляется ВЬЮС из нее.
// метка class тега обновления по запросу
var $updateControl = $(".update-control");
$updateControl.click(function(){
// крутимся-вертимся ..ждем установка
var newHtml = '<i class="fa fa-refresh fa-spin"></i> wait...';
var url = document.location.href;
// крутимся вертимся показываем
$updateControl.html(newHtml);
// запуск внешнего скрипта
$.get("/update/" + url.substring(url.lastIndexOf('/')+1,url.length) );
// обновляем вьюс через 3 секунды.
setTimeout(function(){ jQuery('.view-id-XXXXXXX').trigger('RefreshView');},3000);
});
Обратил внимание что у вас ВЬЮШка на русском.
Каким образом если не секрет?
У меня автоматом не локализуется.
Модуль https://www.drupal.org/project/l10n_update
После установки запустите обновление локализации на странице модуля..
Потом, при активации других модулей, локализация для них будет загружаться автоматом ..
Да, это мой любимый модуль.
Что вы понимаете под "страницей модуля" ? В разделе модули, он включен, далее следует его краткое описание и кнопочка HELP, которая в конечном итоге откроет файлик README.TXT этого модуля.
Я конечно в Конфигурация - Регион и язык - Перевод интерфейса запустил UPDATE
(http://www.site.ru/#overlay=en/admin/config/regional/translate/update)
Нашли доступными :
Checked available interface translation updates for 201 projects.
Как их применить ?
В частности VIEW как был English так на нем и остается....
Спасибо.
admin/config/regional/translate/update
Над таблицей ссылочка - Проверить вручную
После проверки, под таблицей должна появиться кнопка "Обновить переводы"
Все стало понятно.
Вот у меня готовы обновиться 201 переводов.
Что делать когда кнопочки "Обновить переводы" не появляется?
Хе... если в установка установлено АВТОМАТИЧЕСКОЕ обновлние, то кнопочка эта не появляется.
Так, экспериментируем... переводим в РУЧНОЙ режим и запускаем на сканирование....
...
оп-па...
Checked available interface translation updates for 249 projects.
Ух-ты и кнопочка появилась.
Запущаем ее...
В результате имеем:
74 translation files imported. 261 translations were added, 8937 translations were updated and 0 translations were removed.
Неплохой улов, однако.
Какие выводы можно сделать?
Не все так гладко в автоматическом режиме. Возможно на это также повлияло мой дефолтный язык английский и английская админка.
Тем не менее, после перевода на дефолт по русски, автоматом ничего не обновилось.
Интерфейс VIEW так и остался на Английском...
Странно...
Нашел способ приколистов:
+++
Create an exposed filter. View the html with firebug or a similar extension, then copy the html for the form that submits the exposed filter. Remove all the selection options so you're left with just the submit button, and rename it to something like "Refresh view". Take this html and put it into a header (make sure to set the mode to full html). Voila, Refresh on Demand Form.
+++
Не пробовал, но мысль понятна Надо попробовать
Сижу пробую через Exposed Filters способом описанным выше. В принципе работает.
Правлю шаблоны.
Display output (здесь как раз генерируются фильтры) -> Style output (далее уже генерируется контент)
<?php if ($exposed): ?>
<div class="view-filters">
<?php print $exposed; ?>
</div>
<?php endif; ?>
Не могу заставить сгенерировать фильтры в "Style output".
На эту кнопку уходит целая строка экрана, а мне она необходима ниже, в самом контенте.
Вопрос. Это наверное извращение, но решил спросить.
Если я эту SUBMIT форму сделаю невидимой, а submitить ее буду из своего скрипта, который запущу когда
мне нужно и при нужных обстоятельствах. Это как будет выглядеть ?
P.S. непонятное ограничение здесь выскочило. Слово "нужна" запрещено ?
Все вопрос закрыт.
Не нужны никакие модули для Рефреша AJAX.
Не нужны пляски с Exposed Filters
Не нужны пляски с Pager'ом
Все, что нужно, это добавить одну строчку в JavaScript код после того, как вы выполните что хотели, вместо глупого в текущей ситуации:
location.reload(true);
нужно поставить
jQuery('.view-id-XXXXX').trigger('RefreshView');
Все ! Рефрешит молниеносно !
Спасибо Julian Pustkuchen: http://julian.pustkuchen.com/en/drupal-7-api-trigger-views-ajax-refresh-...
Кстати, рефрешить можно не только из JavaScript, можно и из PHP. Идем по ссылке выше.
Да, у меня не успевает порой мой скрипт (который запускается перед рефрешем) внести в БД обновления, поэтому триггер рефреша дергаем с некоторой задержкой. У меня это получилось в районе 3секунд:
setTimeout(function(){ jQuery('.view-id-XXXXX').trigger('RefreshView');},3000);