public static function link($Path, $Text = false, $Format = null, $Options = array())
{
$Session = Gdn::session();
$Class = val('class', $Options, '');
$WithDomain = val('WithDomain', $Options);
$Target = val('Target', $Options, '');
if ($Target == 'current') {
$Target = trim(url('', true), '/ ');
}
if (is_null($Format)) {
$Format = '<a href="%url" class="%class">%text</a>';
}
switch ($Path) {
case 'activity':
touchValue('Permissions', $Options, 'Garden.Activity.View');
break;
case 'category':
$Breadcrumbs = Gdn::controller()->data('Breadcrumbs');
if (is_array($Breadcrumbs) && count($Breadcrumbs) > 0) {
$Last = array_pop($Breadcrumbs);
$Path = val('Url', $Last);
$DefaultText = val('Name', $Last, T('Back'));
} else {
$Path = '/';
$DefaultText = c('Garden.Title', T('Back'));
}
if (!$Text) {
$Text = $DefaultText;
}
break;
case 'dashboard':
$Path = 'dashboard/settings';
touchValue('Permissions', $Options, array('Garden.Settings.Manage', 'Garden.Settings.View'));
if (!$Text) {
$Text = t('Dashboard');
}
break;
case 'home':
$Path = '/';
if (!$Text) {
$Text = t('Home');
}
break;
case 'inbox':
$Path = 'messages/inbox';
touchValue('Permissions', $Options, 'Garden.SignIn.Allow');
if (!$Text) {
$Text = t('Inbox');
}
if ($Session->isValid() && $Session->User->CountUnreadConversations) {
$Class = trim($Class . ' HasCount');
$Text .= ' <span class="Alert">' . $Session->User->CountUnreadConversations . '</span>';
}
if (!$Session->isValid() || !Gdn::addonManager()->lookupAddon('conversations')) {
$Text = false;
}
break;
case 'forumroot':
$Route = Gdn::router()->getDestination('DefaultForumRoot');
if (is_null($Route)) {
$Path = '/';
} else {
$Path = combinePaths(array('/', $Route));
}
break;
case 'profile':
touchValue('Permissions', $Options, 'Garden.SignIn.Allow');
if (!$Text && $Session->isValid()) {
$Text = $Session->User->Name;
}
if ($Session->isValid() && $Session->User->CountNotifications) {
$Class = trim($Class . ' HasCount');
$Text .= ' <span class="Alert">' . $Session->User->CountNotifications . '</span>';
}
break;
case 'user':
$Path = 'profile';
touchValue('Permissions', $Options, 'Garden.SignIn.Allow');
if (!$Text && $Session->isValid()) {
$Text = $Session->User->Name;
}
break;
case 'photo':
$Path = 'profile';
TouchValue('Permissions', $Options, 'Garden.SignIn.Allow');
if (!$Text && $Session->isValid()) {
$IsFullPath = strtolower(substr($Session->User->Photo, 0, 7)) == 'http://' || strtolower(substr($Session->User->Photo, 0, 8)) == 'https://';
$PhotoUrl = $IsFullPath ? $Session->User->Photo : Gdn_Upload::url(changeBasename($Session->User->Photo, 'n%s'));
$Text = img($PhotoUrl, array('alt' => $Session->User->Name));
}
break;
case 'drafts':
TouchValue('Permissions', $Options, 'Garden.SignIn.Allow');
if (!$Text) {
$Text = t('My Drafts');
}
if ($Session->isValid() && $Session->User->CountDrafts) {
$Class = trim($Class . ' HasCount');
$Text .= ' <span class="Alert">' . $Session->User->CountDrafts . '</span>';
}
break;
case 'discussions/bookmarked':
TouchValue('Permissions', $Options, 'Garden.SignIn.Allow');
if (!$Text) {
$Text = t('My Bookmarks');
}
if ($Session->isValid() && $Session->User->CountBookmarks) {
$Class = trim($Class . ' HasCount');
$Text .= ' <span class="Count">' . $Session->User->CountBookmarks . '</span>';
}
break;
case 'discussions/mine':
TouchValue('Permissions', $Options, 'Garden.SignIn.Allow');
if (!$Text) {
$Text = t('My Discussions');
}
if ($Session->isValid() && $Session->User->CountDiscussions) {
$Class = trim($Class . ' HasCount');
$Text .= ' <span class="Count">' . $Session->User->CountDiscussions . '</span>';
}
break;
case 'register':
if (!$Text) {
$Text = t('Register');
}
$Path = registerUrl($Target);
break;
case 'signin':
case 'signinout':
// The destination is the signin/signout toggle link.
if ($Session->isValid()) {
if (!$Text) {
$Text = T('Sign Out');
}
$Path = signOutUrl($Target);
$Class = concatSep(' ', $Class, 'SignOut');
} else {
if (!$Text) {
$Text = t('Sign In');
}
$Path = signInUrl($Target);
if (signInPopup() && strpos(Gdn::Request()->Url(), 'entry') === false) {
$Class = concatSep(' ', $Class, 'SignInPopup');
}
}
break;
}
if ($Text == false && strpos($Format, '%text') !== false) {
return '';
}
if (val('Permissions', $Options) && !$Session->checkPermission($Options['Permissions'], false)) {
return '';
}
$Url = Gdn::request()->url($Path, $WithDomain);
if ($TK = val('TK', $Options)) {
if (in_array($TK, array(1, 'true'))) {
$TK = 'TransientKey';
}
$Url .= (strpos($Url, '?') === false ? '?' : '&') . $TK . '=' . urlencode(Gdn::session()->transientKey());
}
if (strcasecmp(trim($Path, '/'), Gdn::request()->path()) == 0) {
$Class = concatSep(' ', $Class, 'Selected');
}
// Build the final result.
$Result = $Format;
$Result = str_replace('%url', $Url, $Result);
$Result = str_replace('%text', $Text, $Result);
$Result = str_replace('%class', $Class, $Result);
return $Result;
}