eesyphp/includes/url-public.php
Benjamin Renard 6fdc5447f1 Some improvments from recent works on apps based on its "framework"
* Code cleaning and fix some small errors using Phpstan
* Configure pre-commit to run Phpstan before each commit
* Some little improvments and logging, mail, smarty & URL libs
* Add Sentry integration
* Add Webstat JS code inclusion
* Install Smarty dependency using composer

Breaking changes:
* Rename Event class as HookEvent to avoid conflict with PECL event
* URL with refresh GET parameter now automatically trigger redirection without it
 after page loading to avoid to keep it in URL
2023-01-29 11:51:41 +01:00

263 lines
7.8 KiB
PHP

<?php
if (php_sapi_name() == "cli")
return true;
function handle_homepage($request) {
display_template("homepage.tpl", _("Hello world !"));
}
add_url_handler('#^$#', 'handle_homepage');
function handle_search($request) {
global $smarty, $status_list;
// Manage params
if(
(isset($_REQUEST['clear']) && $_REQUEST['clear']=='true') ||
!isset($_SESSION['search']) ||
!is_array($_SESSION['search'])
) {
$_SESSION['search']=array(
'pattern' => false,
'status' => 'all',
'order' => 'name',
'order_direction' => 'ASC',
);
if (isset($_REQUEST['clear']) && $_REQUEST['clear']=='true')
redirect($request -> current_url);
}
logging('DEBUG', 'Request params : '.vardump($_REQUEST));
$status_list['all'] = _('Any');
if (isset($_REQUEST['status'])) {
if (check_status($_REQUEST['status']) || $_REQUEST['status'] == 'all')
$_SESSION['search']['status'] = $_REQUEST['status'];
else
$smarty -> assign('status_error', true);
}
if (isset($_REQUEST['pattern'])) {
if (trim($_REQUEST['pattern']) == '')
$_SESSION['search']['pattern'] = false;
else if (check_search_pattern($_REQUEST['pattern']))
$_SESSION['search']['pattern'] = $_REQUEST['pattern'];
else
$smarty -> assign('pattern_error', true);
}
// Order
if(isset($_REQUEST['order'])) {
if( $_SESSION['search']['order']==$_REQUEST['order']) {
if ($_SESSION['search']['order_direction']=='ASC')
$_SESSION['search']['order_direction']='DESC';
else
$_SESSION['search']['order_direction']='ASC';
}
else
$_SESSION['search']['order_direction']='ASC';
$_SESSION['search']['order']=$_REQUEST['order'];
}
else {
if($_SESSION['search']['order']=='') {
$_SESSION['search']['order']='date';
$_SESSION['search']['order_direction']='DESC';
}
}
// Page
if (isset($_REQUEST['page'])) {
$_SESSION['search']['page']=intval($_REQUEST['page']);
}
else {
$_SESSION['search']['page']=1;
}
// Nb par page
$nbs_by_page=array(10,25,50,100,500);
if (isset($_REQUEST['nb_by_page']) && in_array(intval($_REQUEST['nb_by_page']),$nbs_by_page)) {
$_SESSION['search']['nb_by_page']=intval($_REQUEST['nb_by_page']);
$_SESSION['search']['page']=1;
}
elseif (!isset($_SESSION['search']['nb_by_page'])) {
$_SESSION['search']['nb_by_page']=$nbs_by_page[0];
}
logging('DEBUG', 'Search params : '.vardump($_SESSION['search']));
$result = search_items($_SESSION['search']);
if (!is_array($result))
fatal_error(
_("An error occurred while listing the items. ".
"If the problem persists, please contact support.")
);
$smarty -> assign('result', $result);
$smarty -> assign('search', $_SESSION['search']);
$smarty -> assign('nbs_by_page', $nbs_by_page);
$smarty -> assign('status_list', $status_list);
add_js_file(array(
'lib/bootstrap4dialog/dist/js/bootstrap4dialog.min.js',
'js/myconfirm.js',
'js/search.js'
));
display_template("search.tpl", _("Search"));
}
add_url_handler('|^item/?$|', 'handle_search');
/*
* One item pages
*/
function handle_show($request) {
global $smarty;
$item = get_item_from_url($request -> id);
if (!$item)
error_404();
$smarty->assign('item', $item);
// Dialog
add_js_file(array(
'lib/bootstrap4dialog/dist/js/bootstrap4dialog.min.js',
'js/myconfirm.js',
));
display_template(
"show.tpl", _("Element %s"),
(is_array($item)?$item['name']:"#".$request -> id)
);
}
add_url_handler('|^item/(?P<id>[0-9]+)$|', 'handle_show');
function handle_create($request) {
global $smarty, $status_list;
$info = array();
$field_errors = handle_item_post_data($info);
if (isset($_POST['submit']) && empty($field_errors)) {
$item = add_item($info);
if (is_array($item)) {
add_message(_("The element '% s' has been created."), $item['name']);
redirect('item/'.$item['id']);
}
else {
add_error(_("An error occurred while saving this item."));
}
}
logging('DEBUG', 'Validated data : '.vardump($info));
logging('DEBUG', 'Fields errors : '.vardump($field_errors));
if (isset($_POST['submit']) && !empty($field_errors))
add_error(
_("There are errors preventing this item from being saved. ".
"Please correct them before attempting to add this item."));
$smarty->assign('submited', isset($_POST['submit']));
$smarty->assign('info', $info);
$smarty->assign('field_errors', $field_errors);
$smarty->assign('status_list', $status_list);
display_template("form.tpl", _("New"));
}
add_url_handler('|^item/new$|', 'handle_create');
function handle_modify($request) {
global $smarty, $status_list;
$item = get_item_from_url($request -> id);
if(is_array($item)) {
if (!can_modify($item)) {
add_error(_('You cannot edit this item.'));
redirect('item/'.$item['id']);
}
$info = array();
$field_errors = handle_item_post_data($info);
if (isset($_POST['submit']) && empty($field_errors)) {
$changes = array();
foreach ($info as $key => $value) {
if ($value != $item[$key])
$changes[$key] = $value;
}
logging('DEBUG', 'Changes : '.vardump($changes));
if (empty($changes)) {
add_message(_("You have not made any changes to element '% s'."), $item['name']);
redirect('item/'.$item['id']);
}
else if (update_item($item['id'], $changes) === true) {
add_message(_("The element '% s' has been updated successfully."), $item['name']);
redirect('item/'.$item['id']);
}
else {
add_error(_("An error occurred while updating this item."));
}
}
logging('DEBUG', 'Validated data : '.vardump($info));
logging('DEBUG', 'Fields errors : '.vardump($field_errors));
$smarty->assign('submited', isset($_POST['submit']));
if (isset($_POST['submit']) && !empty($field_errors))
add_error(
_("There are errors preventing this item from being saved. ".
"Please correct them before attempting to save your changes."));
$smarty->assign('info', (!empty($info)?$info:$item));
$smarty->assign('item_id', $item['id']);
$smarty->assign('field_errors', $field_errors);
$smarty -> assign('status_list', $status_list);
}
else {
error_404();
}
display_template(
"form.tpl", _("Element %s: Modification"),
(is_array($item)?$item['name']:"#".$request -> id)
);
}
add_url_handler('|^item/(?P<id>[0-9]+)/modify$|', 'handle_modify');
function handle_archive($request) {
global $smarty;
$item = get_item_from_url($request -> id);
if(!is_array($item)) {
add_error(_("Item #% s not found."), $request -> id);
redirect('item');
}
elseif ($item['status'] == 'archived') {
add_message(_("This item is already archived."));
}
else if (!can_archive($item)) {
add_error(_('You cannot archive this item.'));
}
else if (archive_item($item['id']) === true) {
add_message(_("The element '% s' has been archived successfully."), $item['name']);
}
else {
add_error(_('An error occurred while archiving this item.'));
}
redirect('item/'.$item['id']);
}
add_url_handler('|^item/(?P<id>[0-9]+)/archive$|', 'handle_archive');
function handle_delete($request) {
global $smarty;
$item = get_item_from_url($request -> id);
if(!is_array($item)) {
add_error(_("Item #% s not found."), $request -> id);
}
else if (!can_delete($item)) {
add_error(_('You cannot delete this item.'));
}
else if (delete_item($item['id']) === true) {
add_message(_("The element '% s' has been deleted successfully."), $item['name']);
}
else {
add_error(_('An error occurred while deleting this item.'));
redirect('item/'.$item['id']);
}
redirect('item');
}
add_url_handler('|^item/(?P<id>[0-9]+)/delete$|', 'handle_delete');
# vim: tabstop=2 shiftwidth=2 softtabstop=2 expandtab