Changing Username URL in threads
My forum is highly integrated into my website and I want the Username links to go to their website profile independant of Vanilla.
I've managed to do this for people replying to a thread but not for the thread starter. Can anyone help?
For the username of those replying, this worked successfully in forum/applications/vanilla/views/discussion/helper_functions.php:
Replaced:
echo UserPhoto($Author); echo UserAnchor($Author);
With
echo UserPhoto($Author); $AName =$Sender->EventArguments['Author']->Name; echo '<a href="http://www.website.com/'. $AName .'">'. $AName .'</a>';
However, I tried doing the exact same change for the thread starter (located in discussion.php of same directory) but it just made the username not show.
Replaced:
if ($UserPhoto) {
echo UserPhoto($Author);
echo UserAnchor($Author, 'Username');
} else {
echo UserAnchor($Author, 'Username');
echo UserPhoto($Author);
echo FormatMeAction($Discussion);
With:
echo UserPhoto($Author); $AName =$Sender->EventArguments['Author']->Name; echo '<a href="http://www.website.com/'. $AName .'">'. $AName .'</a>';
I'm no coder... please can someone help?
0

Comments
I am a little confused as to what you are trying to achieve. I can tell you that you shouldn't be editing core files.
Assuming you want every profile link to go somewhere else, define a function in your favorite bootstrap file (e.g.
/conf/bootstrap.before.php) that is calledUserUrl. Here is the default definition:/** * Return the url for a user. * @param array|object $User The user to get the url for. * @param string $Px The prefix to apply before fieldnames. @since 2.1 * @param string $Method Optional. ProfileController method to target. * @return string The url suitable to be passed into the Url() function. */ function UserUrl($User, $Px = '', $Method = '', $Get = FALSE) { static $NameUnique = NULL; if ($NameUnique === NULL) $NameUnique = C('Garden.Registration.NameUnique'); $UserName = GetValue($Px.'Name', $User); $UserName = preg_replace('/([\?&]+)/', '', $UserName); $Result = '/profile/'. ($Method ? trim($Method, '/').'/' : ''). ($NameUnique ? '' : GetValue($Px.'UserID', $User, 0).'/'). rawurlencode($UserName); if ($Get) $Result .= '?'.http_build_query($Get); return $Result; }Modify that to return whatever URL you want and this will automatically be used everywhere.
Thanks I've just created a new file /conf/bootstrap.before.php and inside put your code with some dummy url to test:
<? function UserUrl($User, $Px = '', $Method = '', $Get = FALSE) { static $NameUnique = NULL; if ($NameUnique === NULL) $NameUnique = C('Garden.Registration.NameUnique'); $UserName = GetValue($Px.'Name', $User); $UserName = preg_replace('/([\?&]+)/', '', $UserName); $Result = '/asdsadsa/'. ($Method ? trim($Method, '/').'/' : ''). ($NameUnique ? '' : GetValue($Px.'UserID', $User, 0).'/'). rawurlencode($UserName); if ($Get) $Result .= '?'.http_build_query($Get); return $Result; } ?>But the url didn't change
Ok got it sorted. Using what you said, I found someone else mention something similar and this works for me:
<?php if (!defined('APPLICATION')) exit(); function UserUrl($User, $Px = '', $Method = '', $Get = FALSE){ $UserName = GetValue('Name', $User); $Result = 'http://yoursite.com/profile/'.$UserName; if ($Get) $Result .= '?'.http_build_query($Get); return $Result; }Thank you!
That function doesn't appear to replace the URL when someone quotes a username like so @Mark
Can anyone help there?
You would have to install a mentions formatter that would handle the mentions formatting.
This is because the mentions formatting doesn't have access to the user object, just the user reference. This is for scalability reasons, I assume.
Add the following to your
/conf/bootstrap.early.phpfile:<?php if (!defined('APPLICATION')) exit(); Gdn::FactoryInstall('MentionsFormatter', 'CustomMentions', PATH_CONF . '/custommentions.php');Then you need to create a class called CustomMentions in the
/conf/custommentions.phpfile. The class must define aFormatMentionsmethod that accepts a single mixed type argument. E.g.:<?php if (!defined('APPLICATION')) exit(); class CustomMentions { public function FormatMentions($Body) { return preg_replace( '/(^|[\s,\.>])@(\w{1,50})\b/i', //{3,20} '\1'.Anchor('@\2', 'http://example.com/customprofile/\\2'), $Body ); } }Thank you - that worked
The custommentions code is causing an issue where upon creating a new dicussion, it doesn't redirect the user back to the forum but instead just hangs on the same page with following error:
Fatal error: Call to undefined method CustomMentions::GetMentions() in /home/mysite/site/public_html/forum/library/core/functions.general.php on line 1405
Anyone?
Do you still have the
/conf/bootstrap.early.phpfile?Yes, currently has:
<?php if (!defined('APPLICATION')) exit(); Gdn::FactoryInstall('MentionsFormatter', 'CustomMentions', PATH_CONF . '/custommentions.php');Are you using 2.2a? Looks like you need to implement
getMentions.Copy over this:
https://github.com/vanilla/vanilla/blob/master/library/core/class.format.php#L1472-L1503
to a new function called
getMentions($Mixed)in the custommentions.phpI'm using 2.1.9
I tried doing the following in custommentions.php anyway but no luck:
<?php if (!defined('APPLICATION')) exit(); class CustomMentions { public function FormatMentions($Body) { return preg_replace( '/(^|[\s,\.>])@(\w{1,50})\b/i', //{3,20} '\1'.Anchor('@\2', 'http://www.cuddlecomfort.com/\\2'), $Body ); } public function getMentions($Mixed) { // Handle @mentions. if (C('Garden.Format.Mentions')) { $urlFormat = str_replace('{name}', '$2', self::$MentionsUrlFormat); // Unicode includes Numbers, Letters, Marks, & Connector punctuation. $Pattern = (unicodeRegexSupport()) ? '[\pN\pL\pM\pPc]' : '\w'; $Mixed = Gdn_Format::replaceButProtectCodeBlocks( '/(^|[\s,\.>\(])@('.$Pattern.'{1,64})\b/i', //{3,20} '\1'.anchor('@$2', $urlFormat), $Mixed ); } // Handle #hashtag searches if (C('Garden.Format.Hashtags')) { $Mixed = Gdn_Format::replaceButProtectCodeBlocks( '/(^|[\s,\.>])\#([\w\-]+)(?=[\s,\.!?<]|$)/i', '\1'.anchor('#\2', '/search?Search=%23\2&Mode=like').'\3', $Mixed ); } // Handle "/me does x" action statements if (C('Garden.Format.MeActions')) { $Mixed = Gdn_Format::replaceButProtectCodeBlocks( '/(^|[\n])(\/me)(\s[^(\n)]+)/i', '\1'.wrap(wrap('\2', 'span', array('class' => 'MeActionName')).'\3', 'span', array('class' => 'AuthorAction')), $Mixed ); } return $Mixed; } }If you are on 2.1 you need to use this part from the 2.1 source
https://github.com/vanilla/vanilla/blob/release/2.1/library/core/class.format.php#L1167-L1199
Yep that code worked... thank you @Bleistivt
This worked wonders on 2.1 but I don't think I can get it to work on 2.2. Are there any updates? Thanks
thanks all. Here's what I was looking for