<?php
/**
* SeekQuarry/Yioop --
* Open Source Pure PHP Search Engine, Crawler, and Indexer
*
* Copyright (C) 2009 - 2026 Chris Pollett chris@pollett.org
*
* LICENSE:
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
* END LICENSE
*
* @author Eswara Rajesh Pinapala epinapala@live.com
* @license https://www.gnu.org/licenses/ GPL3
* @link https://www.seekquarry.com/
* @copyright 2009 - 2026
* @filesource
*/
namespace seekquarry\yioop\views\helpers;
use seekquarry\yioop\configs as C;
/**
* HelpbuttonHelper this is a helper class is used to draw help button for
* context sensitive help.
* @author Eswara Rajesh Pinapala
*/
class HelpbuttonHelper extends Helper
{
/**
* is_help_initialized stores whether or not setupHelpParams() has been
* previously called
* @var bool
*/
public $is_help_initialized;
/**
* localization_data stores the words the help button shows, in the
* reader's own language, ready for the page's scripts to use.
* @var array
*/
public $localization_data;
/**
* back_params stores query parameters as json array for page just came
* from
* @var string
*/
public $back_params;
/**
* Javascript needed to open a help button page
* @var string
*/
public $script;
/**
* safe_request stores what the request carried, already made safe by the
* controller: which controller and activity the reader is on, which help
* page to open, and the rest of the address so they can be brought back
* where they were. A helper draws what it is handed and cleans nothing
* itself, so this arrives ready to write into the page.
* @var array
*/
public $safe_request = [];
/**
* __construct the constructor at this point initializes the all the
* required code for Wiki Help initialization.
*/
public function __construct()
{
$this->is_help_initialized = false;
$this->localization_data = null;
$this->back_params = null;
$this->script = null;
parent::__construct();
}
/**
* This method is used to render the help button,
* given a help point CSRF token and target controller name.
*
* @param $help_point_id used to set as help button id
* @param $csrf_token_value CSRF token to make api call/open edit link
* @param bool $as_html when true return the rendered html as a
* string; when false (default) echo it directly to output
* @return String button html.
*/
public function render($help_point_id, $csrf_token_value, $as_html=false)
{
if ($this->is_help_initialized == false) {
$this->setupHelpParams();
}
/* Whether the reader is on a phone is set where a request came
in over the web. A case that calls this helper on its own has
no request behind it, so the setting may not be there at all,
and reading it without asking first printed a warning through
every run of the tests. */
$is_mobile = empty($_SERVER["MOBILE"]) ? "false" : "true";
$wiki_group_id = $this->safe_request['help_group_id'] ??
C\HELP_GROUP_ID;
$api_controller = "api";
$api_wiki_action = "wiki";
$api_wiki_mode = "read";
$activity = $this->safe_request['activity'] ?? "";
if ($activity == 'machineStatus') {
$activity = 'manageMachines';
} else if ($activity == 'crawlStatus') {
$activity = 'manageCrawls';
}
$button_string = '<button type="button"
class="help-button default"
data-tl=\'' . $this->localization_data . '\'
data-back-params=\'' . $this->back_params . '\'
onclick="javascript:displayHelpForId(this,'
. $is_mobile . ',\''
. ($this->safe_request['controller'] ?? "") . '\',\''
. $activity . '\',\''
. C\p('CSRF_TOKEN') . '\',\''
. $csrf_token_value . "','$wiki_group_id','$api_controller',"
. "'$api_wiki_action','$api_wiki_mode" . '\')" '
. 'data-pagename="' . $help_point_id . '"> '
. tl('helpbutton_helper_question_mark') . '</button>';
if ($as_html) {
return $button_string;
} else {
$button_string = "<script>\n" .
"document.write(" .json_encode($button_string) .");\n" .
"</script>";
}
return $button_string;
}
/**
* setupHelpParams this Helper method is used to setup params needed for
* Context-Sensitive help to work. This gets executed if there is at least
* one help button rendered on the page. This is executed only once with
* the help of "is_help_initialized" variable.
*/
public function setupHelpParams()
{
$this->is_help_initialized = true;
$this->localization_data = "{" .
'helpbutton_helper_edit :"' . tl('helpbutton_helper_edit') . '",' .
'helpbutton_helper_not_available :"' .
tl('helpbutton_helper_not_available') .
'",' .
'helpbutton_helper_create_edit :"' .
tl('helpbutton_helper_create_edit',
$this->safe_request['help_group'] ?? "") .
'",' .
'helpbutton_helper_page_no_exist :"' .
tl('helpbutton_helper_page_no_exist','%s') .
'",' .
'helpbutton_helper_read :"' .
tl('helpbutton_helper_read') . '"' .
"}";
$this->back_params = "{";
/* Every value the address carried is kept, so that a reader
who opens the help and then closes it comes back to the page
they were on rather than to the top of the site. */
$back_params_array = $this->safe_request['back'] ?? [];
$back_params_only_keys = array_keys($back_params_array);
$last_key = end($back_params_only_keys);
foreach ($back_params_array as $key => $value) {
$this->back_params .= $key . ' : "' . $value . '"';
if ($key != $last_key) {
$this->back_params .= ', ';
}
}
$this->back_params .= "}";
if (!empty($this->safe_request['open_help_page'])) {
$help_page_to_open = $this->safe_request['open_help_page'];
$this->script = 'var matches = '
. 'document.querySelectorAll(\'[data-pagename="'
. $help_page_to_open
. '"]\');' . "\n\t\t"
. "matches[0].click();"
. "\n";
}
}
}