Current File : //usr/local/lsws/add-ons/webcachemgr/src/View/Model/ManageViewModel.php |
<?php
/** ******************************************
* LiteSpeed Web Server Cache Manager
*
* @author Michael Alegre
* @copyright 2018-2023 LiteSpeed Technologies, Inc.
* ******************************************* */
namespace Lsc\Wp\View\Model;
use Lsc\Wp\Context\Context;
use Lsc\Wp\Util;
use Lsc\Wp\WPInstallStorage;
use Lsc\Wp\WPInstall;
use Lsc\Wp\PluginVersion;
use Lsc\Wp\Logger;
use Lsc\Wp\LSCMException;
class ManageViewModel
{
/**
* @var string
*/
const FLD_ICON_DIR = 'iconDir';
/**
* @var string
*/
const FLD_SCAN_BTN_NAME = 'scanBtnName';
/**
* @var string
*/
const FLD_BTN_STATE = 'btnState';
/**
* @var string
*/
const FLD_ACTIVE_VER = 'activeVer';
/**
* @var string
*/
const FLD_SHOW_LIST = 'showList';
/**
* @var string
*/
const FLD_LIST_DATA = 'listData';
/**
* @var string
*/
const FLD_COUNT_DATA = 'countData';
/**
* @var string
*/
const FLD_INFO_MSGS = 'infoMsgs';
/**
* @var string
*/
const FLD_SUCC_MSGS = 'succMsgs';
/**
* @var string
*/
const FLD_ERR_MSGS = 'errMsgs';
/**
* @var string
*/
const FLD_WARN_MSGS = 'warnMsgs';
/**
* @var string
*/
const COUNT_DATA_INSTALLS = 'installs';
/**
* @var string
*/
const COUNT_DATA_ENABLED = 'enabled';
/**
* @var string
*/
const COUNT_DATA_DISABLED = 'disabled';
/**
* @var string
*/
const COUNT_DATA_WARN = 'warn';
/**
* @var string
*/
const COUNT_DATA_ERROR = 'err';
/**
* @var string
*/
const COUNT_DATA_FLAGGED = 'flagged';
/**
* @var string
*/
const COUNT_DATA_UNFLAGGED = 'unflagged';
/**
* @var WPInstallStorage
*/
protected $wpInstallStorage;
/**
* @var array
*/
protected $tplData = array();
/**
* @var string
*/
protected $iconDir = '';
/**
* @since 1.13.3
* @var string[][]
*/
protected $statusInfo = array(
'disabled' => array(
'sort' => 'disabled',
'state' => '<span '
. 'class="glyphicon glyphicon-flash status-disabled" '
. 'data-uk-tooltip title="LSCWP is disabled."></span>',
'btn_content' => '<span class="enable_btn"></span>',
'btn_title' => 'Click to enable LSCache',
'onclick' => 'onclick="javascript:lscwpEnableSingle(this);"',
'btn_attributes' => 'data-uk-tooltip',
'btn_state' => ''
),
'enabled' => array(
'sort' => 'enabled',
'state' => '<span '
. 'class="glyphicon glyphicon-flash status-enabled" '
. 'data-uk-tooltip title="LSCWP is enabled."></span>',
'btn_content' => '<span class="disable_btn"></span>',
'btn_title' => 'Click to disable LSCache',
'onclick' =>
'onclick="javascript:lscwpDisableSingle(this);"',
'btn_attributes' => 'data-uk-tooltip',
'btn_state' => ''
),
'adv_cache' => array(
'sort' => 'warning',
'state' => '<span class="status-warning" data-uk-tooltip '
. 'title="LSCache is enabled but not caching. Please visit the '
. 'WordPress Dashboard for more information."></span>',
'btn_content' => '<span class="disable_btn"></span>',
'btn_title' => 'Click to disable LSCache',
'onclick' =>
'onclick="javascript:lscwpDisableSingle(this);"',
'btn_attributes' => 'data-uk-tooltip',
'btn_state' => ''
),
'disabled_no_active_ver' => array(
'sort' => 'disabled',
'state' => '<span '
. 'class="glyphicon glyphicon-flash status-disabled" '
. 'data-uk-tooltip title="LSCWP is disabled."></span>',
'btn_content' => '<span class="inactive-action-btn" '
. 'data-uk-tooltip '
. 'title="No active LSCWP version set! Cannot enable LSCache.">'
. '</span>',
'btn_title' => '',
'onclick' => '',
'btn_attributes' => '',
'btn_state' => 'disabled',
),
'error' => array(
'sort' => 'error',
/**
* 'state' added individually later.
*/
'btn_title' => '',
'btn_content' => '<span class="inactive-action-btn"></span>',
'onclick' => '',
'btn_attributes' => '',
'btn_state' => 'disabled'
)
);
/**
* @since 1.13.3
* @var string[][]
*/
protected $flagInfo = array(
'unflagged' => array(
'sort' => 'unflagged',
'icon' => '<span '
. 'class="glyphicon glyphicon-flag ls-flag ls-flag-unset">'
. '</span>',
'btn_title' => 'Click to set flag',
'onclick' => 'onclick="javascript:lscwpFlagSingle(this);"',
'btn_attributes' => 'data-uk-tooltip'
),
'flagged' => array(
'sort' => 'flagged',
'icon' => '<span '
. 'class="glyphicon glyphicon-flag ls-flag ls-flag-set">'
. '</span>',
'btn_title' => 'Click to unset flag',
'onclick' => 'onclick="javascript:lscwpUnflagSingle(this);"',
'btn_attributes' => 'data-uk-tooltip'
),
);
/**
*
* @param WPInstallStorage $wpInstallStorage
*
* @throws LSCMException Thrown indirectly by $this->init() call.
*/
public function __construct( WPInstallStorage $wpInstallStorage )
{
$this->wpInstallStorage = $wpInstallStorage;
$this->init();
}
/**
*
* @throws LSCMException thrown indirectly by $this->setIconDir() call.
* @throws LSCMException thrown indirectly by $this->setActiveVerData()
* call.
* @throws LSCMException thrown indirectly by $this->setMsgData() call.
*/
protected function init()
{
$this->setIconDir();
$this->setBtnDataAndListVisibility();
$this->setActiveVerData();
$this->setListAndCountData();
$this->setMsgData();
}
/**
*
* @param string $field
*
* @return null|mixed
*/
public function getTplData( $field )
{
if ( !isset($this->tplData[$field]) ) {
return null;
}
return $this->tplData[$field];
}
/**
*
* @throws LSCMException Thrown indirectly by Logger::debug() call.
*/
protected function setIconDir()
{
$iconDir = '';
try
{
$iconDir = Context::getOption()->getIconDir();
}
catch ( LSCMException $e )
{
Logger::debug($e->getMessage() . ' Could not get icon directory.');
}
$this->tplData[self::FLD_ICON_DIR] = $iconDir;
}
/**
*
* @throws LSCMException Thrown indirectly by Logger::uiInfo() call.
*/
protected function setBtnDataAndListVisibility()
{
$scanBtnName = 'Re-scan';
$btnState = 'disabled';
if ( ($errStatus = $this->wpInstallStorage->getError()) !== 0 ) {
$this->tplData[self::FLD_SHOW_LIST] = false;
if ( $errStatus == WPInstallStorage::ERR_NOT_EXIST ) {
$scanBtnName = 'Scan';
$msg = 'Start by clicking Scan. This will discover all active '
. 'WordPress installations and add them to a list below.';
}
elseif ( $errStatus == WPInstallStorage::ERR_VERSION_LOW ) {
$scanBtnName = 'Scan';
$msg = 'To further improve Cache Management features in this '
. 'version, current installations must be re-discovered. '
. 'Please perform a Scan now.';
}
else {
$msg = 'Scan data could not be read. Please perform a Re-scan.';
}
Logger::uiInfo($msg);
}
else {
$this->tplData[self::FLD_SHOW_LIST] = true;
if ( $this->wpInstallStorage->getCount() > 0 ) {
$btnState = '';
}
}
$this->tplData[self::FLD_SCAN_BTN_NAME] = $scanBtnName;
$this->tplData[self::FLD_BTN_STATE] = $btnState;
}
protected function setListAndCountData()
{
$listData = array();
$countData = array(
self::COUNT_DATA_INSTALLS => 0,
self::COUNT_DATA_ENABLED => 0,
self::COUNT_DATA_DISABLED => 0,
self::COUNT_DATA_WARN => 0,
self::COUNT_DATA_ERROR => 0,
self::COUNT_DATA_FLAGGED => 0,
self::COUNT_DATA_UNFLAGGED => 0
);
$wpInstalls = $this->wpInstallStorage->getAllWPInstalls();
if ( $wpInstalls !== null ) {
$countData[self::COUNT_DATA_INSTALLS] = count($wpInstalls);
foreach ( $wpInstalls as $wpInstall ) {
$listData[$wpInstall->getPath()] = array(
'statusData' =>
$this->getStatusDisplayData($wpInstall, $countData),
'flagData' =>
$this->getFlagDisplayData($wpInstall, $countData),
'siteUrl' => Util::tryIdnToUtf8(
$wpInstall->getData(WPInstall::FLD_SITEURL)
)
);
}
}
$this->tplData[self::FLD_LIST_DATA] = $listData;
$this->tplData[self::FLD_COUNT_DATA] = $countData;
}
/**
*
* @param WPInstall $wpInstall
* @param int[] $countData
*
* @return string[]
*/
protected function getStatusDisplayData(
WPInstall $wpInstall,
array &$countData )
{
$wpStatus = $wpInstall->getStatus();
if ( $wpInstall->hasFatalError($wpStatus) ) {
$countData[self::COUNT_DATA_ERROR]++;
$fatalErrStateInfo =
Util::getFatalErrorStateMessageAndLink($wpStatus);
$currStatusData = $this->statusInfo['error'];
$currStatusData['state'] = '<a '
. "href=\"{$fatalErrStateInfo['link']}\" "
. 'target="_blank" rel="noopener" data-uk-tooltip '
. "title =\"{$fatalErrStateInfo['stateMsg']}\" "
. 'class="status-error"></a>';
}
elseif ( ($wpStatus & WPInstall::ST_PLUGIN_INACTIVE ) ) {
$countData[self::COUNT_DATA_DISABLED]++;
if ( !$this->getTplData(self::FLD_ACTIVE_VER) ) {
$currStatusData = $this->statusInfo['disabled_no_active_ver'];
}
else {
$currStatusData = $this->statusInfo['disabled'];
}
}
elseif ( !($wpStatus & WPInstall::ST_LSC_ADVCACHE_DEFINED) ) {
$countData[self::COUNT_DATA_WARN]++;
$currStatusData = $this->statusInfo['adv_cache'];
}
else {
$countData[self::COUNT_DATA_ENABLED]++;
$currStatusData = $this->statusInfo['enabled'];
}
return $currStatusData;
}
/**
*
* @param WPInstall $wpInstall
* @param int[] $countData
*
* @return string[]
*/
protected function getFlagDisplayData(
WPInstall $wpInstall,
array &$countData )
{
if ( ($wpInstall->getStatus() & WPInstall::ST_FLAGGED ) ) {
$countData[self::COUNT_DATA_FLAGGED]++;
$currFlagData = $this->flagInfo['flagged'];
}
else {
$countData[self::COUNT_DATA_UNFLAGGED]++;
$currFlagData = $this->flagInfo['unflagged'];
}
return $currFlagData;
}
/**
*
* @throws LSCMException Thrown indirectly by Logger::debug() call.
* @throws LSCMException Thrown indirectly by Logger::uiWarning() call.
*/
protected function setActiveVerData()
{
try
{
$currVer = PluginVersion::getCurrentVersion();
}
catch ( LSCMException $e )
{
Logger::debug(
$e->getMessage() . ' Could not get active LSCWP version.'
);
Logger::uiWarning(
'Active LiteSpeed Cache Plugin version is not set. Enable '
. 'operations cannot be performed. Please go to '
. '<a href="?do=lscwpVersionManager" '
. 'title="Go to Version Manager">Version Manager</a> to '
. 'select a version.'
);
$currVer = false;
}
$this->tplData[self::FLD_ACTIVE_VER] = $currVer;
}
/**
*
* @throws LSCMException Thrown indirectly by Logger::getUiMsgs() call.
* @throws LSCMException Thrown indirectly by Logger::getUiMsgs() call.
* @throws LSCMException Thrown indirectly by Logger::getUiMsgs() call.
* @throws LSCMException Thrown indirectly by Logger::getUiMsgs() call.
*/
protected function setMsgData()
{
$this->tplData[self::FLD_INFO_MSGS] =
Logger::getUiMsgs(Logger::UI_INFO);
$this->tplData[self::FLD_WARN_MSGS] =
Logger::getUiMsgs(Logger::UI_WARN);
$msgs = $this->wpInstallStorage->getAllCmdMsgs();
$this->tplData[self::FLD_SUCC_MSGS] = array_merge(
$msgs['succ'],
Logger::getUiMsgs(Logger::UI_SUCC)
);
$this->tplData[self::FLD_ERR_MSGS] = array_merge(
$msgs['fail'],
$msgs['err'],
Logger::getUiMsgs(Logger::UI_ERR)
);
}
/**
*
* @return string
*
* @throws LSCMException Thrown indirectly by Context::getOption() call.
*/
public function getTpl()
{
return Context::getOption()->getSharedTplDir() . '/Manage.tpl';
}
}