Файл: concrete5.7.5.6/concrete/src/Application/Service/Dashboard.php
Строк: 460
<?php
namespace ConcreteCoreApplicationService;
use Config;
use Core;
use Database;
use File;
use Page;
use URL;
use Localization;
use User as ConcreteUser;
use Permissions;
use Session;
class Dashboard
{
/**
* Checks to see if a user has access to the C5 dashboard.
* @return bool
*/
public function canRead()
{
$c = Page::getByPath('/dashboard', 'ACTIVE');
$cp = new Permissions($c);
return $cp->canViewPage();
}
/**
* @return bool
*/
public function canAccessComposer()
{
$c = Page::getByPath('/dashboard/composer', 'ACTIVE');
$cp = new Permissions($c);
return $cp->canViewPage();
}
/**
* Test if the current path is within the dashboard.
* Optionally, a Page or path can be passed to test.
*
* @param bool|ConcreteCorePagePage|string $page (optional)
* @return bool
*/
public function inDashboard($page = false)
{
$path = "";
if ($page instanceof Page && !$page->isError()) {
$path = $page->getCollectionPath();
} elseif (is_string($page)) {
$path = $page;
} else {
$page = Page::getCurrentPage();
if ($page instanceof Page && !$page->isError()) {
$path = $page->getCollectionPath();
}
}
return strpos($path, '/dashboard') === 0;
}
/**
* @deprecated
*/
public function getDashboardPaneFooterWrapper($includeDefaultBody = true)
{
return;
}
/**
* @deprecated
*/
public function getDashboardPaneHeaderWrapper($title = false, $help = false, $span = 'span12', $includeDefaultBody = true, $navigatePages = array(), $upToPage = false, $favorites = true)
{
return;
}
/**
* @param bool $title
* @param bool $help
* @param array $navigatePages
* @param bool $upToPage
* @param bool $favorites
* @return string
*/
public function getDashboardPaneHeader($title = false, $help = false, $navigatePages = array(), $upToPage = false, $favorites = true)
{
$c = Page::getCurrentPage();
$vt = Core::make('helper/validation/token');
$token = $vt->generate('access_quick_nav');
$nh = Core::make('helper/navigation');
$trail = $nh->getTrailToCollection($c);
if (count($trail) > 1 || count($navigatePages) > 1 || is_object($upToPage)) {
$parent = Page::getByID($c->getCollectionParentID());
if (count($trail) > 1 && (!is_object($upToPage))) {
$upToPage = Page::getByID($parent->getCollectionParentID());
}
$subpages = array();
if ($navigatePages !== -1) {
if (count($navigatePages) > 0) {
$subpages = $navigatePages;
} else {
/**
* @var ConcreteCorePagePage[] $subpages
*/
$subpages = ConcreteBlockAutonavController::getChildPages($parent);
}
}
$subpagesP = array();
if (is_array($subpages)) {
foreach ($subpages as $sc) {
$cp = new Permissions($sc);
if ($cp->canViewPage()) {
$subpagesP[] = $sc;
}
}
}
if (count($subpagesP) > 0 || is_object($upToPage)) {
$relatedPages = '<ul id="ccm-page-navigate-pages-content" class="dropdown-menu">';
foreach ($subpagesP as $sc) {
if ($sc->getAttribute('exclude_nav')) {
continue;
}
if ($c->getCollectionPath() == $sc->getCollectionPath() || (strpos($c->getCollectionPath(), $sc->getCollectionPath()) == 0) && strpos($c->getCollectionPath(), $sc->getCollectionPath()) !== false) {
$class= 'nav-selected';
} else {
$class = '';
}
$relatedPages .= '<li class="' . $class . '"><a href="' . $nh->getLinkToCollection($sc) . '">' . t($sc->getCollectionName()) . '</a></li>';
}
if ($upToPage) {
$relatedPages .= '<li class="ccm-menu-separator"></li>';
$relatedPages .= '<li><a href="' . $nh->getLinkToCollection($upToPage) . '">' . t('< Back to %s', t($upToPage->getCollectionName())) . '</a></li>';
}
$relatedPages .= '</ul>';
$navigateTitle = t($parent->getCollectionName());
}
}
$html = '<div class="ccm-pane-header">';
/*$class = 'icon-star';
$qn = ConcreteDashboardMenu::getMine();
$quicknav = $qn->getItems(false);
if (in_array($c->getCollectionPath(), $quicknav)) {
$class = 'icon-white icon-star';
}
*/
$html .= '<ul class="ccm-pane-header-icons">';
if (!$help) {
$ih = Core::make('helper/concrete/ui/help');
$pageHelp = $ih->getPages();
if (isset($pageHelp[$c->getCollectionPath()])) {
$help = $pageHelp[$c->getCollectionPath()];
}
}
if (is_array($help)) {
$help = $help[0] . '<br/><br/><a href="' . $help[1] . '" class="btn small" target="_blank">' . t('Learn More') . '</a>';
}
if (isset($relatedPages)) {
$html .= '<li><a href="" data-toggle="dropdown" title="' . $navigateTitle . '" id="ccm-page-navigate-pages"><i class="icon-share-alt"></i></a>' . $relatedPages . '</li>';
}
if ($help) {
$html .= '<li><span style="display: none" id="ccm-page-help-content">' . $help . '</span><a href="javascript:void(0)" title="' . t('Help') . '" id="ccm-page-help"><i class="icon-question-sign"></i></a></li>';
}
if ($favorites) {
$html .= '<li><a href="javascript:void(0)" id="ccm-add-to-quick-nav" onclick="CCMDashboard.toggleQuickNav(' . $c->getCollectionID() . ','' . $token . '')"><i class="' . $class . '"></i></a></li>';
}
$html .= '<li><a href="javascript:void(0)" onclick="CCMDashboard.closePane(this)"><i class="icon-remove"></i></a></li>';
$html .= '</ul>';
if (!$title) {
$title = $c->getCollectionName();
}
$html .= '<h3>' . $title . '</h3>';
$html .= '</div>';
return $html;
}
/**
* @return stdClass
*/
public function getDashboardBackgroundImage()
{
// this feed is an array of standard PHP objects with a SRC, a caption, and a URL
// allow for a custom white-label feed
$filename = date('Ymd') . '.jpg';
$obj = new stdClass;
$obj->checkData = false;
$obj->displayCaption = false;
$image = '';
if (Config::get('concrete.white_label.dashboard_background')) {
$image = Config::get('concrete.white_label.dashboard_background');
if ($image == 'none') {
$image = '';
}
} else {
$obj->checkData = true;
$imageSetting = Config::get('concrete.misc.dashboard_background_image');
if ($imageSetting == 'custom') {
$fo = File::getByID(Config::get('concrete.misc.dashboard_background_image_fid'));
if (is_object($fo)) {
$image = $fo->getRelativePath();
}
} elseif ($imageSetting == 'none') {
$image = '';
} else {
if (isset($_SERVER['HTTPS']) && ($_SERVER['HTTPS'] == 'on')) {
$image = Config::get('concrete.urls.background_feed_secure') . '/' . $filename;
} else {
$image = Config::get('concrete.urls.background_feed') . '/' . $filename;
}
$obj->displayCaption = true;
}
}
$obj->filename = $filename;
$obj->image = $image;
return $obj;
}
/**
* @return mixed
*/
public function getIntelligentSearchMenu()
{
$dashboardMenus = Session::get('dashboardMenus', array());
$dashboardMenusKey = Localization::activeLocale();
if (array_key_exists($dashboardMenusKey, $dashboardMenus)) {
return $dashboardMenus[$dashboardMenusKey];
}
ob_start(); ?>
<div id="ccm-intelligent-search-results">
<?php
$page = Page::getByPath('/dashboard');
$children = $page->getCollectionChildrenArray(true);
$navHelper = Core::make('helper/navigation');
$packagepages = array();
$corepages = array();
foreach ($children as $ch) {
$page = Page::getByID($ch);
$pageP = new Permissions($page);
if ($pageP->canRead()) {
if (!$page->getAttribute("exclude_nav")) {
if ($page->getPackageID() > 0) {
$packagepages[] = $page;
} else {
$corepages[] = $page;
}
}
} else {
continue;
}
if ($page->getAttribute('exclude_search_index')) {
continue;
}
if ($page->getCollectionPath() == '/dashboard/system') {
$ch2 = $page->getCollectionChildrenArray();
} else {
$ch2 = $page->getCollectionChildrenArray(true);
}
?>
<div class="ccm-intelligent-search-results-module ccm-intelligent-search-results-module-onsite">
<h1><?php echo t($page->getCollectionName())?></h1>
<ul class="ccm-intelligent-search-results-list">
<?php
if (count($ch2) == 0) {
?>
<li><a href="<?php echo $navHelper->getLinkTocollection($page)?>"><?php echo t($page->getCollectionName())?></a><span><?php echo t($page->getCollectionName())?> <?php echo t($page->getAttribute('meta_keywords'))?></span></li>
<?php
}
?>
<?php
if ($page->getCollectionPath() == '/dashboard/system') {
?>
<li><a href="<?php echo $navHelper->getLinkTocollection($page)?>"><?php echo t('View All')?></a><span><?php echo t($page->getCollectionName())?> <?php echo t($page->getAttribute('meta_keywords'))?></span></li>
<?php
}
foreach ($ch2 as $chi) {
$subpage = Page::getByID($chi);
$subpageP = new Permissions($subpage);
if (!$subpageP->canRead()) {
continue;
}
if ($subpage->getAttribute('exclude_search_index')) {
continue;
}
?>
<li><a href="<?php echo $navHelper->getLinkTocollection($subpage)?>"><?php echo t($subpage->getCollectionName())?></a><span><?php if ($page->getCollectionPath() != '/dashboard/system') { ?><?php echo t($page->getCollectionName())?> <?php echo t($page->getAttribute('meta_keywords'))?> <?php } ?><?php echo t($subpage->getCollectionName())?> <?php echo t($subpage->getAttribute('meta_keywords'))?></span></li>
<?php
}
?>
</ul>
</div>
<?php
}
$custHome = Page::getByPath('/dashboard/home');
$custHomeP = new Permissions($custHome);
if ($custHomeP->canRead()) {
?>
<div class="ccm-intelligent-search-results-module ccm-intelligent-search-results-module-onsite">
<h1><?php echo t('Dashboard Home')?></h1>
<ul class="ccm-intelligent-search-results-list">
<li><a href="<?php echo URL::to('/dashboard/home')?>"><?php echo t('Customize')?> <span><?php echo t('Customize Dashboard Home')?></span></a></li>
</ul>
</div>
<?php
}
?>
<div class="ccm-intelligent-search-results-module">
<h1><?php echo t('Your Site')?></h1>
<div class="loader">
<div class="dot dot1"></div>
<div class="dot dot2"></div>
<div class="dot dot3"></div>
<div class="dot dot4"></div>
</div>
<ul class="ccm-intelligent-search-results-list" id="ccm-intelligent-search-results-list-your-site">
</ul>
</div>
<?php if (Config::get('concrete.external.intelligent_search_help')) {
?>
<div class="ccm-intelligent-search-results-module ccm-intelligent-search-results-module-offsite">
<h1><?php echo t('Help')?></h1>
<div class="loader">
<div class="dot dot1"></div>
<div class="dot dot2"></div>
<div class="dot dot3"></div>
<div class="dot dot4"></div>
</div>
<ul class="ccm-intelligent-search-results-list" id="ccm-intelligent-search-results-list-help">
</ul>
</div>
<?php
}
?>
<?php if (Config::get('concrete.marketplace.intelligent_search')) {
?>
<div class="ccm-intelligent-search-results-module ccm-intelligent-search-results-module-offsite">
<h1><?php echo t('Add-Ons')?></h1>
<div class="loader">
<div class="dot dot1"></div>
<div class="dot dot2"></div>
<div class="dot dot3"></div>
<div class="dot dot4"></div>
</div>
<ul class="ccm-intelligent-search-results-list" id="ccm-intelligent-search-results-list-marketplace">
</ul>
</div>
<?php
}
?>
</div>
<?php
$html = ob_get_contents();
ob_end_clean();
$dashboardMenus[$dashboardMenusKey] = str_replace(array("n", "r", "t"), "", $html);
Session::set('dashboardMenus', $dashboardMenus);
return $dashboardMenus[$dashboardMenusKey];
}
}
class DashboardMenu
{
/**
* @var ConcreteCorePagePage[]
*/
protected $items;
/**
* @param bool $sort
* @return array
*/
public function getItems($sort = true)
{
if ($sort) {
usort($this->items, array('ConcreteCoreApplicationServiceDashboardMenu', 'sortItems'));
}
return $this->items;
}
/**
* @param string $a
* @param string $b
* @return int
*/
protected static function sortItems($a, $b)
{
$subpatha = substr($a, 11); // /dashboard
$subpathb = substr($b, 11); // /dashboard
$segmentsa = explode('/', $subpatha);
$segmentsb = explode('/', $subpathb);
$segmenta = substr($subpatha, 0, strpos($subpatha, '/'));
$segmentb = substr($subpathb, 0, strpos($subpathb, '/'));
if (count($segmentsa) == 3 && count($segmentsb) == 3) {
$subpatha = $segmenta[0] . '/' . $segmenta[1];
$subpathb = $segmentb[0] . '/' . $segmentb[1];
$segmenta .= '/' . $segmentsa[1];
$segmentb .= '/' . $segmentsb[1];
}
if (!$segmenta) {
$segmenta = $subpatha;
}
if (!$segmentb) {
$segmentb = $subpathb;
}
$db = Database::connection();
$displayorderA = intval($db->GetOne('select cDisplayOrder from Pages p inner join PagePaths cp on p.cID = cp.cID where cPath = ?', array('/dashboard/' . $segmenta)));
$displayorderB = intval($db->GetOne('select cDisplayOrder from Pages p inner join PagePaths cp on p.cID = cp.cID where cPath = ?', array('/dashboard/' . $segmentb)));
if ($displayorderA > $displayorderB) {
return 1;
} else if ($displayorderA < $displayorderB) {
return -1;
} else {
$displayorderA = intval($db->GetOne('select cDisplayOrder from Pages p inner join PagePaths cp on p.cID = cp.cID where cPath = ?', array('/dashboard/' . $subpatha)));
$displayorderB = intval($db->GetOne('select cDisplayOrder from Pages p inner join PagePaths cp on p.cID = cp.cID where cPath = ?', array('/dashboard/' . $subpathb)));
if ($displayorderA > $displayorderB) {
return 1;
} else if ($displayorderA < $displayorderB) {
return -1;
}
}
}
/**
* @param ConcreteCorePagePage $c
* @return bool
*/
public function contains($c)
{
return in_array($c->getCollectionPath(), $this->items);
}
/**
* @param ConcreteCorePagePage $c
*/
public function add($c)
{
$this->items[] = $c->getCollectionPath();
}
/**
* @param ConcreteCorePagePage $c
*/
public function remove($c)
{
unset($this->items[array_search($c->getCollectionPath(), $this->items)]);
}
/**
* @return DashboardMenu
*/
public static function getMine()
{
$u = new ConcreteUser();
$qn = unserialize($u->config('QUICK_NAV_BOOKMARKS'));
if (is_object($qn)) {
return $qn;
}
$qn = new DashboardMenu();
$qnx = new DefaultDashboardMenu();
$qn->items = $qnx->items;
return $qn;
}
}
class DefaultDashboardMenu extends DashboardMenu
{
/**
* @var array
*/
public $items = array(
'/dashboard/composer/write',
'/dashboard/composer/drafts',
'/dashboard/sitemap/full',
'/dashboard/sitemap/search',
'/dashboard/files/search',
'/dashboard/files/sets',
'/dashboard/reports/statistics',
'/dashboard/reports/forms'
);
}