@anonymous-piwik-user opened this Issue on August 6th 2009

I have 1 piwik installation running 3 sites. I have mapped the server alias of stats.domainname to /usr/share/piwik. But, no matter which site I login on, I'm always given the first site I made as my starting idSite.

It would be a really nice enhancement to look at the domainname for the URL and try to find a match in the list of registered sites and select that idSite by default. This would only be done on login. Having this small feature would make setups like mine seem to function just a tiny bit slicker.

Suggested algorithm:
parse_url()
try to find the part before .com or .co.uk but after www. or stats.
find idSite by soundex() match to list of sites
if not found, choose idSite normally

Keywords: idSite, login, domain, subdomain

@anonymous-piwik-user commented on August 8th 2009

Attachment: Patch to sort the default list of idSites based on the closest match to the current HTTP_HOST env variable.
sort_idsites_by_http_host_relevance.diff

@robocoder commented on August 6th 2009 Contributor

This overlaps #401.

@anonymous-piwik-user commented on August 8th 2009

I have uploaded a simple brute-force method of identifying the closest match.

It takes the current HTTP_HOST (if any) and iterates over the db results of viewable site ids. It splits on dots, and trims the two comparable hosts to the same level, so that biz.exmaple.com would also match example.com. If the matches are more than 1 (so, ignore any matches of just .net or .uk) but also equal to the number of parts less one (so give fudge factor to stats.example.com and biz.example.com) then the match is found.

If a match is found, array_unshift it to a new array (so it's at the first position) then push all the other ids back onto this new array.

I've tested this with my two sites, one of which has a subdomain.

so, example.com and biz.mydomain.com are my two sites. But I access both with "stats.example.com" or "stats.mydomain.com". Logging in to either of the "stats" sites will give me my correct idSite in order. It's very handy.

@anonymous-piwik-user commented on August 8th 2009

I feel that this patch also satisfies bug #401 because, in away, it allows the user to select which siteId is chosen by default by opening the piwik installation via a hostname. They could make a local entry in their "hosts" file to make "stats.anysite.com" point to their piwik installation, thereby allowing them to "choose" which siteId comes up by default in their own installation.

@robocoder commented on August 9th 2009 Contributor

Thoughts:

  • #401 contemplates Admin UI changes
  • investigate using cached web site attributes (instead of a db query)
  • would the Public Suffix List simplify the domain matching algorithm?
  • investigate interaction of the Login controller which does a redirect using the Referer, e.g.,
    Referer: http://example.com/?module=CoreHome&idSite=2
@mattab commented on August 17th 2009 Owner

aaabbb2 , your patch sounds interesting. However such logic should be in a plugin. We can add a hook that would make it easy for plugins to change the list of website IDs.
For example, we could add a new hook:

Index: core/Controller.php
===================================================================
--- core/Controller.php (revision 1383)
+++ core/Controller.php (working copy)
@@ -285,11 +285,20 @@

    function redirectToIndex($moduleToRedirect, $actionToRedirect)
    {
-       $sitesId = Piwik_SitesManager_API::getSitesIdWithAtLeastViewAccess();
-       if(!empty($sitesId))
+       $defaultWebsiteToLoad = false;
+       Piwik_PostEvent( 'Controller.selectDefaultWebsiteToLoad', $defaultWebsiteToLoad );
+       if(empty($siteIdToLoadByDefault))
        {
-           $firstSiteId = $sitesId[0];
-           $firstSite = new Piwik_Site($firstSiteId);
+           $sitesId = Piwik_SitesManager_API::getSitesIdWithAtLeastViewAccess();
+           if(isset($sitesId[0])) 
+           {
+               $defaultWebsiteToLoad = $sitesId[0];
+           }
+       }
+       
+       if(!empty($defaultWebsiteToLoad))
+       {
+           $firstSite = new Piwik_Site($defaultWebsiteToLoad);
            if ($firstSite->getCreationDate()->isToday()) 
            {
                $defaultDate = 'today';
@anonymous-piwik-user commented on August 26th 2009

I would suggest a small change to help with naming consistency.

The function Piwik_SitesManager_API::getSitesIdWithAtLeastViewAccess() clearly returns site IDs, but "Piwik_PostEvent( 'Controller.selectDefaultWebsiteToLoad', $defaultWebsiteToLoad )" might suggest that $defaultWebsiteToLoad would be an entire record or object. I would propose using consistent "SiteId" instead of "Website" in the hooks.

Piwik_PostEvent('Controller.selectDefaultSiteIdForIndex', $defaultSiteIdToLoad);

The function Piwik_SitesManager_API::getSitesIdWithAtLeastViewAccess() only returns an array of site IDs, so the original patch had to perform an extra query to retrieve all the information about the sites with view access. It would be nice if the core "redirectToIndex" function loaded all the site records and passed those to the "selectDefaultSiteIdForIndex" or "selectDefaultWebsiteToLoad" so the plugin did not have to decide which sites are in question. The plugin should only concentrate on an algorithm for selecting the best from a list of possible choices ("WithAtLeastViewAccess").

So, perhaps a hook that looks like this:

Piwik_PostEvent('Controller.selectDefaultSiteIdForIndex', $siteObjectsWithViewAccess, $defaultSiteIdToLoad);

@mattab commented on March 12th 2010 Owner

(In [1899]) Fixes #908
aaabbb2, I didn't pass the full array of websites info as this has performance impact (by default, Piwik doesn't load this data).

This Issue was closed on March 12th 2010
Powered by GitHub Issue Mirror