$msg] ); } /** * Checks if target method is available to be called using AJAX. * * @param string $method Target method. * * @return boolean True allowed, false not. */ public function ajaxMethod($method) { global $config; // Check access. check_login(); return in_array($method, $this->AJAXMethods); } /** * Constructor. * * @param boolean $must_run Must run or not. * @param string $ajax_controller Controller. * * @return object * @throws Exception On error. */ public function __construct( $ajax_controller='include/ajax/tips_window.ajax' ) { $this->ajaxController = $ajax_controller; return $this; } /** * Main method. * * @return void */ public function run() { global $config; $userInfo = users_get_user_by_id($config['id_user']); if ((bool) $userInfo['show_tips_startup'] === false) { return; } $_SESSION['showed_tips_window'] = true; ui_require_css_file('tips_window'); ui_require_css_file('jquery.bxslider'); ui_require_javascript_file('tipsWindow'); ui_require_javascript_file('jquery.bxslider.min'); echo '
'; $totalTips = $this->getTotalTipsShowUser(); if ($totalTips > 0) { ?> getRandomTip(true); View::render( 'dashboard/tipsWindow', [ 'title' => $initialTip['title'], 'text' => $initialTip['text'], 'url' => $initialTip['url'], 'files' => $initialTip['files'], 'id' => $initialTip['id'], ] ); } public function renderPreview() { $title = get_parameter('title', ''); $text = get_parameter('text', ''); $url = get_parameter('url', ''); $files = get_parameter('files', ''); if (empty($files) === false) { $files = explode(',', $files); } foreach ($files as $key => $value) { $files[$key] = str_replace(ui_get_full_url('/'), '', $value); } View::render( 'dashboard/tipsWindow', [ 'title' => $title, 'text' => $text, 'url' => $url, 'preview' => true, 'files' => $files, ] ); } public function getTipById($idTip) { $tip = db_get_row( 'twelcome_tip', 'id', $idTip, ); if ($tip !== false) { $tip['title'] = io_safe_output($tip['title']); $tip['text'] = io_safe_output($tip['text']); $tip['url'] = io_safe_output($tip['url']); } return $tip; } public function getRandomTip($return=false) { global $config; $exclude = get_parameter('exclude', ''); $userInfo = users_get_user_by_id($config['id_user']); $profilesUser = users_get_user_profile($config['id_user']); $language = ($userInfo['language'] !== 'default') ? $userInfo['language'] : $config['language']; $idProfilesFilter = '0'; foreach ($profilesUser as $key => $profile) { $idProfilesFilter .= ','.$profile['id_perfil']; } $sql = 'SELECT id, title, text, url FROM twelcome_tip WHERE enable = "1" '; if (empty($exclude) === false && $exclude !== null) { $exclude = implode(',', json_decode($exclude, true)); if ($exclude !== '') { $sql .= sprintf(' AND id NOT IN (%s)', $exclude); } } $sql .= sprintf(' AND id_profile IN (%s)', $idProfilesFilter); $sql .= ' ORDER BY CASE WHEN id_lang = "'.$language.'" THEN id_lang END DESC, RAND()'; $tip = db_get_row_sql($sql); if (empty($tip) === false) { $tip['files'] = $this->getFilesFromTip($tip['id']); $tip['title'] = io_safe_output($tip['title']); $tip['text'] = io_safe_output($tip['text']); $tip['url'] = io_safe_output($tip['url']); } if ($return) { if (empty($tip) === false) { return $tip; } else { return false; } } else { if (empty($tip) === false) { echo json_encode(['success' => true, 'data' => $tip]); return; } else { echo json_encode(['success' => false]); return; } } } public function getTotalTips() { return db_get_sql('SELECT count(*) FROM twelcome_tip'); } public function getTotalTipsShowUser() { global $config; $profilesUser = users_get_user_profile($config['id_user']); $idProfilesFilter = '0'; foreach ($profilesUser as $key => $profile) { $idProfilesFilter .= ','.$profile['id_perfil']; } $sql = 'SELECT count(*) FROM twelcome_tip WHERE enable = "1" '; $sql .= sprintf(' AND id_profile IN (%s)', $idProfilesFilter); $sql .= ' ORDER BY CASE WHEN id_lang = "'.$config['language'].'" THEN id_lang END DESC, RAND()'; return db_get_sql($sql); } public function getFilesFromTip($idTip) { if (empty($idTip) === true) { return false; } $sql = sprintf('SELECT id, filename, path FROM twelcome_tip_file WHERE twelcome_tip_file = %s', $idTip); return db_get_all_rows_sql($sql); } public function deleteImagesFromTip($idTip, $imagesToRemove) { foreach ($imagesToRemove as $id => $image) { unlink($image); db_process_sql_delete( 'twelcome_tip_file', [ 'id' => $id, 'twelcome_tip_file' => $idTip, ] ); } } public function setShowTipsAtStartup() { global $config; $showTipsStartup = get_parameter('show_tips_startup', ''); if ($showTipsStartup !== '' && $showTipsStartup !== null) { $result = db_process_sql_update( 'tusuario', ['show_tips_startup' => $showTipsStartup], ['id_user' => $config['id_user']] ); if ($result !== false) { echo json_encode(['success' => true]); return; } else { echo json_encode(['success' => false]); return; } } else { echo json_encode(['success' => false]); return; } } public function draw($errors=null) { ui_require_css_file('tips_window'); if ($errors !== null) { if (count($errors) > 0) { foreach ($errors as $key => $value) { ui_print_error_message($value); } } else { ui_print_success_message(__('Tip deleted')); } } try { $columns = [ 'language', 'title', 'text', 'enable', 'actions', ]; $columnNames = [ __('Language'), __('Title'), __('Text'), __('Enable'), __('Actions'), ]; // Load datatables user interface. ui_print_datatable( [ 'id' => 'list_tips_windows', 'class' => 'info_table', 'style' => 'width: 100%', 'columns' => $columns, 'column_names' => $columnNames, 'ajax_url' => $this->ajaxController, 'ajax_data' => ['method' => 'getTips'], 'no_sortable_columns' => [-1], 'order' => [ 'field' => 'title', 'direction' => 'asc', ], 'search_button_class' => 'sub filter float-right', 'form' => [ 'inputs' => [ [ 'label' => __('Search by title'), 'type' => 'text', 'name' => 'filter_title', 'size' => 12, ], ], ], ] ); echo ' '; } catch (Exception $e) { echo $e->getMessage(); } } public function deleteTip($idTip) { $files = $this->getFilesFromTip($idTip); if ($files !== false) { if (count($files) > 0) { foreach ($files as $key => $file) { unlink($file['path'].'/'.$file['filename']); } } } return db_process_sql_delete( 'twelcome_tip', ['id' => $idTip] ); } public function getTips() { global $config; $data = []; $start = get_parameter('start', 0); $length = get_parameter('length', $config['block_size']); $orderDatatable = get_datatable_order(true); $filters = get_parameter('filter', []); $pagination = ''; $filter = ''; $order = ''; try { ob_start(); if (key_exists('filter_title', $filters) === true) { if (empty($filters['filter_title']) === false) { $filter = ' WHERE title like "%'.$filters['filter_title'].'%"'; } } if (isset($orderDatatable)) { $order = sprintf( ' ORDER BY %s %s', $orderDatatable['field'], $orderDatatable['direction'] ); } if (isset($length) && $length > 0 && isset($start) && $start >= 0 ) { $pagination = sprintf( ' LIMIT %d OFFSET %d ', $length, $start ); } $sql = sprintf( 'SELECT id, name AS language, title, text, url, enable FROM twelcome_tip t LEFT JOIN tlanguage l ON t.id_lang = l.id_language %s %s %s', $filter, $order, $pagination ); $data = db_get_all_rows_sql($sql); foreach ($data as $key => $row) { if ($row['enable'] === '1') { $data[$key]['enable'] = ''; } else { $data[$key]['enable'] = ''; } $data[$key]['title'] = io_safe_output($row['title']); $data[$key]['text'] = io_safe_output($row['text']); $data[$key]['url'] = io_safe_output($row['url']); $data[$key]['actions'] = ' '; } if (empty($data) === true) { $total = 0; $data = []; } else { $total = $this->getTotalTips(); } echo json_encode( [ 'data' => $data, 'recordsTotal' => $total, 'recordsFiltered' => $total, ] ); // Capture output. $response = ob_get_clean(); } catch (Exception $e) { echo json_encode(['error' => $e->getMessage()]); exit; } json_decode($response); if (json_last_error() === JSON_ERROR_NONE) { echo $response; } else { echo json_encode( [ 'success' => false, 'error' => $response, ] ); } exit; } public function viewCreate($errors=null) { ui_require_css_file('tips_window'); ui_require_css_file('jquery.bxslider'); ui_require_javascript_file('tipsWindow'); ui_require_javascript_file('jquery.bxslider.min'); if ($errors !== null) { if (count($errors) > 0) { foreach ($errors as $key => $value) { ui_print_error_message($value); } } else { ui_print_success_message(__('Tip created')); } } $profiles = profile_get_profiles(); echo ''; $table = new stdClass(); $table->width = '100%'; $table->class = 'databox filters'; $table->style[0] = 'font-weight: bold'; $table->data = []; $table->data[0][0] = __('Images'); $table->data[0][1] .= html_print_div(['id' => 'inputs_images'], true); $table->data[0][1] .= html_print_div( [ 'id' => 'notices_images', 'class' => 'invisible', 'content' => ''.__('Wrong size, we recommend images of 464x260 px').'
', ], true ); $table->data[0][1] .= html_print_button(__('Add image'), 'button_add_image', false, '', '', true); $table->data[1][0] = __('Language'); $table->data[1][1] = html_print_select_from_sql( 'SELECT id_language, name FROM tlanguage', 'id_lang', '', '', '', '0', true ); $table->data[2][0] = __('Profile'); $table->data[2][1] = html_print_select($profiles, 'id_profile', '0', '', __('All'), 0, true); $table->data[3][0] = __('Title'); $table->data[3][1] = html_print_input_text('title', '', '', 35, 100, true); $table->data[4][0] = __('Text'); $table->data[4][1] = html_print_textarea('text', 5, 1, '', '', true); $table->data[5][0] = __('Url'); $table->data[5][1] = html_print_input_text('url', '', '', 35, 100, true); $table->data[6][0] = __('Enable'); $table->data[6][1] = html_print_checkbox_switch('enable', true, true, true); echo ''; html_print_div(['id' => 'tips_window_modal_preview']); } public function viewEdit($idTip, $errors=null) { $tip = $this->getTipById($idTip); if ($tip === false) { return; } $files = $this->getFilesFromTip($idTip); ui_require_css_file('tips_window'); ui_require_css_file('jquery.bxslider'); ui_require_javascript_file('tipsWindow'); ui_require_javascript_file('jquery.bxslider.min'); if ($errors !== null) { if (count($errors) > 0) { foreach ($errors as $key => $value) { ui_print_error_message($value); } } else { ui_print_success_message(__('Tip edited')); } } $outputImagesTip = ''; if (empty($files) === false) { foreach ($files as $key => $value) { $namePath = $value['path'].$value['filename']; $imageTip = html_print_image($namePath, true); $imageTip .= html_print_input_image( 'delete_image_tip', 'images/delete.png', '', '', true, ['onclick' => 'deleteImage(this, \''.$value['id'].'\', \''.$namePath.'\')'] ); $outputImagesTip .= html_print_div( [ 'class' => 'image_tip', 'content' => $imageTip, ], true ); } } $profiles = profile_get_profiles(); echo ''; $table = new stdClass(); $table->width = '100%'; $table->class = 'databox filters'; $table->style[0] = 'font-weight: bold'; $table->data = []; $table->data[0][0] = __('Images'); $table->data[0][1] .= $outputImagesTip; $table->data[0][1] .= html_print_div(['id' => 'inputs_images'], true); $table->data[0][1] .= html_print_input_hidden('images_to_delete', '{}', true); $table->data[0][1] .= html_print_div( [ 'id' => 'notices_images', 'class' => 'invisible', 'content' => ''.__('Wrong size, we recommend images of 464x260 px').'
', ], true ); $table->data[0][1] .= html_print_button(__('Add image'), 'button_add_image', false, '', '', true); $table->data[1][0] = __('Language'); $table->data[1][1] = html_print_select_from_sql( 'SELECT id_language, name FROM tlanguage', 'id_lang', $tip['id_lang'], '', '', '0', true ); $table->data[2][0] = __('Profile'); $table->data[2][1] = html_print_select($profiles, 'id_profile', $tip['id_profile'], '', __('All'), 0, true); $table->data[3][0] = __('Title'); $table->data[3][1] = html_print_input_text('title', $tip['title'], '', 35, 100, true); $table->data[4][0] = __('Text'); $table->data[4][1] = html_print_textarea('text', 5, 1, $tip['text'], '', true); $table->data[5][0] = __('Url'); $table->data[5][1] = html_print_input_text('url', $tip['url'], '', 35, 100, true); $table->data[6][0] = __('Enable'); $table->data[6][1] = html_print_checkbox_switch('enable', 1, ($tip['enable'] === '1') ? true : false, true); echo ''; html_print_div(['id' => 'tips_window_modal_preview']); } public function updateTip($id, $id_profile, $id_lang, $title, $text, $url, $enable, $images=null) { db_process_sql_begin(); $idTip = db_process_sql_update( 'twelcome_tip', [ 'id_lang' => $id_lang, 'id_profile' => (empty($id_profile) === false) ? $id_profile : 0, 'title' => io_safe_input($title), 'text' => io_safe_input($text), 'url' => io_safe_input($url), 'enable' => $enable, ], ['id' => $id] ); if ($idTip === false) { db_process_sql_rollback(); return false; } if ($images !== null) { foreach ($images as $key => $image) { $res = db_process_sql_insert( 'twelcome_tip_file', [ 'twelcome_tip_file' => $id, 'filename' => $image, 'path' => 'images/tips/', ] ); if ($res === false) { db_process_sql_rollback(); return false; } } } db_process_sql_commit(); return true; } public function createTip($id_lang, $id_profile, $title, $text, $url, $enable, $images=null) { db_process_sql_begin(); $idTip = db_process_sql_insert( 'twelcome_tip', [ 'id_lang' => $id_lang, 'id_profile' => (empty($id_profile) === false) ? $id_profile : 0, 'title' => io_safe_input($title), 'text' => io_safe_input($text), 'url' => io_safe_input($url), 'enable' => $enable, ] ); if ($idTip === false) { db_process_sql_rollback(); return false; } if ($images !== null) { foreach ($images as $key => $image) { $res = db_process_sql_insert( 'twelcome_tip_file', [ 'twelcome_tip_file' => $idTip, 'filename' => $image, 'path' => 'images/tips/', ] ); if ($res === false) { db_process_sql_rollback(); return false; } } } db_process_sql_commit(); return true; } public function validateImages($files) { $formats = [ 'image/png', 'image/jpg', 'image/jpeg', 'image/gif', ]; $errors = []; $maxsize = 6097152; foreach ($files as $key => $file) { if ($file['error'] !== 0) { $errors[] = __('Incorrect file'); } if (in_array($file['type'], $formats) === false) { $errors[] = __('Format image invalid'); } if ($file['size'] > $maxsize) { $errors[] = __('Image size too large'); } } if (count($errors) > 0) { return $errors; } else { return false; } } public function uploadImages($files) { $dir = 'images/tips/'; $imagesOk = []; foreach ($files as $key => $file) { $name = str_replace(' ', '_', $file['name']); $name = str_replace('.', uniqid().'.', $name); move_uploaded_file($file['tmp_name'], $dir.'/'.$name); $imagesOk[] = $name; } return $imagesOk; } }