mirror of
https://github.com/phpbb/phpbb.git
synced 2025-06-08 04:18:52 +00:00
[ticket/14492] Send statistics via ajax request
Flooding ajax requests will try to be prevented and sending stats without JS will also properly work. PHPBB3-14492
This commit is contained in:
parent
80a63a9a94
commit
89fef2ce13
5 changed files with 136 additions and 23 deletions
|
@ -4,7 +4,7 @@
|
||||||
|
|
||||||
<h1>{L_ACP_HELP_PHPBB}</h1>
|
<h1>{L_ACP_HELP_PHPBB}</h1>
|
||||||
|
|
||||||
<form id="acp_board" method="post" action="{U_ACTION}">
|
<form id="acp_help_phpbb" method="post" action="{U_ACTION}" data-ajax-action="{U_COLLECT_STATS}">
|
||||||
<div class="send-stats-row">
|
<div class="send-stats-row">
|
||||||
<!-- EVENT acp_help_phpbb_stats_before -->
|
<!-- EVENT acp_help_phpbb_stats_before -->
|
||||||
<div class="send-stats-tile">
|
<div class="send-stats-tile">
|
||||||
|
@ -12,9 +12,9 @@
|
||||||
<p>{L_EXPLAIN_SEND_STATISTICS}</p>
|
<p>{L_EXPLAIN_SEND_STATISTICS}</p>
|
||||||
<div class="send-stats-row">
|
<div class="send-stats-row">
|
||||||
<div class="send-stats-data-row send-stats-data-only-row">
|
<div class="send-stats-data-row send-stats-data-only-row">
|
||||||
<a id="trigger-configlist" data-ajax="toggle_link" data-toggle-text="{L_HIDE_STATISTICS}"><span>{L_SHOW_STATISTICS}</span><i class="icon fa-angle-down"></i></a>
|
<a id="trigger-configlist" data-ajax="toggle_link" data-overlay="false" data-toggle-text="{L_HIDE_STATISTICS}"><span>{L_SHOW_STATISTICS}</span><i class="icon fa-angle-down"></i></a>
|
||||||
</div>
|
</div>
|
||||||
<div class="send-stats-data-row send-stats-data-hidden">
|
<div class="send-stats-data-row">
|
||||||
<div class="configlist" id="configlist">
|
<div class="configlist" id="configlist">
|
||||||
<!-- BEGIN providers -->
|
<!-- BEGIN providers -->
|
||||||
<fieldset>
|
<fieldset>
|
||||||
|
@ -41,11 +41,21 @@
|
||||||
<!-- EVENT acp_help_phpbb_stats_after -->
|
<!-- EVENT acp_help_phpbb_stats_after -->
|
||||||
<fieldset>
|
<fieldset>
|
||||||
<p class="submit-buttons">
|
<p class="submit-buttons">
|
||||||
|
<input type="hidden" name="systemdata" value="{RAW_DATA}" />
|
||||||
|
<input type="hidden" name="help_send_statistics_time" value="{COLLECT_STATS_TIME}" />
|
||||||
<input class="button1" type="submit" id="submit" name="submit" value="{L_SUBMIT}" />
|
<input class="button1" type="submit" id="submit" name="submit" value="{L_SUBMIT}" />
|
||||||
</p>
|
</p>
|
||||||
{S_FORM_TOKEN}
|
{S_FORM_TOKEN}
|
||||||
</fieldset>
|
</fieldset>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
<form action="{U_COLLECT_STATS}" method="post" target="questionaire_result" id="questionnaire-form">
|
||||||
|
<fieldset>
|
||||||
|
<p class="submit-buttons">
|
||||||
|
<input type="hidden" name="systemdata" value="{RAW_DATA}" />
|
||||||
|
<input class="button1" type="submit" id="submit_stats" name="submit" value="{L_SEND_STATISTICS}" />
|
||||||
|
</p>
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
|
||||||
<!-- INCLUDE overall_footer.html -->
|
<!-- INCLUDE overall_footer.html -->
|
||||||
|
|
|
@ -243,11 +243,16 @@ function parse_document(container)
|
||||||
|
|
||||||
parse_document($('body'));
|
parse_document($('body'));
|
||||||
|
|
||||||
$('#trigger-configlist').on('click', function () {
|
$('#questionnaire-form').css('display', 'none');
|
||||||
|
var $triggerConfiglist = $('#trigger-configlist');
|
||||||
|
|
||||||
|
$triggerConfiglist.on('click', function () {
|
||||||
var $configlist = $('#configlist');
|
var $configlist = $('#configlist');
|
||||||
$configlist.closest('.send-stats-data-row').toggleClass('send-stats-data-hidden');
|
$configlist.closest('.send-stats-data-row').toggleClass('send-stats-data-hidden');
|
||||||
$configlist.closest('.send-stats-row').find('.send-stats-data-row:first-child').toggleClass('send-stats-data-only-row');
|
$configlist.closest('.send-stats-row').find('.send-stats-data-row:first-child').toggleClass('send-stats-data-only-row');
|
||||||
$(this).find('i').toggleClass('fa-angle-down fa-angle-up');
|
$(this).find('i').toggleClass('fa-angle-down fa-angle-up');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$('#configlist').closest('.send-stats-data-row').addClass('send-stats-data-hidden');
|
||||||
});
|
});
|
||||||
})(jQuery);
|
})(jQuery);
|
||||||
|
|
|
@ -4,6 +4,101 @@
|
||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
|
|
||||||
|
phpbb.prepareSendStats = function () {
|
||||||
|
var $form = $('#acp_help_phpbb');
|
||||||
|
var $dark = $('#darkenwrapper');
|
||||||
|
var $loadingIndicator;
|
||||||
|
|
||||||
|
$form.on('submit', function () {
|
||||||
|
var $this = $(this),
|
||||||
|
currentTime = Math.floor(new Date().getTime() / 1000),
|
||||||
|
statsTime = parseInt($this.find('input[name=help_send_statistics_time]').val(), 10);
|
||||||
|
|
||||||
|
event.preventDefault();
|
||||||
|
$this.unbind('submit');
|
||||||
|
|
||||||
|
// Skip ajax request if form is submitted too early or send stats
|
||||||
|
// checkbox is not checked
|
||||||
|
if (!$this.find('input[name=help_send_statistics]').is(':checked') ||
|
||||||
|
statsTime > currentTime) {
|
||||||
|
$form.find('input[type=submit]').click();
|
||||||
|
setTimeout(function () {
|
||||||
|
$form.find('input[type=submit]').click();
|
||||||
|
}, 300);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for AJAX errors
|
||||||
|
*/
|
||||||
|
function errorHandler(jqXHR, textStatus, errorThrown) {
|
||||||
|
if (typeof console !== 'undefined' && console.log) {
|
||||||
|
console.log('AJAX error. status: ' + textStatus + ', message: ' + errorThrown);
|
||||||
|
}
|
||||||
|
phpbb.clearLoadingTimeout();
|
||||||
|
var errorText = '';
|
||||||
|
|
||||||
|
if (typeof errorThrown === 'string' && errorThrown.length > 0) {
|
||||||
|
errorText = errorThrown;
|
||||||
|
} else {
|
||||||
|
errorText = $dark.attr('data-ajax-error-text-' + textStatus);
|
||||||
|
if (typeof errorText !== 'string' || !errorText.length) {
|
||||||
|
errorText = $dark.attr('data-ajax-error-text');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
phpbb.alert($dark.attr('data-ajax-error-title'), errorText);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This is a private function used to handle the callbacks, refreshes
|
||||||
|
* and alert. It calls the callback, refreshes the page if necessary, and
|
||||||
|
* displays an alert to the user and removes it after an amount of time.
|
||||||
|
*
|
||||||
|
* It cannot be called from outside this function, and is purely here to
|
||||||
|
* avoid repetition of code.
|
||||||
|
*
|
||||||
|
* @param {object} res The object sent back by the server.
|
||||||
|
*/
|
||||||
|
function returnHandler(res) {
|
||||||
|
phpbb.clearLoadingTimeout();
|
||||||
|
|
||||||
|
// If a confirmation is not required, display an alert and call the
|
||||||
|
// callbacks.
|
||||||
|
$dark.fadeOut(phpbb.alertTime);
|
||||||
|
|
||||||
|
if ($loadingIndicator) {
|
||||||
|
$loadingIndicator.fadeOut(phpbb.alertTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
var $sendStatisticsSuccess = $('<input />', {
|
||||||
|
type: 'hidden',
|
||||||
|
name: 'send_statistics_response',
|
||||||
|
value: res
|
||||||
|
});
|
||||||
|
$sendStatisticsSuccess.appendTo('p.submit-buttons');
|
||||||
|
|
||||||
|
// Finish actual form submission
|
||||||
|
$form.find('input[type=submit]').click();
|
||||||
|
}
|
||||||
|
|
||||||
|
$loadingIndicator = phpbb.loadingIndicator();
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
url: $this.attr('data-ajax-action').replace('&', '&'),
|
||||||
|
type: 'POST',
|
||||||
|
data: 'systemdata=' + $this.find('input[name=systemdata]').val(),
|
||||||
|
success: returnHandler,
|
||||||
|
error: errorHandler,
|
||||||
|
cache: false
|
||||||
|
}).always(function() {
|
||||||
|
if ($loadingIndicator && $loadingIndicator.is(':visible')) {
|
||||||
|
$loadingIndicator.fadeOut(phpbb.alertTime);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The following callbacks are for reording items. row_down
|
* The following callbacks are for reording items. row_down
|
||||||
* is triggered when an item is moved down, and row_up is triggered when
|
* is triggered when an item is moved down, and row_up is triggered when
|
||||||
|
@ -225,6 +320,10 @@ $(function() {
|
||||||
$(this).attr('data-clicked', true);
|
$(this).attr('data-clicked', true);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ($('#acp_help_phpbb')) {
|
||||||
|
phpbb.prepareSendStats();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -84,23 +84,17 @@ class acp_help_phpbb
|
||||||
if ($submit)
|
if ($submit)
|
||||||
{
|
{
|
||||||
$config->set('help_send_statistics', $request->variable('help_send_statistics', false));
|
$config->set('help_send_statistics', $request->variable('help_send_statistics', false));
|
||||||
|
$response = $request->variable('send_statistics_response', '');
|
||||||
|
|
||||||
if ($config['help_send_statistics'])
|
if (!empty($response))
|
||||||
{
|
{
|
||||||
$client = new \GuzzleHttp\Client([
|
if ((strpos($response, 'Thank you') !== false || strpos($response, 'Flood protection') !== false))
|
||||||
'timeout' => 6,
|
|
||||||
'connect_timeout' => 6,
|
|
||||||
]);
|
|
||||||
|
|
||||||
$response = $client->post($collect_url, [
|
|
||||||
'body' => [
|
|
||||||
'systemdata' => $collector->get_data_for_form(),
|
|
||||||
]
|
|
||||||
]);
|
|
||||||
$response_status = $response->getStatusCode();
|
|
||||||
|
|
||||||
if ($response_status >= 200 && $response_status < 300)
|
|
||||||
{
|
{
|
||||||
|
// Update time when statistics were actually sent
|
||||||
|
if (strpos($response, 'Thank you') !== false)
|
||||||
|
{
|
||||||
|
$config->set('help_send_statistics_time', time());
|
||||||
|
}
|
||||||
trigger_error($user->lang('THANKS_SEND_STATISTICS') . adm_back_link($this->u_action));
|
trigger_error($user->lang('THANKS_SEND_STATISTICS') . adm_back_link($this->u_action));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -108,6 +102,8 @@ class acp_help_phpbb
|
||||||
trigger_error($user->lang('FAIL_SEND_STATISTICS') . adm_back_link($this->u_action));
|
trigger_error($user->lang('FAIL_SEND_STATISTICS') . adm_back_link($this->u_action));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trigger_error($user->lang('CONFIG_UPDATED') . adm_back_link($this->u_action));
|
||||||
}
|
}
|
||||||
|
|
||||||
$template->assign_vars(array(
|
$template->assign_vars(array(
|
||||||
|
@ -116,6 +112,8 @@ class acp_help_phpbb
|
||||||
'RAW_DATA' => $collector->get_data_for_form(),
|
'RAW_DATA' => $collector->get_data_for_form(),
|
||||||
'U_ACP_MAIN' => append_sid("{$phpbb_admin_path}index.$phpEx"),
|
'U_ACP_MAIN' => append_sid("{$phpbb_admin_path}index.$phpEx"),
|
||||||
'U_ACTION' => $this->u_action,
|
'U_ACTION' => $this->u_action,
|
||||||
|
// Pass earliest time we should try to send stats again
|
||||||
|
'COLLECT_STATS_TIME' => intval($config['help_send_statistics_time']) + 86400,
|
||||||
));
|
));
|
||||||
|
|
||||||
$raw = $collector->get_data_raw();
|
$raw = $collector->get_data_raw();
|
||||||
|
|
|
@ -31,6 +31,7 @@ class add_help_phpbb extends \phpbb\db\migration\migration
|
||||||
{
|
{
|
||||||
return array(
|
return array(
|
||||||
array('config.add', array('help_send_statistics', true)),
|
array('config.add', array('help_send_statistics', true)),
|
||||||
|
array('config.add', array('help_send_statistics_time', 0)),
|
||||||
array('module.remove', array(
|
array('module.remove', array(
|
||||||
'acp',
|
'acp',
|
||||||
false,
|
false,
|
||||||
|
|
Loading…
Add table
Reference in a new issue