
<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://www.haabestpractices.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WikiSysop</id>
	<title>HAA Best Practices Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="http://www.haabestpractices.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=WikiSysop"/>
	<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php/Special:Contributions/WikiSysop"/>
	<updated>2026-05-03T14:01:53Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2599</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2599"/>
		<updated>2025-09-08T16:46:03Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This list is complete.  You do not need to look at the prior list of hacks.  It also works for Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\plugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\templates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\templates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add keywords to the Community Builder reports===&lt;br /&gt;
&lt;br /&gt;
// WHB Hack&lt;br /&gt;
        // We modify the filter depending on keywords included in the filter&lt;br /&gt;
        // This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
        // The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
        // use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
        $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
        $_CB_database-&amp;gt;query();&lt;br /&gt;
        $haaparams = $_CB_database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
        if ($haaparams != NULL)&lt;br /&gt;
        {&lt;br /&gt;
            preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
            $actyear = (string)$arrYear[1];&lt;br /&gt;
            if (strlen($actyear) == 1 || strlen($actyear) == 0)&lt;br /&gt;
                {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
            $prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
            if (strlen($prioryear) == 1 || $prioryear == &amp;quot;-5&amp;quot;)&lt;br /&gt;
                {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterBy))&lt;br /&gt;
        {&lt;br /&gt;
            $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
            $HaaFilter = $filterBy;&lt;br /&gt;
            $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
            $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` in (&#039;1&#039;, &#039;2&#039;))&amp;quot;, $HaaFilter);&lt;br /&gt;
            $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
            $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
            $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
            $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
            $filterBy = $HaaFilter;&lt;br /&gt;
        }        &lt;br /&gt;
        // END WHB Hack&lt;br /&gt;
&lt;br /&gt;
===Include dummy users in the reunion reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
// We need to change $tablesWhereSQL[gid] from ...AND g.`group.id` = 2 to ...AND g.`group.id` &amp;lt; 3&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
   $tablesWhereSQL[&#039;gid&#039;] = str_replace(&#039;`group_id` = 2&#039;, &#039;`group_id` in (1, 2)&#039;, $tablesWhereSQL[&#039;gid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
// We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
// We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
$whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
if (!$whbIncludeAdmin){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(u.username != &#039;admin&#039; &amp;amp;&amp;amp; u.username != &#039;CabinBoy&#039;)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(ue.cb_dummyregistrant OR (g.group_id = 2))&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code belongs in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It goes right before the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$_PLUGINS-&amp;gt;trigger( &#039;onBeforeUsersListBuildQuery&#039;, array( &amp;amp;$tablesSQL, &amp;amp;$joinsSQL, &amp;amp;$tablesWhereSQL ) );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of tche user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Supress versioning on the personal.css page===&lt;br /&gt;
&lt;br /&gt;
In the file joomla/libraries/src/HTML/HTMLHelper.php add the following at line 660 right&lt;br /&gt;
before $document-&amp;gt;addStyleSheet...&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    WHB HACK&lt;br /&gt;
*/&lt;br /&gt;
    if (strpos($include, &#039;personal&#039;)){&lt;br /&gt;
        $options[&#039;version&#039;] = false;   &lt;br /&gt;
    }&lt;br /&gt;
//END WHB HACK //&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2598</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2598"/>
		<updated>2025-09-08T16:42:10Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Add keywords to the Community Builder reports */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This list is complete.  You do not need to look at the prior list of hacks.  It also works for Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\plugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\templates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\templates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add keywords to the Community Builder reports===&lt;br /&gt;
&lt;br /&gt;
// WHB Hack&lt;br /&gt;
        // We modify the filter depending on keywords included in the filter&lt;br /&gt;
        // This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
        // The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
        // use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
        $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
        $_CB_database-&amp;gt;query();&lt;br /&gt;
        $haaparams = $_CB_database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
        if ($haaparams != NULL); then&lt;br /&gt;
        {&lt;br /&gt;
            preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
            $actyear = (string)$arrYear[1];&lt;br /&gt;
            if (strlen($actyear) == 1 || strlen($actyear) == 0)&lt;br /&gt;
                {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
            $prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
            if (strlen($prioryear) == 1 || $prioryear == &amp;quot;-5&amp;quot;)&lt;br /&gt;
                {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterBy))&lt;br /&gt;
        {&lt;br /&gt;
            $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
            $HaaFilter = $filterBy;&lt;br /&gt;
            $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
            $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` in (&#039;1&#039;, &#039;2&#039;))&amp;quot;, $HaaFilter);&lt;br /&gt;
            $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
            $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
            $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
            $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
            $filterBy = $HaaFilter;&lt;br /&gt;
        }        &lt;br /&gt;
        // END WHB Hack&lt;br /&gt;
&lt;br /&gt;
===Include dummy users in the reunion reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
// We need to change $tablesWhereSQL[gid] from ...AND g.`group.id` = 2 to ...AND g.`group.id` &amp;lt; 3&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
   $tablesWhereSQL[&#039;gid&#039;] = str_replace(&#039;`group_id` = 2&#039;, &#039;`group_id` in (1, 2)&#039;, $tablesWhereSQL[&#039;gid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
// We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
// We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
$whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
if (!$whbIncludeAdmin){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(u.username != &#039;admin&#039; &amp;amp;&amp;amp; u.username != &#039;CabinBoy&#039;)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(ue.cb_dummyregistrant OR (g.group_id = 2))&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code belongs in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It goes right before the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$_PLUGINS-&amp;gt;trigger( &#039;onBeforeUsersListBuildQuery&#039;, array( &amp;amp;$tablesSQL, &amp;amp;$joinsSQL, &amp;amp;$tablesWhereSQL ) );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of tche user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Supress versioning on the personal.css page===&lt;br /&gt;
&lt;br /&gt;
In the file joomla/libraries/src/HTML/HTMLHelper.php add the following at line 660 right&lt;br /&gt;
before $document-&amp;gt;addStyleSheet...&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    WHB HACK&lt;br /&gt;
*/&lt;br /&gt;
    if (strpos($include, &#039;personal&#039;)){&lt;br /&gt;
        $options[&#039;version&#039;] = false;   &lt;br /&gt;
    }&lt;br /&gt;
//END WHB HACK //&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2597</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2597"/>
		<updated>2025-09-07T19:18:23Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This list is complete.  You do not need to look at the prior list of hacks.  It also works for Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\plugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\templates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\templates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add keywords to the Community Builder reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$_CB_database-&amp;gt;query();&lt;br /&gt;
$haaparams = $_CB_database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterBy))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterBy;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` in (&#039;1&#039;, &#039;2&#039;))&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterBy = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It belongs immediately before the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
return $filterBy;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Include dummy users in the reunion reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
// We need to change $tablesWhereSQL[gid] from ...AND g.`group.id` = 2 to ...AND g.`group.id` &amp;lt; 3&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
   $tablesWhereSQL[&#039;gid&#039;] = str_replace(&#039;`group_id` = 2&#039;, &#039;`group_id` in (1, 2)&#039;, $tablesWhereSQL[&#039;gid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
// We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
// We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
$whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
if (!$whbIncludeAdmin){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(u.username != &#039;admin&#039; &amp;amp;&amp;amp; u.username != &#039;CabinBoy&#039;)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(ue.cb_dummyregistrant OR (g.group_id = 2))&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code belongs in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It goes right before the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$_PLUGINS-&amp;gt;trigger( &#039;onBeforeUsersListBuildQuery&#039;, array( &amp;amp;$tablesSQL, &amp;amp;$joinsSQL, &amp;amp;$tablesWhereSQL ) );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of tche user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Supress versioning on the personal.css page===&lt;br /&gt;
&lt;br /&gt;
In the file joomla/libraries/src/HTML/HTMLHelper.php add the following at line 660 right&lt;br /&gt;
before $document-&amp;gt;addStyleSheet...&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    WHB HACK&lt;br /&gt;
*/&lt;br /&gt;
    if (strpos($include, &#039;personal&#039;)){&lt;br /&gt;
        $options[&#039;version&#039;] = false;   &lt;br /&gt;
    }&lt;br /&gt;
//END WHB HACK //&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2596</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2596"/>
		<updated>2025-09-07T18:36:15Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
None of these hacks are required in Joomla 5.0.  See separate page for list of required changes.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED in Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0 - Have dropped integration of PHPList with Joomla&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2595</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2595"/>
		<updated>2025-09-07T18:35:22Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Joomla */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED in Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0 - Have dropped integration of PHPList with Joomla&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2594</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2594"/>
		<updated>2025-09-07T18:34:47Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Nicetalk */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED in Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0 - Have dropped integration of PHPList with Joomla&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2593</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2593"/>
		<updated>2025-09-07T18:34:32Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Supressed sending of blank email */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED in Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0 - Have dropped integration of PHPList with Joomla&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2592</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2592"/>
		<updated>2025-09-07T18:33:29Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Fixed problem in Javascript in file */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED in Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0 - Have dropped integration of PHPList with Joomla&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2591</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2591"/>
		<updated>2025-09-07T18:31:59Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Modified to recognize special list selection keywords */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED in Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0 - Have dropped integration of PHPList with Joomla&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2590</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2590"/>
		<updated>2025-09-07T18:29:57Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Added code to support a summary version of the Reunion Attendees list */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED in Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2589</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2589"/>
		<updated>2025-09-07T18:29:24Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Modify the reunion attendees list to include non-user reunion attendees */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED in Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2588</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2588"/>
		<updated>2025-09-07T18:28:47Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Added lastname to the list of fields that can be searched even though not on the profile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED in Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2587</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2587"/>
		<updated>2025-09-07T18:28:08Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Suppress certain icons during edit of user profile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED in Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== &lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2586</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2586"/>
		<updated>2025-09-07T18:27:09Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Suppress certain icons during edit of user profile */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED in Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2585</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2585"/>
		<updated>2025-09-07T18:26:45Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Increased font size in textareas */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED in Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2584</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2584"/>
		<updated>2025-09-07T18:26:10Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Fix problem with menus blinking when you hover */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED in Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2583</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2583"/>
		<updated>2025-09-07T18:25:24Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Change the size of the banner image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2582</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2582"/>
		<updated>2025-09-07T18:24:52Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Fix problem with table width in articles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
NOT REQUIRED IN Joomla 5.0&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2580</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2580"/>
		<updated>2021-09-07T15:34:42Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Include dummy users in the reunion reports */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\plugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\templates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\templates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add keywords to the Community Builder reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$_CB_database-&amp;gt;query();&lt;br /&gt;
$haaparams = $_CB_database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterBy))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterBy;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` in (&#039;1&#039;, &#039;2&#039;))&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterBy = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It belongs immediately before the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
return $filterBy;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Include dummy users in the reunion reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
// We need to change $tablesWhereSQL[gid] from ...AND g.`group.id` = 2 to ...AND g.`group.id` &amp;lt; 3&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
   $tablesWhereSQL[&#039;gid&#039;] = str_replace(&#039;`group_id` = 2&#039;, &#039;`group_id` in (1, 2)&#039;, $tablesWhereSQL[&#039;gid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
// We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
// We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
$whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
if (!$whbIncludeAdmin){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(u.username != &#039;admin&#039; &amp;amp;&amp;amp; u.username != &#039;CabinBoy&#039;)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(ue.cb_dummyregistrant OR (g.group_id = 2))&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code belongs in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It goes right before the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$_PLUGINS-&amp;gt;trigger( &#039;onBeforeUsersListBuildQuery&#039;, array( &amp;amp;$tablesSQL, &amp;amp;$joinsSQL, &amp;amp;$tablesWhereSQL ) );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of tche user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Supress versioning on the personal.css page===&lt;br /&gt;
&lt;br /&gt;
In the file joomla/libraries/src/HTML/HTMLHelper.php add the following at line 660 right&lt;br /&gt;
before $document-&amp;gt;addStyleSheet...&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    WHB HACK&lt;br /&gt;
*/&lt;br /&gt;
    if (strpos($include, &#039;personal&#039;)){&lt;br /&gt;
        $options[&#039;version&#039;] = false;   &lt;br /&gt;
    }&lt;br /&gt;
//END WHB HACK //&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2579</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2579"/>
		<updated>2021-09-06T19:02:22Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Supress versioning on the personal.css page */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\plugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\templates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\templates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add keywords to the Community Builder reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$_CB_database-&amp;gt;query();&lt;br /&gt;
$haaparams = $_CB_database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterBy))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterBy;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` in (&#039;1&#039;, &#039;2&#039;))&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterBy = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It belongs immediately before the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
return $filterBy;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Include dummy users in the reunion reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
// We need to change $tablesWhereSQL[gid] from ...AND g.`group.id` = 2 to ...AND g.`group.id` &amp;lt; 3&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
   $tablesWhereSQL[&#039;gid&#039;] = str_replace(&#039;`group_id` = 2&#039;, &#039;`group_id` in (1, 2)&#039;, $tablesWhereSQL[&#039;gid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
// We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
// We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
$whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
if (!$whbIncludeAdmin){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(ue.cb_dummyregistrant OR (g.group_id = 2))&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code belongs in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It goes right before the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$_PLUGINS-&amp;gt;trigger( &#039;onBeforeUsersListBuildQuery&#039;, array( &amp;amp;$tablesSQL, &amp;amp;$joinsSQL, &amp;amp;$tablesWhereSQL ) );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of tche user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Supress versioning on the personal.css page===&lt;br /&gt;
&lt;br /&gt;
In the file joomla/libraries/src/HTML/HTMLHelper.php add the following at line 660 right&lt;br /&gt;
before $document-&amp;gt;addStyleSheet...&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    WHB HACK&lt;br /&gt;
*/&lt;br /&gt;
    if (strpos($include, &#039;personal&#039;)){&lt;br /&gt;
        $options[&#039;version&#039;] = false;   &lt;br /&gt;
    }&lt;br /&gt;
//END WHB HACK //&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2578</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2578"/>
		<updated>2021-09-02T18:43:01Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* For the reunion reports we want to include dummy registrants and avoid profile links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\plugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\templates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\templates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add keywords to the Community Builder reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$_CB_database-&amp;gt;query();&lt;br /&gt;
$haaparams = $_CB_database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterBy))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterBy;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` in (&#039;1&#039;, &#039;2&#039;))&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterBy = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It belongs immediately before the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
return $filterBy;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Include dummy users in the reunion reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
// We need to change $tablesWhereSQL[gid] from ...AND g.`group.id` = 2 to ...AND g.`group.id` &amp;lt; 3&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
   $tablesWhereSQL[&#039;gid&#039;] = str_replace(&#039;`group_id` = 2&#039;, &#039;`group_id` in (1, 2)&#039;, $tablesWhereSQL[&#039;gid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
// We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
// We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
$whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
if (!$whbIncludeAdmin){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(ue.cb_dummyregistrant OR (g.group_id = 2))&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code belongs in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It goes right before the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$_PLUGINS-&amp;gt;trigger( &#039;onBeforeUsersListBuildQuery&#039;, array( &amp;amp;$tablesSQL, &amp;amp;$joinsSQL, &amp;amp;$tablesWhereSQL ) );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of tche user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Supress versioning on the personal.css page===&lt;br /&gt;
&lt;br /&gt;
In the file joomla/libraries/src/HTML/HTMLHelper.php add the following at line 660 right&lt;br /&gt;
before $document-&amp;gt;addStyleSheet...&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    WHB HACK&lt;br /&gt;
*/&lt;br /&gt;
    if (strpos($include, &#039;personal&#039;)){&lt;br /&gt;
        $options[&#039;version&#039;] = false;   &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2577</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2577"/>
		<updated>2021-09-02T18:42:47Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* For summary reunion attendees report we want users to run across the line */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\plugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\templates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add keywords to the Community Builder reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$_CB_database-&amp;gt;query();&lt;br /&gt;
$haaparams = $_CB_database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterBy))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterBy;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` in (&#039;1&#039;, &#039;2&#039;))&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterBy = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It belongs immediately before the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
return $filterBy;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Include dummy users in the reunion reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
// We need to change $tablesWhereSQL[gid] from ...AND g.`group.id` = 2 to ...AND g.`group.id` &amp;lt; 3&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
   $tablesWhereSQL[&#039;gid&#039;] = str_replace(&#039;`group_id` = 2&#039;, &#039;`group_id` in (1, 2)&#039;, $tablesWhereSQL[&#039;gid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
// We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
// We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
$whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
if (!$whbIncludeAdmin){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(ue.cb_dummyregistrant OR (g.group_id = 2))&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code belongs in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It goes right before the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$_PLUGINS-&amp;gt;trigger( &#039;onBeforeUsersListBuildQuery&#039;, array( &amp;amp;$tablesSQL, &amp;amp;$joinsSQL, &amp;amp;$tablesWhereSQL ) );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of tche user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Supress versioning on the personal.css page===&lt;br /&gt;
&lt;br /&gt;
In the file joomla/libraries/src/HTML/HTMLHelper.php add the following at line 660 right&lt;br /&gt;
before $document-&amp;gt;addStyleSheet...&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    WHB HACK&lt;br /&gt;
*/&lt;br /&gt;
    if (strpos($include, &#039;personal&#039;)){&lt;br /&gt;
        $options[&#039;version&#039;] = false;   &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2576</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2576"/>
		<updated>2021-09-02T18:41:01Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Suppress full name of the site in the user lists where not all users are shown */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\plugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add keywords to the Community Builder reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$_CB_database-&amp;gt;query();&lt;br /&gt;
$haaparams = $_CB_database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterBy))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterBy;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` in (&#039;1&#039;, &#039;2&#039;))&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterBy = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It belongs immediately before the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
return $filterBy;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Include dummy users in the reunion reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
// We need to change $tablesWhereSQL[gid] from ...AND g.`group.id` = 2 to ...AND g.`group.id` &amp;lt; 3&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
   $tablesWhereSQL[&#039;gid&#039;] = str_replace(&#039;`group_id` = 2&#039;, &#039;`group_id` in (1, 2)&#039;, $tablesWhereSQL[&#039;gid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
// We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
// We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
$whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
if (!$whbIncludeAdmin){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(ue.cb_dummyregistrant OR (g.group_id = 2))&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code belongs in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It goes right before the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$_PLUGINS-&amp;gt;trigger( &#039;onBeforeUsersListBuildQuery&#039;, array( &amp;amp;$tablesSQL, &amp;amp;$joinsSQL, &amp;amp;$tablesWhereSQL ) );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of tche user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Supress versioning on the personal.css page===&lt;br /&gt;
&lt;br /&gt;
In the file joomla/libraries/src/HTML/HTMLHelper.php add the following at line 660 right&lt;br /&gt;
before $document-&amp;gt;addStyleSheet...&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    WHB HACK&lt;br /&gt;
*/&lt;br /&gt;
    if (strpos($include, &#039;personal&#039;)){&lt;br /&gt;
        $options[&#039;version&#039;] = false;   &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2575</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2575"/>
		<updated>2021-09-02T15:45:35Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\lugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add keywords to the Community Builder reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$_CB_database-&amp;gt;query();&lt;br /&gt;
$haaparams = $_CB_database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterBy))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterBy;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` in (&#039;1&#039;, &#039;2&#039;))&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterBy = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It belongs immediately before the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
return $filterBy;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Include dummy users in the reunion reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
// We need to change $tablesWhereSQL[gid] from ...AND g.`group.id` = 2 to ...AND g.`group.id` &amp;lt; 3&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
   $tablesWhereSQL[&#039;gid&#039;] = str_replace(&#039;`group_id` = 2&#039;, &#039;`group_id` in (1, 2)&#039;, $tablesWhereSQL[&#039;gid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
// We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
// We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
$whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
if (!$whbIncludeAdmin){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(ue.cb_dummyregistrant OR (g.group_id = 2))&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code belongs in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It goes right before the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$_PLUGINS-&amp;gt;trigger( &#039;onBeforeUsersListBuildQuery&#039;, array( &amp;amp;$tablesSQL, &amp;amp;$joinsSQL, &amp;amp;$tablesWhereSQL ) );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of tche user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Supress versioning on the personal.css page===&lt;br /&gt;
&lt;br /&gt;
In the file joomla/libraries/src/HTML/HTMLHelper.php add the following at line 660 right&lt;br /&gt;
before $document-&amp;gt;addStyleSheet...&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    WHB HACK&lt;br /&gt;
*/&lt;br /&gt;
    if (strpos($include, &#039;personal&#039;)){&lt;br /&gt;
        $options[&#039;version&#039;] = false;   &lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2574</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2574"/>
		<updated>2021-09-02T15:44:42Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\lugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add keywords to the Community Builder reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$_CB_database-&amp;gt;query();&lt;br /&gt;
$haaparams = $_CB_database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterBy))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterBy;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` in (&#039;1&#039;, &#039;2&#039;))&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterBy = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It belongs immediately before the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
return $filterBy;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Include dummy users in the reunion reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
// We need to change $tablesWhereSQL[gid] from ...AND g.`group.id` = 2 to ...AND g.`group.id` &amp;lt; 3&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
   $tablesWhereSQL[&#039;gid&#039;] = str_replace(&#039;`group_id` = 2&#039;, &#039;`group_id` in (1, 2)&#039;, $tablesWhereSQL[&#039;gid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
// We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
// We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
$whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
if (!$whbIncludeAdmin){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(ue.cb_dummyregistrant OR (g.group_id = 2))&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code belongs in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It goes right before the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$_PLUGINS-&amp;gt;trigger( &#039;onBeforeUsersListBuildQuery&#039;, array( &amp;amp;$tablesSQL, &amp;amp;$joinsSQL, &amp;amp;$tablesWhereSQL ) );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of tche user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Supress versioning on the personal.css page===&lt;br /&gt;
&lt;br /&gt;
In the file joomla/libraries/src/HTML/HTMLHelper.php add the following at line 660 right&lt;br /&gt;
before $document-&amp;gt;addStyleSheet...&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
    WHB HACK&lt;br /&gt;
*/&lt;br /&gt;
    if (strpos($include, &#039;personal&#039;)){&lt;br /&gt;
        $options[&#039;version&#039;] = false;   &lt;br /&gt;
    }&lt;br /&gt;
/PRE&amp;gt;&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2573</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2573"/>
		<updated>2021-08-11T19:19:35Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\lugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add keywords to the Community Builder reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$_CB_database-&amp;gt;query();&lt;br /&gt;
$haaparams = $_CB_database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterBy))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterBy;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` in (&#039;1&#039;, &#039;2&#039;))&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterBy = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It belongs immediately before the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
return $filterBy;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Include dummy users in the reunion reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
// We need to change $tablesWhereSQL[gid] from ...AND g.`group.id` = 2 to ...AND g.`group.id` &amp;lt; 3&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
   $tablesWhereSQL[&#039;gid&#039;] = str_replace(&#039;`group_id` = 2&#039;, &#039;`group_id` in (1, 2)&#039;, $tablesWhereSQL[&#039;gid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
// We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
// We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
$whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
if (!$whbIncludeAdmin){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(ue.cb_dummyregistrant OR (g.group_id = 2))&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code belongs in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It goes right before the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$_PLUGINS-&amp;gt;trigger( &#039;onBeforeUsersListBuildQuery&#039;, array( &amp;amp;$tablesSQL, &amp;amp;$joinsSQL, &amp;amp;$tablesWhereSQL ) );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2572</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2572"/>
		<updated>2021-08-11T19:19:02Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\lugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add keywords to the Community Builder reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$_CB_database-&amp;gt;query();&lt;br /&gt;
$haaparams = $_CB_database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterBy))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterBy;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` in (&#039;1&#039;, &#039;2&#039;))&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterBy = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It belongs immediately before the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
return $filterBy;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Include dummy users in the reunion reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
// We need to change $tablesWhereSQL[gid] from ...AND g.`group.id` = 2 to ...AND g.`group.id` &amp;lt; 3&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
   $tablesWhereSQL[&#039;gid&#039;] = str_replace(&#039;`group_id` = 2&#039;, &#039;`group_id` in (1, 2)&#039;, $tablesWhereSQL[&#039;gid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
// We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
// We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
$whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
if (!$whbIncludeAdmin){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(ue.cb_dummyregistrant OR (g.group_id = 2))&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code belongs in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It goes right before the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$_PLUGINS-&amp;gt;trigger( &#039;onBeforeUsersListBuildQuery&#039;, array( &amp;amp;$tablesSQL, &amp;amp;$joinsSQL, &amp;amp;$tablesWhereSQL ) );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2571</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2571"/>
		<updated>2021-08-11T19:11:34Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Include dummy users in the reunion reports */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\lugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add keywords to the Community Builder reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$_CB_database-&amp;gt;query();&lt;br /&gt;
$haaparams = $_CB_database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterBy))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterBy;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` in (&#039;1&#039;, &#039;2&#039;))&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterBy = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It belongs immediately before the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
return $filterBy;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Include dummy users in the reunion reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
// We need to change $tablesWhereSQL[gid] from ...AND g.`group.id` = 2 to ...AND g.`group.id` &amp;lt; 3&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
   $tablesWhereSQL[&#039;gid&#039;] = str_replace(&#039;`group_id` = 2&#039;, &#039;`group_id` in (1, 2)&#039;, $tablesWhereSQL[&#039;gid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
// We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
// We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
$whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
if (!$whbIncludeAdmin){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(ue.cb_dummyregistrant OR (g.group_id = 2))&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code belongs in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It goes right before the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$_PLUGINS-&amp;gt;trigger( &#039;onBeforeUsersListBuildQuery&#039;, array( &amp;amp;$tablesSQL, &amp;amp;$joinsSQL, &amp;amp;$tablesWhereSQL ) );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2570</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2570"/>
		<updated>2021-08-11T19:10:53Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Community Builder */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\lugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add keywords to the Community Builder reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$_CB_database-&amp;gt;query();&lt;br /&gt;
$haaparams = $_CB_database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterBy))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterBy;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` in (&#039;1&#039;, &#039;2&#039;))&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterBy = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It belongs immediately before the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
return $filterBy;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Include dummy users in the reunion reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
   $tablesWhereSQL[&#039;gid&#039;] = str_replace(&#039;`group_id` = 2&#039;, &#039;`group_id` in (1, 2)&#039;, $tablesWhereSQL[&#039;gid&#039;]);&lt;br /&gt;
}&lt;br /&gt;
// We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
// We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
$whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
if (!$whbIncludeAdmin){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
       $tablesWhereSQL[] = &amp;quot;(ue.cb_dummyregistrant OR (g.group_id = 2))&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code belongs in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It goes right before the line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$_PLUGINS-&amp;gt;trigger( &#039;onBeforeUsersListBuildQuery&#039;, array( &amp;amp;$tablesSQL, &amp;amp;$joinsSQL, &amp;amp;$tablesWhereSQL ) );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2569</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2569"/>
		<updated>2021-08-11T19:00:10Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\lugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Add keywords to the Community Builder reports===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$_CB_database-&amp;gt;query();&lt;br /&gt;
$haaparams = $_CB_database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterBy))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterBy;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` in (&#039;1&#039;, &#039;2&#039;))&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterBy = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \libraries\CBLib\CB\Legacy\cbUsersList.php.  It belongs immediately before the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
return $filterBy;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2568</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2568"/>
		<updated>2021-08-11T18:54:24Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\lugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For the reunion reports we want to include dummy registrants and avoid profile links===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex &amp;lt; 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;a.*?&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
        $cellContent = preg_replace(&#039;#&amp;lt;/a&amp;gt;#&#039;, &#039;&#039;, $cellContent, 1);&lt;br /&gt;
    }&lt;br /&gt;
    if ($this-&amp;gt;users[$userIndex]-&amp;gt;cb_dummyregistrant == 1 &amp;amp;&amp;amp; $columnIndex == 2){&lt;br /&gt;
        // Strip the link from $cellContent&lt;br /&gt;
        $cellContent = preg_replace(&#039;#-#&#039;, &#039;&#039;, &#039;Registered&#039;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$cellContent = $this-&amp;gt;_getUserListCell( $this-&amp;gt;tableContent[$userIndex][$columnIndex] );&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reappears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2567</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2567"/>
		<updated>2021-08-11T18:49:57Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* For summary reunion attendees report we want users to run across the line */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\lugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
     // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
     if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
           $userIndex++;&lt;br /&gt;
     }&lt;br /&gt;
     $whbUserIndex = $userIndex;&lt;br /&gt;
     $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
     if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
            break;&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
 This code goes right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
foreach ( $this-&amp;gt;columns as $columnIndex =&amp;gt; $column ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2566</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2566"/>
		<updated>2021-08-11T18:47:42Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\lugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we want users to run across the line===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
                    if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                         // For the summary report we want to run the names across three cells, using up three rows in the process&lt;br /&gt;
                         if ($columnIndex == 1 || $columnIndex == 2) {&lt;br /&gt;
                             $userIndex++;&lt;br /&gt;
                         }&lt;br /&gt;
                         $whbUserIndex = $userIndex;&lt;br /&gt;
                         $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                         if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                             break;&lt;br /&gt;
                         }&lt;br /&gt;
                    }&lt;br /&gt;
// END WHB HACK&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2565</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2565"/>
		<updated>2021-08-11T18:45:56Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\lugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2564</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2564"/>
		<updated>2021-08-11T18:45:27Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\lugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===For summary reunion attendees report we are monkeying with the user index inside a for loop==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We are manipulating $userIndex for the summary report and must override it&lt;br /&gt;
            if (false !== stripos($this-&amp;gt;listTitleHtml, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
                if (isset($whbUserIndex)){&lt;br /&gt;
                    $whbIx = $whbUserIndex - $userIndex;&lt;br /&gt;
                    while($whbIx &amp;gt;= 0){&lt;br /&gt;
                        $userIndex ++;&lt;br /&gt;
                        $whbIx --;&lt;br /&gt;
                    }&lt;br /&gt;
                    // Need to break our of the foreach if the $userIndex is above the number of users&lt;br /&gt;
                    $whbUserCount = sizeof($this-&amp;gt;users);&lt;br /&gt;
                    if ($whbUserCount &amp;lt;= $userIndex){&lt;br /&gt;
                        break;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This code goes in \components\com_comprofiler\plugin\tempates\default\default.php.  It belongs right after the line:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
if ( is_array( $this-&amp;gt;users ) &amp;amp;&amp;amp; ( count( $this-&amp;gt;users ) &amp;gt; 0 ) ) foreach ( $this-&amp;gt;users as $userIndex =&amp;gt; $user ) {&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2563</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2563"/>
		<updated>2021-08-11T18:41:05Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Strip pointer to profile for dummy users */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress full name of the site in the user lists where not all users are shown===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\lugin\templates\default\default.php&lt;br /&gt;
&lt;br /&gt;
This code goes in class CBListView_html_default, function _renderHead after first assignment of $return&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
//WHB Hack&lt;br /&gt;
if(strcmp($this-&amp;gt;listTitleHtml, &amp;quot;All users&amp;quot;))&lt;br /&gt;
    $this-&amp;gt;totalIsAllUsers = false;&lt;br /&gt;
//End WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2562</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2562"/>
		<updated>2021-08-11T18:37:56Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Strip pointer to profile for dummy users */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.html.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2561</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2561"/>
		<updated>2021-08-11T18:37:22Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Community Builder */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.heml.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
	foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js .= &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2560</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2560"/>
		<updated>2021-08-11T18:36:04Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Community Builder */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Strip pointer to profile for dummy users===&lt;br /&gt;
&lt;br /&gt;
In components\com_comprofiler\comprofiler.heml.php Add:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack            &lt;br /&gt;
			foreach( $users as $user ) {&lt;br /&gt;
                if (!$user-&amp;gt;cb_dummyregistrant){&lt;br /&gt;
                                $js             .=    &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                                $js             .=    &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( &amp;quot;./notUser.html&amp;quot;) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
// ORIGINAL CODE:&lt;br /&gt;
//            foreach( $users as $user ) {&lt;br /&gt;
//                                $js             .=    &amp;quot;cbUserURLs[&amp;quot; . (int) $user-&amp;gt;id . &amp;quot;] = &#039;&amp;quot; . addslashes( $_CB_framework-&amp;gt;userProfileUrl( (int) $user-&amp;gt;id, false ) ) . &amp;quot;&#039;;&amp;quot;;&lt;br /&gt;
//            }&lt;br /&gt;
// END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2559</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2559"/>
		<updated>2021-08-11T18:33:49Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Community Builder */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2558</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2558"/>
		<updated>2021-08-11T18:31:02Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2557</id>
		<title>Joomla and Extensions Hacks Joomla 3.0</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks_Joomla_3.0&amp;diff=2557"/>
		<updated>2021-08-11T18:29:54Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: Created page with &amp;quot;==Lavinya6 Template== No need for any of this in Joomla 3.0  ===Fix problem with table width in articles===  The original template enclosed article content in a table with a s...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Master_Template_for_Class_Web_Sites&amp;diff=2556</id>
		<title>Master Template for Class Web Sites</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Master_Template_for_Class_Web_Sites&amp;diff=2556"/>
		<updated>2021-08-11T18:29:45Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Setting up from Scratch - No Template */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction to the Template==&lt;br /&gt;
&lt;br /&gt;
We are pleased to announce the availability of a new master template for creating class web sites.  This template is based on the Joomla Content management system used successfully by the classes of [http://harvard1972.org 1972] and [http://hr69.org/ 1969].   All of the software used in this template is open-source and most of it is free.&lt;br /&gt;
&lt;br /&gt;
You can see what the template looks like before it is customized for your class at [http://www.hrtemplate.org www.hrtemplate.org]. (You can log in using user name &#039;TestUser&#039; and password &#039;letmein&#039;). &lt;br /&gt;
[[Key features|We describe key features and benefits here.]]&lt;br /&gt;
&lt;br /&gt;
You can install and run this template on your own server, or you can use one of several inexpensive hosting companies who specialize in hosting Joomla sites.  [http://joomla-hosting-directory.com/ Here] is a Web page that lists some of the hosting companies.  &lt;br /&gt;
&lt;br /&gt;
If you would like to pursue using this template, you can email [mailto:bill@spillthebeans.org Bill Bean] or call him at 617-864-6813.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The rest of this page (and subsidiary pages) is documentation of the template.  In order to use the system effectively and to understand the documentation you will need to absorb a certain amount of jargon.  We&#039;ll try to make it as painless as possible.&lt;br /&gt;
&lt;br /&gt;
==Joomla 1.6/1.7/2.5==&lt;br /&gt;
 &lt;br /&gt;
The template was originally written to run on on Joomla 1.5.  Recently, a new version 1.6 (and even more recently 1.7) of Joomla has been released.  The new versions have major differences from 1.5 and many of the programs that we use had to be modified to run in 1.6/1.7  This work is complete and as of October 2011 we are in the process of upgrading the individual sites.&lt;br /&gt;
&lt;br /&gt;
As of 12/12 all of the sites are using Joomla 2.5.&lt;br /&gt;
&lt;br /&gt;
==Introduction to Joomla==&lt;br /&gt;
&lt;br /&gt;
Joomla is a free, open-source, extensible content manager.  A content manager is a program that you install on a Web server that allows you to easily create a Web site and to manage the content that appears on the site.  That is the core function of Joomla.  The rest of those adjectives mean that you can use it without charge; you are free to modify it to suit your own needs; and that the basic system can be extended by adding other, independently developed modules to it.&lt;br /&gt;
&lt;br /&gt;
The key pieces of Joomla Jargon that you must master before we go on are:&lt;br /&gt;
&lt;br /&gt;
* Article: Just what it sounds like.  A piece of text that you&#039;ve written and would like to display on your Web site.&lt;br /&gt;
* Components: Programs that provide Joomla with extra capabilities such as displaying Google maps, or displaying galleries of photographs.  A component is generally responsible for a whole operation involving one or more pages.&lt;br /&gt;
* Modules: Programs that produce output that can be displayed on your Web pages.  A module might produce a list of your users, or a list of upcoming events, for example.  The difference between a component and a module is that a component is responsible for a complete operation and possibly multiple pages, a module for only one block of output on a page - such as a poll.&lt;br /&gt;
* Plugins: Simple programs that extend the functionality of Joomla or of a module or component.&lt;br /&gt;
* Front End/Back End:  The front end of the system is what your users see.  It&#039;s the part of the system that&#039;s open to the world, or to your registered users.  The back end is a more private part of the system that allows you to administer the Web site.  The back end has all the controls you need to set up and manage the site.&lt;br /&gt;
* Menu: A grouping of menu items.  There can be more than one menu on your site and pages can have individualized menus.  Menus can also be set to display to only certain classes of users (registered or guest, for example).&lt;br /&gt;
* Menu Item: A single entry on a menu.  It controls the text that appears on the menu and also what happens if the user selects it.  A menu item, for example might take you to an article, or to a gallery of photographs.&lt;br /&gt;
&lt;br /&gt;
The home page for Joomla is [http://www.joomla.org here].&lt;br /&gt;
&lt;br /&gt;
==Components Used in the Template==&lt;br /&gt;
&lt;br /&gt;
All of these components are included in the Master Template.  Here, we list them and provide links to their Web sites where you can often find documentation and futher information.&lt;br /&gt;
&lt;br /&gt;
[[Community Builder]] - Community and social networking features;&lt;br /&gt;
&lt;br /&gt;
[[GMapsPro]] - Google Maps showing your users&#039; locations;&lt;br /&gt;
&lt;br /&gt;
[[Event List]] - Lists of events;&lt;br /&gt;
&lt;br /&gt;
[[ExposePrive]] - Photo galleries;&lt;br /&gt;
&lt;br /&gt;
[[Kunena]] - Forum;&lt;br /&gt;
&lt;br /&gt;
[[Kunena Latest]] - A module that allows you to display the latest posts in the forum in a box on your front page.;&lt;br /&gt;
&lt;br /&gt;
[[Sticky Message Pro]] - Displays a floating message on selected pages;&lt;br /&gt;
&lt;br /&gt;
[[CBMailing]] - Handles bulk email to lists of classmates;&lt;br /&gt;
&lt;br /&gt;
[[Google Analytics Brige]] - Adds Google Analytics tracking data to pages;&lt;br /&gt;
&lt;br /&gt;
[[AllVideos]] - Provides audio and video both from the server and from other services such as YouTube.&lt;br /&gt;
&lt;br /&gt;
[[AltHome]] - Allows you to specify an alternate home page for logged-in users.&lt;br /&gt;
&lt;br /&gt;
[[GoogleVerify]] - Allows you to add the Google verification tag to your headers.&lt;br /&gt;
&lt;br /&gt;
[[CB Photo Gallery]] - Provides a tab next to the user profile for the display of photographs.&lt;br /&gt;
&lt;br /&gt;
[[Notes on Joomla 1.5 compatibility]]&lt;br /&gt;
&lt;br /&gt;
[[Notes on Joomla 1.6 compatibility]]&lt;br /&gt;
&lt;br /&gt;
[[Notes on Joomla 3.x compatibility]]&lt;br /&gt;
&lt;br /&gt;
==Application for handling email - PHPList==&lt;br /&gt;
&lt;br /&gt;
We were not able to find a satisfactory component to handle email that was integrated with Joomla.  We ended up using a separate application called PHPList.  This is a robust program designed to handle subscriptions to email lists.  More information is available on the [http://www.phplist.com/ PHPList home page].  We use only the mailing engine from PHPList but it has a plethora of other features, which, in principle, we could use.  They include automatic handling of bounced emails, click tracking in outgoing mail, and public subscribe/unsubscribe pages.&lt;br /&gt;
&lt;br /&gt;
==Getting Started for Webmasters new to the Template==&lt;br /&gt;
&lt;br /&gt;
When your site is first up you have a lot to learn quickly.  This section packages together links to the most critical information.  We suggest that you either read through this section first, or else refer to it often as you start to work on your site.&lt;br /&gt;
&lt;br /&gt;
[http://www.haabestpractices.org/wiki/index.php?title=Getting_access_to_the_system How to get access to the system]&lt;br /&gt;
&lt;br /&gt;
[http://www.haabestpractices.org/wiki/index.php?title=Master_Template_for_Class_Web_Sites#Webmaster_Workflow Webmaster&#039;s role in registration]&lt;br /&gt;
&lt;br /&gt;
[http://www.haabestpractices.org/wiki/index.php?title=New_Article How to edit an article or add a new article]&lt;br /&gt;
&lt;br /&gt;
[http://www.haabestpractices.org/wiki/index.php?title=Menu_Item_Definition How to add a menu item]&lt;br /&gt;
&lt;br /&gt;
[http://www.haabestpractices.org/wiki/index.php?title=How_to_add_an_image_to_an_article Inserting images]&lt;br /&gt;
&lt;br /&gt;
[http://www.haabestpractices.org/wiki/index.php?title=Add_to_the_Front_Page Managing the front page]&lt;br /&gt;
&lt;br /&gt;
That covers the very basics.  Once you&#039;ve worked your way through these links you should be ready to explore on your own.  Don&#039;t forget to check the How-to section below.  It has a wealth of information on how to accomplish various tasks.&lt;br /&gt;
&lt;br /&gt;
==Webmaster Workflow==&lt;br /&gt;
&lt;br /&gt;
The initial configuration of the Web Template requires classmates to register before they can see most of the site.  Registration is a multi-step process.  First the classmate fills out a registration form with required information.  Then the system sends the classmate an email asking him/her to confirm receipt.  (This is done to ensure that we have a good email address.)&lt;br /&gt;
&lt;br /&gt;
Once the classmate confirms receipt by clicking on the link in the confirmation email, the system sends an email to the system administrator notifying him/her that a new user is awaiting approval. &lt;br /&gt;
&lt;br /&gt;
Your job as Webmaster is to respond to that email by going to the front end of the site and logging in as an administrator.  Once you do so, you will see a menu group on the left hand side labelled &amp;quot;CB Workflows&amp;quot;.  Under it there will be a link to a list of classmates awaiting approval.  You can view their registration information by clicking on their user name.  Then you could, for example, look them up in the latest &#039;&#039;Class Report&#039;&#039; to verify that they really are a classmate.  Once you are convinced, you click the &amp;quot;Approve&amp;quot; button and the system will notify the classmate(s) that they have been approved.&lt;br /&gt;
&lt;br /&gt;
One thing that you should be aware of is that a substantial number of people either never get the first email message asking them to confirm their address (because of spam filters), or they don&#039;t read it and therefore don&#039;t confirm the address.  The solution is to log in to the back end and go to Joomla-&amp;gt;Components-&amp;gt;Community Builder-&amp;gt;User Management. On the to right you will see a drop down box that says &amp;quot;Select user status&amp;quot;  Click this and select &amp;quot;Unconfirmed&amp;quot;.  That will list all the users who have registered but not confirmed their email.  If they are more than a day old, I send them an email along the following lines:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Hi xxxx,&lt;br /&gt;
&lt;br /&gt;
I noticed that you started to register at hr65.org about a week ago&lt;br /&gt;
and that you never confirmed your email address.  Probably the email &lt;br /&gt;
from the site got stuck in your spam filters somewhere.  I am going &lt;br /&gt;
to go ahead and approve your registration, so you should be able to &lt;br /&gt;
log on with the user name and password you originally set up.&lt;br /&gt;
&lt;br /&gt;
Let me know if there&#039;s any problem, and sorry for not noticing sooner.&lt;br /&gt;
&lt;br /&gt;
Bill&lt;br /&gt;
hr65.org Webmaster&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can confirm their email and approve them by clicking on the user&#039;s name in the User Manager, and then clicking the &amp;quot;Profile&amp;quot; tab and then the &amp;quot;Contact Info&amp;quot; tab under it. Then set the &amp;quot;Confirm User&amp;quot; field to &amp;quot;Yes&amp;quot; and &amp;quot;Approve User&amp;quot; to &amp;quot;Approved&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
IMPORTANT:  There are two places in the menu system where you can manage users.  You should &#039;&#039;always&#039;&#039; use Joomla-&amp;gt;Components-&amp;gt;Community Builder-&amp;gt;User Management.  &#039;&#039;Never&#039;&#039; Joomla-&amp;gt;Site-&amp;gt;User manager.  The reason is that the basic Joomla user registration system does not have the features we require so we have installed an add-on component called Community Builder and we should always mange users through Community Builder.&lt;br /&gt;
&lt;br /&gt;
==Bugs and Other Things You Should Know==&lt;br /&gt;
&lt;br /&gt;
Joomla is open-source software and is built by volunteers.  Occasionally, for no obvious reason, some of the administrative features will work in Firefox and not in Internet Explorer.  If you think that one of the administrative menus isn&#039;t working the way it should, try using Firefox!&lt;br /&gt;
&lt;br /&gt;
==How-To&#039;s==&lt;br /&gt;
&lt;br /&gt;
Remember, this is a Wiki and depends on user content.  If you figure out how to do something that isn&#039;t covered here, please add it so others can benefit.&lt;br /&gt;
&lt;br /&gt;
[[Basic Management How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[Community Builder How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[Event List How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[GMaps How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[Kunena How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[Design How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[Photo Gallery How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[Embedding Audio and Video]]&lt;br /&gt;
&lt;br /&gt;
[[Bulk email How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[Web Hosting Solutions]]&lt;br /&gt;
&lt;br /&gt;
[[How to Backup Your Site]]&lt;br /&gt;
&lt;br /&gt;
[[How to change the pop-up messages]]&lt;br /&gt;
&lt;br /&gt;
[[How to add an image to an article]]&lt;br /&gt;
&lt;br /&gt;
[[Suggestions for specific pages]]&lt;br /&gt;
&lt;br /&gt;
[[Google site management tools]]&lt;br /&gt;
&lt;br /&gt;
[[HAA Reunion Attendance Manager]]&lt;br /&gt;
&lt;br /&gt;
[[How to add non-user attendees]]&lt;br /&gt;
&lt;br /&gt;
[[Adding RSS feeds]]&lt;br /&gt;
&lt;br /&gt;
==Class of &#039;65 Case Study==&lt;br /&gt;
&lt;br /&gt;
[[Class of &#039;65 Case Study]]&lt;br /&gt;
&lt;br /&gt;
==What&#039;s a component, what&#039;s a Module, and where is the menu?==&lt;br /&gt;
&lt;br /&gt;
This pdf contains the handouts for a presentation of which parts of Joomla are responsible for creating which pieces of the final Joomla web page.  The full presentation discusses how to identify components, modules, and plugins, and how to find them in Joomla&#039;s menu structure.&lt;br /&gt;
&lt;br /&gt;
{{pdf|JoomlaStructureBook.pdf|Structure of Joomla presentation.}}&lt;br /&gt;
&lt;br /&gt;
==How to install a Joomla Security Patch==&lt;br /&gt;
&lt;br /&gt;
From time to time Joomla will issue minor upgrades that include security fixes.  We strongly recommend that you install these patches. You can subscribe to the email Joomla Security Newsletter [http://developer.joomla.org/security/news.html here].  You can also get information about Joomla security issues on the Joomla Site administration page by opening the &amp;quot;Joomla! Security Newsfeed&amp;quot; on the right of the page.&lt;br /&gt;
&lt;br /&gt;
Information on how to install a security patch can be found [http://docs.joomla.org/Installation_FAQs here], look near the bottom of the page, or search for &amp;quot;patch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Links to Outside Sites==&lt;br /&gt;
&lt;br /&gt;
[http://www.joomla.org/ Joomla]&lt;br /&gt;
&lt;br /&gt;
[http://joomla-hosting-directory.com/ Joomla Hosting Providers]&lt;br /&gt;
&lt;br /&gt;
[http://www.joomlapolis.com/ Community Builder]&lt;br /&gt;
&lt;br /&gt;
[http://gmaps.firestorm-technologies.com/ GMaps]&lt;br /&gt;
&lt;br /&gt;
[http://www.schlu.net/ Event List]&lt;br /&gt;
&lt;br /&gt;
[http://extensions.joomla.org/extensions/254/details ExposePrive information]&lt;br /&gt;
&lt;br /&gt;
[http://www.kunena.org/ Kunena]&lt;br /&gt;
&lt;br /&gt;
[http://extensions.joomla.org/extensions/style-&amp;amp;-design/popups-&amp;amp;-iframes/5808/details Sticky Message Pro information]&lt;br /&gt;
&lt;br /&gt;
[http://extensions.joomla.org/extensions/2389/details CBMailing]&lt;br /&gt;
&lt;br /&gt;
[http://je.unison24.com/extensions/products/6-gab Google Analytics Bridge - 2009]&lt;br /&gt;
&lt;br /&gt;
[http://www.joomlaworks.gr/content/view/35/41/ AllVideo]&lt;br /&gt;
&lt;br /&gt;
[http://extensions.joomla.org/extensions/site-management/seo-a-metadata/2796 Google Verify]&lt;br /&gt;
&lt;br /&gt;
[http://www.phplist.com/ PHPList]&lt;br /&gt;
&lt;br /&gt;
==Setting up from Scratch - No Template==&lt;br /&gt;
&lt;br /&gt;
This section documents the process of setting up a site like the template from scratch.  It is intended for use in the unlikely event that somebody needs to start fresh.  &#039;&#039;You should not need this information.&#039;&#039;  It is here only as a matter of public record.&lt;br /&gt;
&lt;br /&gt;
[[Joomla and Extensions Fresh Install|How to Rebuild the Template Site]]&lt;br /&gt;
&lt;br /&gt;
[[Joomla and Extensions Hacks|Documentation of Modified Modules]]&lt;br /&gt;
&lt;br /&gt;
[[Joomla and Extensions Hacks Joomla 3.0|Documentation of Modified Modules for Joomla 3.9]]&lt;br /&gt;
&lt;br /&gt;
[[How to install a fresh version]]&lt;br /&gt;
&lt;br /&gt;
[[How to install a newly configured template]]&lt;br /&gt;
&lt;br /&gt;
[[Webmasters&#039; Corner|Return to the Webmaster&#039;s Corner]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Master_Template_for_Class_Web_Sites&amp;diff=2555</id>
		<title>Master Template for Class Web Sites</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Master_Template_for_Class_Web_Sites&amp;diff=2555"/>
		<updated>2021-08-11T18:28:46Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Setting up from Scratch - No Template */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Introduction to the Template==&lt;br /&gt;
&lt;br /&gt;
We are pleased to announce the availability of a new master template for creating class web sites.  This template is based on the Joomla Content management system used successfully by the classes of [http://harvard1972.org 1972] and [http://hr69.org/ 1969].   All of the software used in this template is open-source and most of it is free.&lt;br /&gt;
&lt;br /&gt;
You can see what the template looks like before it is customized for your class at [http://www.hrtemplate.org www.hrtemplate.org]. (You can log in using user name &#039;TestUser&#039; and password &#039;letmein&#039;). &lt;br /&gt;
[[Key features|We describe key features and benefits here.]]&lt;br /&gt;
&lt;br /&gt;
You can install and run this template on your own server, or you can use one of several inexpensive hosting companies who specialize in hosting Joomla sites.  [http://joomla-hosting-directory.com/ Here] is a Web page that lists some of the hosting companies.  &lt;br /&gt;
&lt;br /&gt;
If you would like to pursue using this template, you can email [mailto:bill@spillthebeans.org Bill Bean] or call him at 617-864-6813.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The rest of this page (and subsidiary pages) is documentation of the template.  In order to use the system effectively and to understand the documentation you will need to absorb a certain amount of jargon.  We&#039;ll try to make it as painless as possible.&lt;br /&gt;
&lt;br /&gt;
==Joomla 1.6/1.7/2.5==&lt;br /&gt;
 &lt;br /&gt;
The template was originally written to run on on Joomla 1.5.  Recently, a new version 1.6 (and even more recently 1.7) of Joomla has been released.  The new versions have major differences from 1.5 and many of the programs that we use had to be modified to run in 1.6/1.7  This work is complete and as of October 2011 we are in the process of upgrading the individual sites.&lt;br /&gt;
&lt;br /&gt;
As of 12/12 all of the sites are using Joomla 2.5.&lt;br /&gt;
&lt;br /&gt;
==Introduction to Joomla==&lt;br /&gt;
&lt;br /&gt;
Joomla is a free, open-source, extensible content manager.  A content manager is a program that you install on a Web server that allows you to easily create a Web site and to manage the content that appears on the site.  That is the core function of Joomla.  The rest of those adjectives mean that you can use it without charge; you are free to modify it to suit your own needs; and that the basic system can be extended by adding other, independently developed modules to it.&lt;br /&gt;
&lt;br /&gt;
The key pieces of Joomla Jargon that you must master before we go on are:&lt;br /&gt;
&lt;br /&gt;
* Article: Just what it sounds like.  A piece of text that you&#039;ve written and would like to display on your Web site.&lt;br /&gt;
* Components: Programs that provide Joomla with extra capabilities such as displaying Google maps, or displaying galleries of photographs.  A component is generally responsible for a whole operation involving one or more pages.&lt;br /&gt;
* Modules: Programs that produce output that can be displayed on your Web pages.  A module might produce a list of your users, or a list of upcoming events, for example.  The difference between a component and a module is that a component is responsible for a complete operation and possibly multiple pages, a module for only one block of output on a page - such as a poll.&lt;br /&gt;
* Plugins: Simple programs that extend the functionality of Joomla or of a module or component.&lt;br /&gt;
* Front End/Back End:  The front end of the system is what your users see.  It&#039;s the part of the system that&#039;s open to the world, or to your registered users.  The back end is a more private part of the system that allows you to administer the Web site.  The back end has all the controls you need to set up and manage the site.&lt;br /&gt;
* Menu: A grouping of menu items.  There can be more than one menu on your site and pages can have individualized menus.  Menus can also be set to display to only certain classes of users (registered or guest, for example).&lt;br /&gt;
* Menu Item: A single entry on a menu.  It controls the text that appears on the menu and also what happens if the user selects it.  A menu item, for example might take you to an article, or to a gallery of photographs.&lt;br /&gt;
&lt;br /&gt;
The home page for Joomla is [http://www.joomla.org here].&lt;br /&gt;
&lt;br /&gt;
==Components Used in the Template==&lt;br /&gt;
&lt;br /&gt;
All of these components are included in the Master Template.  Here, we list them and provide links to their Web sites where you can often find documentation and futher information.&lt;br /&gt;
&lt;br /&gt;
[[Community Builder]] - Community and social networking features;&lt;br /&gt;
&lt;br /&gt;
[[GMapsPro]] - Google Maps showing your users&#039; locations;&lt;br /&gt;
&lt;br /&gt;
[[Event List]] - Lists of events;&lt;br /&gt;
&lt;br /&gt;
[[ExposePrive]] - Photo galleries;&lt;br /&gt;
&lt;br /&gt;
[[Kunena]] - Forum;&lt;br /&gt;
&lt;br /&gt;
[[Kunena Latest]] - A module that allows you to display the latest posts in the forum in a box on your front page.;&lt;br /&gt;
&lt;br /&gt;
[[Sticky Message Pro]] - Displays a floating message on selected pages;&lt;br /&gt;
&lt;br /&gt;
[[CBMailing]] - Handles bulk email to lists of classmates;&lt;br /&gt;
&lt;br /&gt;
[[Google Analytics Brige]] - Adds Google Analytics tracking data to pages;&lt;br /&gt;
&lt;br /&gt;
[[AllVideos]] - Provides audio and video both from the server and from other services such as YouTube.&lt;br /&gt;
&lt;br /&gt;
[[AltHome]] - Allows you to specify an alternate home page for logged-in users.&lt;br /&gt;
&lt;br /&gt;
[[GoogleVerify]] - Allows you to add the Google verification tag to your headers.&lt;br /&gt;
&lt;br /&gt;
[[CB Photo Gallery]] - Provides a tab next to the user profile for the display of photographs.&lt;br /&gt;
&lt;br /&gt;
[[Notes on Joomla 1.5 compatibility]]&lt;br /&gt;
&lt;br /&gt;
[[Notes on Joomla 1.6 compatibility]]&lt;br /&gt;
&lt;br /&gt;
[[Notes on Joomla 3.x compatibility]]&lt;br /&gt;
&lt;br /&gt;
==Application for handling email - PHPList==&lt;br /&gt;
&lt;br /&gt;
We were not able to find a satisfactory component to handle email that was integrated with Joomla.  We ended up using a separate application called PHPList.  This is a robust program designed to handle subscriptions to email lists.  More information is available on the [http://www.phplist.com/ PHPList home page].  We use only the mailing engine from PHPList but it has a plethora of other features, which, in principle, we could use.  They include automatic handling of bounced emails, click tracking in outgoing mail, and public subscribe/unsubscribe pages.&lt;br /&gt;
&lt;br /&gt;
==Getting Started for Webmasters new to the Template==&lt;br /&gt;
&lt;br /&gt;
When your site is first up you have a lot to learn quickly.  This section packages together links to the most critical information.  We suggest that you either read through this section first, or else refer to it often as you start to work on your site.&lt;br /&gt;
&lt;br /&gt;
[http://www.haabestpractices.org/wiki/index.php?title=Getting_access_to_the_system How to get access to the system]&lt;br /&gt;
&lt;br /&gt;
[http://www.haabestpractices.org/wiki/index.php?title=Master_Template_for_Class_Web_Sites#Webmaster_Workflow Webmaster&#039;s role in registration]&lt;br /&gt;
&lt;br /&gt;
[http://www.haabestpractices.org/wiki/index.php?title=New_Article How to edit an article or add a new article]&lt;br /&gt;
&lt;br /&gt;
[http://www.haabestpractices.org/wiki/index.php?title=Menu_Item_Definition How to add a menu item]&lt;br /&gt;
&lt;br /&gt;
[http://www.haabestpractices.org/wiki/index.php?title=How_to_add_an_image_to_an_article Inserting images]&lt;br /&gt;
&lt;br /&gt;
[http://www.haabestpractices.org/wiki/index.php?title=Add_to_the_Front_Page Managing the front page]&lt;br /&gt;
&lt;br /&gt;
That covers the very basics.  Once you&#039;ve worked your way through these links you should be ready to explore on your own.  Don&#039;t forget to check the How-to section below.  It has a wealth of information on how to accomplish various tasks.&lt;br /&gt;
&lt;br /&gt;
==Webmaster Workflow==&lt;br /&gt;
&lt;br /&gt;
The initial configuration of the Web Template requires classmates to register before they can see most of the site.  Registration is a multi-step process.  First the classmate fills out a registration form with required information.  Then the system sends the classmate an email asking him/her to confirm receipt.  (This is done to ensure that we have a good email address.)&lt;br /&gt;
&lt;br /&gt;
Once the classmate confirms receipt by clicking on the link in the confirmation email, the system sends an email to the system administrator notifying him/her that a new user is awaiting approval. &lt;br /&gt;
&lt;br /&gt;
Your job as Webmaster is to respond to that email by going to the front end of the site and logging in as an administrator.  Once you do so, you will see a menu group on the left hand side labelled &amp;quot;CB Workflows&amp;quot;.  Under it there will be a link to a list of classmates awaiting approval.  You can view their registration information by clicking on their user name.  Then you could, for example, look them up in the latest &#039;&#039;Class Report&#039;&#039; to verify that they really are a classmate.  Once you are convinced, you click the &amp;quot;Approve&amp;quot; button and the system will notify the classmate(s) that they have been approved.&lt;br /&gt;
&lt;br /&gt;
One thing that you should be aware of is that a substantial number of people either never get the first email message asking them to confirm their address (because of spam filters), or they don&#039;t read it and therefore don&#039;t confirm the address.  The solution is to log in to the back end and go to Joomla-&amp;gt;Components-&amp;gt;Community Builder-&amp;gt;User Management. On the to right you will see a drop down box that says &amp;quot;Select user status&amp;quot;  Click this and select &amp;quot;Unconfirmed&amp;quot;.  That will list all the users who have registered but not confirmed their email.  If they are more than a day old, I send them an email along the following lines:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
Hi xxxx,&lt;br /&gt;
&lt;br /&gt;
I noticed that you started to register at hr65.org about a week ago&lt;br /&gt;
and that you never confirmed your email address.  Probably the email &lt;br /&gt;
from the site got stuck in your spam filters somewhere.  I am going &lt;br /&gt;
to go ahead and approve your registration, so you should be able to &lt;br /&gt;
log on with the user name and password you originally set up.&lt;br /&gt;
&lt;br /&gt;
Let me know if there&#039;s any problem, and sorry for not noticing sooner.&lt;br /&gt;
&lt;br /&gt;
Bill&lt;br /&gt;
hr65.org Webmaster&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
You can confirm their email and approve them by clicking on the user&#039;s name in the User Manager, and then clicking the &amp;quot;Profile&amp;quot; tab and then the &amp;quot;Contact Info&amp;quot; tab under it. Then set the &amp;quot;Confirm User&amp;quot; field to &amp;quot;Yes&amp;quot; and &amp;quot;Approve User&amp;quot; to &amp;quot;Approved&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
IMPORTANT:  There are two places in the menu system where you can manage users.  You should &#039;&#039;always&#039;&#039; use Joomla-&amp;gt;Components-&amp;gt;Community Builder-&amp;gt;User Management.  &#039;&#039;Never&#039;&#039; Joomla-&amp;gt;Site-&amp;gt;User manager.  The reason is that the basic Joomla user registration system does not have the features we require so we have installed an add-on component called Community Builder and we should always mange users through Community Builder.&lt;br /&gt;
&lt;br /&gt;
==Bugs and Other Things You Should Know==&lt;br /&gt;
&lt;br /&gt;
Joomla is open-source software and is built by volunteers.  Occasionally, for no obvious reason, some of the administrative features will work in Firefox and not in Internet Explorer.  If you think that one of the administrative menus isn&#039;t working the way it should, try using Firefox!&lt;br /&gt;
&lt;br /&gt;
==How-To&#039;s==&lt;br /&gt;
&lt;br /&gt;
Remember, this is a Wiki and depends on user content.  If you figure out how to do something that isn&#039;t covered here, please add it so others can benefit.&lt;br /&gt;
&lt;br /&gt;
[[Basic Management How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[Community Builder How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[Event List How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[GMaps How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[Kunena How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[Design How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[Photo Gallery How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[Embedding Audio and Video]]&lt;br /&gt;
&lt;br /&gt;
[[Bulk email How-To&#039;s]]&lt;br /&gt;
&lt;br /&gt;
[[Web Hosting Solutions]]&lt;br /&gt;
&lt;br /&gt;
[[How to Backup Your Site]]&lt;br /&gt;
&lt;br /&gt;
[[How to change the pop-up messages]]&lt;br /&gt;
&lt;br /&gt;
[[How to add an image to an article]]&lt;br /&gt;
&lt;br /&gt;
[[Suggestions for specific pages]]&lt;br /&gt;
&lt;br /&gt;
[[Google site management tools]]&lt;br /&gt;
&lt;br /&gt;
[[HAA Reunion Attendance Manager]]&lt;br /&gt;
&lt;br /&gt;
[[How to add non-user attendees]]&lt;br /&gt;
&lt;br /&gt;
[[Adding RSS feeds]]&lt;br /&gt;
&lt;br /&gt;
==Class of &#039;65 Case Study==&lt;br /&gt;
&lt;br /&gt;
[[Class of &#039;65 Case Study]]&lt;br /&gt;
&lt;br /&gt;
==What&#039;s a component, what&#039;s a Module, and where is the menu?==&lt;br /&gt;
&lt;br /&gt;
This pdf contains the handouts for a presentation of which parts of Joomla are responsible for creating which pieces of the final Joomla web page.  The full presentation discusses how to identify components, modules, and plugins, and how to find them in Joomla&#039;s menu structure.&lt;br /&gt;
&lt;br /&gt;
{{pdf|JoomlaStructureBook.pdf|Structure of Joomla presentation.}}&lt;br /&gt;
&lt;br /&gt;
==How to install a Joomla Security Patch==&lt;br /&gt;
&lt;br /&gt;
From time to time Joomla will issue minor upgrades that include security fixes.  We strongly recommend that you install these patches. You can subscribe to the email Joomla Security Newsletter [http://developer.joomla.org/security/news.html here].  You can also get information about Joomla security issues on the Joomla Site administration page by opening the &amp;quot;Joomla! Security Newsfeed&amp;quot; on the right of the page.&lt;br /&gt;
&lt;br /&gt;
Information on how to install a security patch can be found [http://docs.joomla.org/Installation_FAQs here], look near the bottom of the page, or search for &amp;quot;patch&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
==Links to Outside Sites==&lt;br /&gt;
&lt;br /&gt;
[http://www.joomla.org/ Joomla]&lt;br /&gt;
&lt;br /&gt;
[http://joomla-hosting-directory.com/ Joomla Hosting Providers]&lt;br /&gt;
&lt;br /&gt;
[http://www.joomlapolis.com/ Community Builder]&lt;br /&gt;
&lt;br /&gt;
[http://gmaps.firestorm-technologies.com/ GMaps]&lt;br /&gt;
&lt;br /&gt;
[http://www.schlu.net/ Event List]&lt;br /&gt;
&lt;br /&gt;
[http://extensions.joomla.org/extensions/254/details ExposePrive information]&lt;br /&gt;
&lt;br /&gt;
[http://www.kunena.org/ Kunena]&lt;br /&gt;
&lt;br /&gt;
[http://extensions.joomla.org/extensions/style-&amp;amp;-design/popups-&amp;amp;-iframes/5808/details Sticky Message Pro information]&lt;br /&gt;
&lt;br /&gt;
[http://extensions.joomla.org/extensions/2389/details CBMailing]&lt;br /&gt;
&lt;br /&gt;
[http://je.unison24.com/extensions/products/6-gab Google Analytics Bridge - 2009]&lt;br /&gt;
&lt;br /&gt;
[http://www.joomlaworks.gr/content/view/35/41/ AllVideo]&lt;br /&gt;
&lt;br /&gt;
[http://extensions.joomla.org/extensions/site-management/seo-a-metadata/2796 Google Verify]&lt;br /&gt;
&lt;br /&gt;
[http://www.phplist.com/ PHPList]&lt;br /&gt;
&lt;br /&gt;
==Setting up from Scratch - No Template==&lt;br /&gt;
&lt;br /&gt;
This section documents the process of setting up a site like the template from scratch.  It is intended for use in the unlikely event that somebody needs to start fresh.  &#039;&#039;You should not need this information.&#039;&#039;  It is here only as a matter of public record.&lt;br /&gt;
&lt;br /&gt;
[[Joomla and Extensions Fresh Install|How to Rebuild the Template Site]]&lt;br /&gt;
&lt;br /&gt;
[[Joomla and Extensions Hacks|Documentation of Modified Modules]]&lt;br /&gt;
&lt;br /&gt;
[[Joomla and Extensions Hacks|Documentation of Modified Modules for Joomla 3.9]]&lt;br /&gt;
&lt;br /&gt;
[[How to install a fresh version]]&lt;br /&gt;
&lt;br /&gt;
[[How to install a newly configured template]]&lt;br /&gt;
&lt;br /&gt;
[[Webmasters&#039; Corner|Return to the Webmaster&#039;s Corner]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2554</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2554"/>
		<updated>2021-07-23T15:04:17Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Fixed problem in communitybuilderprofileadapter.class.php */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2553</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2553"/>
		<updated>2021-07-23T15:03:20Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Suppress map on user profile tab */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==CBMailing== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2552</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2552"/>
		<updated>2021-07-23T15:02:11Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* CBMailing */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab===&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==CBMailing== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2551</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2551"/>
		<updated>2021-07-23T15:01:30Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* GMapsPro */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab===&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==CBMailing==&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2550</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2550"/>
		<updated>2021-07-23T15:01:03Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Workaround for CB bug in User Manager */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager=== NOT NEEDED in 3.0&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro==&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab===&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==CBMailing==&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
	<entry>
		<id>http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2549</id>
		<title>Joomla and Extensions Hacks</title>
		<link rel="alternate" type="text/html" href="http://www.haabestpractices.org/index.php?title=Joomla_and_Extensions_Hacks&amp;diff=2549"/>
		<updated>2021-07-23T14:41:07Z</updated>

		<summary type="html">&lt;p&gt;WikiSysop: /* Modify language file to include instructions for uploading profile image */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Lavinya6 Template== No need for any of this in Joomla 3.0&lt;br /&gt;
&lt;br /&gt;
===Fix problem with table width in articles===&lt;br /&gt;
&lt;br /&gt;
The original template enclosed article content in a table with a style &amp;quot;contentpaneopen&amp;quot;, which called for a cell width of 100%.  This caused conflicts when the author specified a table cell width within an article.  Fixed it by removing the width specification.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
table.contentpaneopen td {&lt;br /&gt;
  /* line-height : 18px;*/&lt;br /&gt;
  /* font-size : 12px;*/&lt;br /&gt;
  line-height : 20px;&lt;br /&gt;
  font-size : 14px;&lt;br /&gt;
/*  width: 100%; *//* WHB This caused problems when the content specified a table width */&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The css for the template is in joomla\templates\lavinya6\css\template.css&lt;br /&gt;
&lt;br /&gt;
===Change the size of the banner image===&lt;br /&gt;
&lt;br /&gt;
Edited joomla\template\lavinya6\index.php to increase the height of the banner image from 170 to 235 pixels.  You can find the line by searching for &amp;quot;HRGenericPhoto&amp;quot;&lt;br /&gt;
&lt;br /&gt;
===Fix problem with menus blinking when you hover===&lt;br /&gt;
&lt;br /&gt;
If you had a narrow window the menus would blink rapidly when you hovered over a two-line menu item.  To fix this replace the following code in joomla\templates\lavinya6\css\template.css:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  font-family : Verdana, Arial, Helvetica, sans-serif;&lt;br /&gt;
  background-position : left 0%;&lt;br /&gt;
  /*background-image : url(../images/menud.png);*/&lt;br /&gt;
  height : 16px !important;&lt;br /&gt;
  display : block;&lt;br /&gt;
  height : 23px;&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
  font-size : 1em;&lt;br /&gt;
  /*text-align : center;*/&lt;br /&gt;
  text-align : left;&lt;br /&gt;
  padding-left : 10px;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
with&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
.moduletable_menu li a:hover {&lt;br /&gt;
  color : #a52a2a;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Increased font size in textareas===&lt;br /&gt;
&lt;br /&gt;
The font in the private email message box was small and hard to read.  Increased the size by adding the following code to joomla\templates\lavinya6\css\template.css immediately after the selector for &#039;inputbox&#039;:&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
textarea.inputbox{&lt;br /&gt;
  font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Community Builder==&lt;br /&gt;
&lt;br /&gt;
===Suppress certain icons during edit of user profile===&lt;br /&gt;
&lt;br /&gt;
During edit of the user profile suppress the display of the icon indicating that the field will not be displayed in the profile from the &#039;First Name&#039; and &#039;Last Name&#039; fields.  The icon was missleading since the combined full name will be displayed.&lt;br /&gt;
&lt;br /&gt;
In the file joomla\libraries\CBLib\CB\Legacy\LegacyComprofilerFunctions.php add the following lines in the function getFieldIcons, immediately after the declaration of $ueConfig as global.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB hack to suppress display of the icon saying that the field is not displayed on the profile.  &lt;br /&gt;
    // The individual first/last name fields are not, but the composite name field is displayed&lt;br /&gt;
    if ($oTitle === &amp;quot;First Name&amp;quot; || $oTitle === &amp;quot;Last Name&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $oProfile = 1;&lt;br /&gt;
    }&lt;br /&gt;
    // WHB End of hack.  If we lose this one in an update the worst that happens is the icon reapears.&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Added lastname to the list of fields that can be searched even though not on the profile=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
NOT FOUND 11/12/16 - need to come back to this one.  This is now built into CB.  No need for this change. (CB 2.6)&lt;br /&gt;
&lt;br /&gt;
Normally CB won&#039;t let you search for a field that isn&#039;t displayed in the profile.  We want to search for last name, not full name, so I added the lastname field to the list of exceptions.  To do so I modified one line of code in the function _getTabFieldsDb in the file joomla\administrator\components\com_comprofiler\comprofiler.class.php.  The original line is commented out immediately over the modified line.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
switch ( $reason ) {&lt;br /&gt;
  case &#039;profile&#039;:&lt;br /&gt;
      $where[] = &#039;f.profile != 0&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
  case &#039;list&#039;:&lt;br /&gt;
      // WHB hack.  Added lastname to exceptions for fields that are not on the profile yet are searchable.&lt;br /&gt;
      // $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      $where[] = &amp;quot;( f.profile != 0 OR f.name = &#039;username&#039;&amp;quot; . ( in_array( $ueConfig[&#039;name_format&#039;], array( 1, 2, 4 ) ) ? &amp;quot; OR f.name = &#039;name&#039; OR f.name=&#039;lastname&#039;&amp;quot; : &#039;&#039; ) . &#039;)&#039;;&lt;br /&gt;
      // END WHB hack.				    &lt;br /&gt;
      break;&lt;br /&gt;
   case &#039;register&#039;:&lt;br /&gt;
      $where[] = &#039;f.registration = 1&#039;;&lt;br /&gt;
      break;&lt;br /&gt;
    default:&lt;br /&gt;
      break;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Make the AIM link on the user profile activate AIM=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
DROP THIS CHANGE - it doesn&#039;t work any more 4/22/13&lt;br /&gt;
&lt;br /&gt;
In order to make the AIM link on the Web Contact tab work, we had to reconfigure the link built by Community Builder.  The code to make the change is in the file joomla\administrator\components\com_comprofiler\plugin.class.php.  It occurs in the functions getFieldRow immediately after the line:&lt;br /&gt;
&lt;br /&gt;
 $oValue = $this-&amp;gt;getField( $field, $user, $output, $reason, $list_compare_types ); &lt;br /&gt;
&lt;br /&gt;
The added code is:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack to allow aim in Web page, if we lose it the aim file will simply show the user&lt;br /&gt;
// name, without the link.&lt;br /&gt;
if ($field-&amp;gt;name === &amp;quot;cb_aim&amp;quot;)&lt;br /&gt;
{&lt;br /&gt;
    if(preg_match(&amp;quot;#http://aim#&amp;quot;, $oValue))&lt;br /&gt;
    {&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#http://aim#&amp;quot;, &amp;quot;aim&amp;quot;, $oValue);&lt;br /&gt;
        $oValue = preg_replace(&amp;quot;#target=\\\&amp;quot;_blank\\\&amp;quot;#&amp;quot;, &amp;quot;&amp;quot;, $oValue);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
//WHB end of hack.        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify language file to include instructions for uploading profile image=== NOT NEEDED in 3.0&lt;br /&gt;
&lt;br /&gt;
Change the definition of _UE_UPLOAD_DIMENSIONS_AVATAR to include upload instructions in .\components\com_comprofiler\plugin\language\default_language\default_language.php to read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
DEFINE(&#039;_UE_UPLOAD_DIMENSIONS_AVATAR&#039;,&#039;To upload a picture press the &amp;quot;Browse&amp;quot; button and select &#039;&lt;br /&gt;
.&#039; a picture on your computer.  Then press the &amp;quot;Choose File&amp;quot; button. &#039;&lt;br /&gt;
.&#039;Your image will be resized if needed to a maximum dimension of %s pixels &#039;&lt;br /&gt;
.&#039;width x %s height automatically, but your image file should not exceed %s KB.&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Modify the reunion attendees list to include non-user reunion attendees===&lt;br /&gt;
&lt;br /&gt;
Added code to .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
Added the following code after After $usergids = implode(&amp;quot;,&amp;quot;,$allusergids):&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB Hack&lt;br /&gt;
// We want to include front end users who have been entered to &lt;br /&gt;
// represent non-user classmates who have indicated that they&lt;br /&gt;
// are coming to the reunion.  We do this only for the &amp;quot;Reunion Attendees&amp;quot;  list&lt;br /&gt;
        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;)){&lt;br /&gt;
        $usergids .= &amp;quot;, 1&amp;quot;; // 29 before J1.7&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
// End of WHB Hack        &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also the following before $queryFrom .= &amp;quot; &amp;quot; . $filterby; in .\administrator\components\com_profiler\library\cb\cb.lists.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
    // WHB Hack&lt;br /&gt;
    // We only want to include the front end users if they have cb_dummyregistrant set&lt;br /&gt;
    // We also want to eliminate the admin user, provided they aren&#039;t specifically included.&lt;br /&gt;
        $whbIncludeAdmin =  !strncmp($row-&amp;gt;title, &amp;quot;Super Administrators&amp;quot;, 19);&lt;br /&gt;
        if (!$whbIncludeAdmin){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (u.username != &#039;admin&#039;)&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        if (strlen($row-&amp;gt;title) &amp;gt;= 17){&lt;br /&gt;
            if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees&amp;quot;, 17)){&lt;br /&gt;
                $queryFrom .= &amp;quot; AND (ue.cb_dummyregistrant OR (g.group_id = 2))\n&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    // END WHB Hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
   //WHB HACK we suppress the row click for reunion attendees who are not&lt;br /&gt;
   //users of the web site&lt;br /&gt;
                &lt;br /&gt;
                if ($user-&amp;gt;gid != 1){ // 29 pre J17&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                else{&lt;br /&gt;
                    $jsClickTr .= &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userslist&amp;amp;amp;listid=6&#039;) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
   // END HACK&lt;br /&gt;
   // The next line replaces the hack in the original &lt;br /&gt;
   // $jsClickTr        .=                &amp;quot;&#039;&amp;quot; . cbSef( &#039;index.php?option=com_comprofiler&amp;amp;amp;task=userProfile&amp;amp;amp;user=&#039; . &lt;br /&gt;
          $user-&amp;gt;id . getCBprofileItemid( true ), false ) . &amp;quot;&#039;,&amp;quot;;&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added the following code in function _getListTableContent (after assignment of $fieldView-&amp;gt;value) in foreach loop that assigns links to the avatars and user names:&lt;br /&gt;
&lt;br /&gt;
  //WHB HACK we strip the links on the avatar and the individual name for Reunion Attendees&lt;br /&gt;
  //who are dummy registrants&lt;br /&gt;
  if ($user-&amp;gt;gid == 1){ // 29 pre J17&lt;br /&gt;
      if ($fieldView-&amp;gt;name ==&amp;quot;avatar&amp;quot; or $fieldView-&amp;gt;name == &amp;quot;name&amp;quot;){&lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;a.+?&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
          $fieldView-&amp;gt;value = preg_replace(&#039;/&amp;lt;\/a&amp;gt;/&#039;, &#039;&#039;, $fieldView-&amp;gt;value);    &lt;br /&gt;
      }&lt;br /&gt;
  }&lt;br /&gt;
  //WHB End hack&lt;br /&gt;
&lt;br /&gt;
===Added code to support a summary version of the Reunion Attendees list===&lt;br /&gt;
&lt;br /&gt;
Modified code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to support summary list&lt;br /&gt;
                        &lt;br /&gt;
    if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
           global $_CB_database;&lt;br /&gt;
&lt;br /&gt;
           // Get the reunion year &lt;br /&gt;
                        &lt;br /&gt;
           $_CB_database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
           $_CB_database-&amp;gt;query();&lt;br /&gt;
           $haaparams = $_CB_database-&amp;gt;loadResult();        &lt;br /&gt;
           preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
           $whbRyr = $arrYear[1];&lt;br /&gt;
           if (false !== stripos($row-&amp;gt;title, &amp;quot;Prior&amp;quot;)){&lt;br /&gt;
                $whbRyr = $whbRyr - 5;&lt;br /&gt;
&lt;br /&gt;
           }&lt;br /&gt;
           $whbRyr = (string)$whbRyr;&lt;br /&gt;
           if (strlen($whbRyr) == 1 )&lt;br /&gt;
               {$whbRyr = &#039;0&#039;.$whbRyr;}&lt;br /&gt;
&lt;br /&gt;
           $whbCount = count($users);&lt;br /&gt;
           $whbRowCount =  ceil($whbCount/3);&lt;br /&gt;
           $whbLastRowColCount = $whbCount % 3;&lt;br /&gt;
           echo &amp;quot;&amp;lt;table&amp;gt;&amp;quot;;&lt;br /&gt;
           for ($whbIx = 0; $whbIx &amp;lt; $whbRowCount; $whbIx++)&lt;br /&gt;
           {&lt;br /&gt;
                if ($whbIx == $whbRowCount - 1)&lt;br /&gt;
                {&lt;br /&gt;
                     if ($whbLastRowColCount == 1)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 2)&lt;br /&gt;
                     {&lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                     else if ($whbLastRowColCount == 0)&lt;br /&gt;
                     {  &lt;br /&gt;
                          echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;                &lt;br /&gt;
                     }&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    echo $tt = &#039;&amp;lt;tr&amp;gt;&#039;.whbUserCell($whbIx, 0, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 1, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).whbUserCell($whbIx, 2, $whbRowCount, $whbLastRowColCount,  $users, $whbRyr).&#039;&amp;lt;/tr&amp;gt;&#039;;&lt;br /&gt;
                }&lt;br /&gt;
           }     &lt;br /&gt;
           echo &amp;quot;&amp;lt;/table&amp;gt;&amp;quot;;     &lt;br /&gt;
                 &lt;br /&gt;
      }  &lt;br /&gt;
      else {&lt;br /&gt;
               if ( $showPaging &amp;amp;&amp;amp; ( ( $limitstart != 0 ) || ( $limit &amp;lt;= $total ) ) ) {&lt;br /&gt;
&lt;br /&gt;
                   // top page links:&lt;br /&gt;
      ?&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;cbUserListPagination cbUserListPaginationTop&amp;quot; style=&amp;quot;width:100%;text-align:center;&amp;quot;&amp;gt;&amp;lt;?php echo writePagesLinks($limitstart, $limit, $total, $ue_base_url.$pagingSearch.$spoofAmp, $search); ?&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
       &amp;lt;?php&lt;br /&gt;
               }&lt;br /&gt;
               echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
       }          &lt;br /&gt;
                        &lt;br /&gt;
  // Original content of hacked area: echo HTML_comprofiler::_cbTemplateRender( $cbTemplate, $myUser, &#039;List&#039;, &#039;drawListBody&#039;, array( &amp;amp;$users, &amp;amp;$columns, &amp;amp;$tableContent, $listid, $ueConfig[&#039;allow_profilelink&#039;] ) );&lt;br /&gt;
&lt;br /&gt;
  // End WHB hack           &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Added code in .\components\com_comprofiler\comprofiler.html.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB FUNCTION to print one cell of Reunion Attendees - Summary report&lt;br /&gt;
&lt;br /&gt;
function whbUserCell($row, $col, $lastrow,  $lastrowcolcount, &amp;amp;$users, $Ryr)&lt;br /&gt;
{&lt;br /&gt;
    $renplanstmt = &#039;$renp = $users[$rowix]-&amp;gt;cb_reunion%02d;&#039;;&lt;br /&gt;
    $renplanstmt = sprintf($renplanstmt, $Ryr);&lt;br /&gt;
    $rowincadj =  ($lastrowcolcount == 1 &amp;amp;&amp;amp; $col == 2 ) ? 1 : 0;&lt;br /&gt;
    $whbColor = &#039; color = &amp;quot;gray&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    $rowix = $col  * $lastrow + $row - $rowincadj;&lt;br /&gt;
    eval($renplanstmt);&lt;br /&gt;
    if ($renp == &amp;quot;2&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        $whbColor = &#039; color = &amp;quot;green&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
    }&lt;br /&gt;
    return &#039;&amp;lt;td width=&amp;quot;200&amp;quot;&amp;gt;&amp;lt;font &#039;.$whbColor.$users[$rowix]-&amp;gt;name.&#039;&amp;lt;/font&amp;gt;&amp;lt;/td&amp;gt;&#039;;   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//    &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Also added code before $query = &amp;quot;SELECT ue.*, .....&amp;quot; in .\administrator\components\com_comprofiler\library\cb\cb.lists.php&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE that after Joomla 2.* this code needs to go before the test for &amp;quot;checkJversion() == 2&amp;quot;&lt;br /&gt;
&lt;br /&gt;
//WHB Hack&lt;br /&gt;
// We don&#039;t want to impose a limit on the number of users for the summary report&#039;&lt;br /&gt;
if (false !== stripos($row-&amp;gt;title, &amp;quot;Reunion Attendees - Summary&amp;quot;)){&lt;br /&gt;
    $limitstart = 0;&lt;br /&gt;
    $limit = $total;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//END WHB Hack // $query = &amp;quot;SELECT u.id, ue.banned, &#039;&#039; AS &#039;NA&#039; &amp;quot; . ( $fieldsSQL ? &amp;quot;, &amp;quot; . $fieldsSQL . &amp;quot; &amp;quot; : &#039;&#039; ) . $queryFrom . &amp;quot; &amp;quot; . $orderby&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Workaround for CB bug in User Manager===&lt;br /&gt;
&lt;br /&gt;
In version 1.2.3 and 1.4 of CB there is a bug in the User Manger that causes a partial display of the advanced search feature when you cancel out of a user edit.  CB has opened a bug for this (#1922).  A temporary workaround is to suppress the search when you cancel out of the edit.  The following code in .\components\com_comprofiler\plugin\user\plug_cbcore\cb.core.php accomplishes this.  (The hope is that this won&#039;t be required in the next version of CB.) The code is about line 954.&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to supress bug in CB 1.2.3 that caused advanced search checkboxes to be displayed if you cancel out of user edit.&lt;br /&gt;
        &lt;br /&gt;
if(isset($postdata[&#039;password__verify&#039;])){&lt;br /&gt;
   return $query;&lt;br /&gt;
   }&lt;br /&gt;
// End  WHB hack&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Not required in CB 1.7&lt;br /&gt;
&lt;br /&gt;
==GMapsPro==&lt;br /&gt;
&lt;br /&gt;
===Suppress map on user profile tab===&lt;br /&gt;
&lt;br /&gt;
joomla\components\com_comprofiler\plugin\user\plug_cbmapuser\mapnearbyuserstab.class.php; &lt;br /&gt;
&lt;br /&gt;
Added:&lt;br /&gt;
&lt;br /&gt;
 return;&lt;br /&gt;
&lt;br /&gt;
after the code block that does the geocoding right after the comment &lt;br /&gt;
&lt;br /&gt;
 // If the users profile needs to be geocoded and IF geocoding is enabled&lt;br /&gt;
&lt;br /&gt;
The effect is to suppress the generation of the map on the user profile tab.&lt;br /&gt;
&lt;br /&gt;
===Fix problem with calls to www.sitename.org vs. sitename.org===&lt;br /&gt;
&lt;br /&gt;
 // ORIG LINE	$query = &#039;SELECT * from #__gmaps_config where site = &amp;quot;&#039; . $mosConfig_live_site . &#039;&amp;quot;&#039;;&lt;br /&gt;
 // NEW LINE	$query = &#039;SELECT * from #__gmaps_config limit 1&#039;;&lt;br /&gt;
&lt;br /&gt;
The intent of the original code was to allow a single Joomla installation to&lt;br /&gt;
support more than one site.  The problem was that the URL isn&#039;t unique within a site.  &lt;br /&gt;
A better approach would have been to use the database prefix (jos_, for example), which is&lt;br /&gt;
unique within sites in the same installation.  This would not be a difficult modification if &lt;br /&gt;
it becomes desirable to run multiple sites in a single installation.&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in communitybuilderprofileadapter.class.php===&lt;br /&gt;
&lt;br /&gt;
Changed code to suppress second copy of avatar and to add View Profile link.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$desc = &amp;quot;&amp;lt;table&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;quot;  &lt;br /&gt;
 . $row[&amp;quot;name&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_address&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;&lt;br /&gt;
 . $row[&amp;quot;cb_city&amp;quot;] . &amp;quot;, &amp;quot; . $row[&amp;quot;cb_state&amp;quot;] . &amp;quot;&amp;lt;br/&amp;gt;&amp;quot;	&lt;br /&gt;
 . &amp;quot;&amp;lt;a href=&#039;&amp;quot;.$profile_path.$row[&amp;quot;user_id&amp;quot;].&amp;quot;&#039;&amp;gt;View Profile&amp;lt;/a&amp;gt;&amp;lt;br /&amp;gt;&amp;quot;&lt;br /&gt;
 . &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
&amp;lt;/table&amp;gt;&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==CBMailing==&lt;br /&gt;
&lt;br /&gt;
===Modified to recognize special list selection keywords===&lt;br /&gt;
&lt;br /&gt;
We have heavily altered CBMailing to integrate it with PHPList.  The modified install file is available here:&lt;br /&gt;
[http://www.spillthebeans.org/haa/haa_cbmailing.zip haa_cbmailing.zip]&lt;br /&gt;
&lt;br /&gt;
Added the following code in cbmailing.class.php immediately after $filterby is set from the database&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// We modify the filter depending on keywords included in the filter&lt;br /&gt;
// This code appears in haareunion.php and must be changed in both places!!&lt;br /&gt;
// The only difference in the code is the definition of $HaaPrefix and the&lt;br /&gt;
// use of $row-&amp;gt;filterfields vs. $filterby&lt;br /&gt;
&lt;br /&gt;
$database-&amp;gt;setQuery(&amp;quot;SELECT params FROM #__comprofiler_plugin WHERE name=&#039;HAAReunion&#039;&amp;quot;);&lt;br /&gt;
$database-&amp;gt;query();&lt;br /&gt;
$haaparams = $database-&amp;gt;loadResult();    // In the form &#039;ActiveReunion=15&#039;&lt;br /&gt;
preg_match(&#039;/ActiveReunion=([0-9]+)/&#039;, $haaparams, $arrYear);&lt;br /&gt;
$actyear = (string)$arrYear[1];&lt;br /&gt;
if (strlen($actyear) == 1 )&lt;br /&gt;
    {$actyear = &#039;0&#039;.$actyear;}&lt;br /&gt;
$prioryear = (string)(((int)$arrYear[1]) - 5);&lt;br /&gt;
if (strlen($prioryear) == 1 )&lt;br /&gt;
    {$prioryear = &#039;0&#039;.$prioryear;}&lt;br /&gt;
&lt;br /&gt;
if (preg_match(&#039;/NoPlansActiveReunion|PlansToComeActiveReunion|IsRegisteredActiveReunion|NoPlansPriorReunion|PlansToComePriorReunion|IsRegisteredPriorReunion/&#039;, $filterby))&lt;br /&gt;
{&lt;br /&gt;
    $HaaPrefix = &amp;quot;ue.&amp;quot;;&lt;br /&gt;
    $HaaFilter = $filterby;&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComeActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` = &#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredActiveReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$actyear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/NoPlansPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` &amp;lt; &#039;1&#039; or &amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` is null)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/PlansToComePriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;1&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $HaaFilter = preg_replace(&#039;/IsRegisteredPriorReunion/&#039;, &amp;quot;(&amp;quot;.$HaaPrefix.&amp;quot;`cb_reunion&amp;quot;.$prioryear.&amp;quot;` =&#039;2&#039;)&amp;quot;, $HaaFilter);&lt;br /&gt;
    $filterby = $HaaFilter;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Fixed problem in Javascript in file===&lt;br /&gt;
&lt;br /&gt;
In the file admin.cbmailing.html.php commented out a closing brace (}) and added submitform(pressbutton); right&lt;br /&gt;
before the final return.  The syntax error was showing up in IE with debugging enabled.  Once the brace was removed&lt;br /&gt;
the form wasn&#039;t submitted without the call to submit form.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;	&lt;br /&gt;
function messageForm( &amp;amp;$lists, &amp;amp;$config, $option ) {      &lt;br /&gt;
 ?&amp;gt;&lt;br /&gt;
 &amp;lt;script language=&amp;quot;javascript&amp;quot; type=&amp;quot;text/javascript&amp;quot;&amp;gt;&lt;br /&gt;
     //function getSelectedValue(&lt;br /&gt;
    function submitbutton(pressbutton) {&lt;br /&gt;
    var form = document.adminForm;&lt;br /&gt;
    if (pressbutton == &#039;cancel&#039;) {&lt;br /&gt;
    submitform( pressbutton );&lt;br /&gt;
    return;&lt;br /&gt;
    }&lt;br /&gt;
    // do field validation&lt;br /&gt;
   if (form.mm_subject.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINSUBJECT ?&amp;gt;&amp;quot; );      &lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (getSelectedValue(&#039;adminForm&#039;,&#039;mm_group&#039;) &amp;lt; 0){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_SELECTAGROUP ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   } else if (form.mm_message.value == &amp;quot;&amp;quot;){&lt;br /&gt;
      alert( &amp;quot;&amp;lt;?php echo _CB_MAILING_FILLINMESSAGE ?&amp;gt;&amp;quot; );&lt;br /&gt;
      return false;&lt;br /&gt;
   }&lt;br /&gt;
   submitform(pressbutton);&lt;br /&gt;
   return true;&lt;br /&gt;
}&lt;br /&gt;
//}     &lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A few lines further down added the line commented with WHB &lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// Get all users email&lt;br /&gt;
$query = &amp;quot;SELECT email FROM #__users u, #__comprofiler ue WHERE u.id=ue.id AND ue.approved=1 AND ue.banned!=1 AND ue.confirmed=1&amp;quot;;&lt;br /&gt;
$query .= &amp;quot; AND ue.cb_mailoptin = 1&amp;quot;;  // WHB Modification to honor optin field&lt;br /&gt;
if (! $this-&amp;gt;cbMailingConfig[&amp;quot;incBlocked&amp;quot;])&lt;br /&gt;
{&lt;br /&gt;
	$query .= &amp;quot; AND u.block!=1&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Supressed sending of blank email===&lt;br /&gt;
&lt;br /&gt;
in joomla\administrator\components\com_cbmailing\cbmailing.class.php Commented out the line calling mosMail in&lt;br /&gt;
the following.  It was trying to send an empty email, resulting in an error.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// MRCB DEBUG&lt;br /&gt;
/* $result = mosMail( $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugFromDesc&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugToAddr&amp;quot;], &lt;br /&gt;
   $this-&amp;gt;cbMailingConfig[&amp;quot;debugETitle&amp;quot;],&lt;br /&gt;
   $mailedDetails . $msg, 0);      */&lt;br /&gt;
// Uncomment the following line to display the message - would need to comment out the mosRedirect&lt;br /&gt;
//HTML_cbmailing::errorMessage( $mailedDetails . $msg, NULL );	&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Nicetalk==&lt;br /&gt;
&lt;br /&gt;
===Added css to template for body of the comments===&lt;br /&gt;
&lt;br /&gt;
The original style used very small sans-serif type for the comments - too small for aging eyes.&lt;br /&gt;
Added the following to the end of \joomla\components\com_nicetalk\css\nicetalk.css&lt;br /&gt;
&lt;br /&gt;
OBSOLETE since we switched forum software.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
/* WHB addition */&lt;br /&gt;
&lt;br /&gt;
div#nicetalk{&lt;br /&gt;
font-size:14px;&lt;br /&gt;
font-family : georgia, Verdana, arial, serif;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Joomla==&lt;br /&gt;
&lt;br /&gt;
===Problems with date() in php 5.3===&lt;br /&gt;
&lt;br /&gt;
Must insert &lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
date_default_timezone_set(&#039;UTC&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
in both index.php files or the date() function fails.  This shows up in ExpirePrive&lt;br /&gt;
&lt;br /&gt;
===Intermittent bug when editing/creating menu items===&lt;br /&gt;
While editing/creating a menu item, when you selected &#039;Article layout&#039; for the type of page the resulting&lt;br /&gt;
screen didn&#039;t have the dropdown list that is supposed to let you select the&lt;br /&gt;
article to be associated with the menu item.  The problem was intermittent&lt;br /&gt;
and was often cured by switching browsers.&lt;br /&gt;
&lt;br /&gt;
NOTE: Not installed in Joomla 2.5.0+, so far no reports of problems!  (7/15/12)&lt;br /&gt;
&lt;br /&gt;
In administrator\components\com_menus\models\item.php changed the line that read:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;PRE&amp;gt;&lt;br /&gt;
// WHB hack to fix intermittent bug with url field in $_REQUEST&lt;br /&gt;
$url = JRequest::getVar(&#039;url&#039;, array(), &#039;GET&#039;, &#039;array&#039;);&lt;br /&gt;
if (!isset($url[&#039;option&#039;])){&lt;br /&gt;
     $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
}&lt;br /&gt;
// WHB end of hack.  Original code was $url = JRequest::getVar(&#039;url&#039;, array(), &#039;&#039;, &#039;array&#039;);&lt;br /&gt;
&amp;lt;/PRE&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Master Template for Class Web Sites|Return to main Master Template page]]&lt;/div&gt;</summary>
		<author><name>WikiSysop</name></author>
	</entry>
</feed>