0
votes

Believe me, I've looked through both the Modx and Stackoverflow communities q&a's quite a bit to find the answer to this question and there just doesn't seem to be the answer I'm looking for anywhere.

First, I'm running on the latest Modx Revo CMS, but this question could apply to any CMS really and I want to redirect to my mobile sub-domain, but I need it to go to a specific page, so if I post a link to social media or such, a person on a mobile device will be automatically redirected to that page's mobile counterpart. Changing the template according to device is not an option.

Now at one time, there was an excellent add-on called Mobile Redirect which the person behind brainhandles dot com created (much kudos goes out to them), it was simple:

First you created a snippet and call it Mobile_Redirect or whatever you wanted

   <?php
    /*     Mobile_redirect
           01/28/11    1:40 pm cet
           01/28/11    6:14 am est
           11/24/09   10:31 am est

           original code: http://www.brainhandles.com/techno-thoughts/detecting-mobile-browsers
           usage: call in the top of your template
           [[!Mobile_redirect? &mID=`1`]]
           [[!Mobile_redirect? &url=`http://redirectdomain.com`]]
           [[!Mobile_redirect? &exclude=`iPad`]]

           link back to main page:
           add &views=1 to the link
           ex: <a href="http://yourmaindemonstrationsite.com?views=1">Link Back to Main site</a>
    */

    // set the MODx document ID of the mobile page
    $mid = isset($mID) ? $mID : "";

    // set the url you want to redirect to
    // http://domain.com   or   http://sub.domain.com
    $url = isset($url) ? $url : 'http://m.demonstrationsite.com';

    // add any names you want to exclude
    $exclude = isset($exclude) ? explode(',', $exclude) : array();

    if(isset($_GET['views']) || $_SESSION['views'] =='1'){
        $_SESSION['views'] = 1;
    }else{
        if(isset($_SERVER["HTTP_X_WAP_PROFILE"]) || preg_match("/wap\.|\.wap/i",$_SERVER["HTTP_ACCEPT"])) {
            if($mid =="" && $url !=""){
                header("Location: ".$url."");
            }else{
                $goto = $modx->makeUrl($mid);
                $modx->sendRedirect($goto);
            }
        }
        if(isset($_SERVER["HTTP_USER_AGENT"])){
            $uastring = $_SERVER["HTTP_USER_AGENT"]; 
            if(preg_match("/Creative\ AutoUpdate/i",$_SERVER["HTTP_USER_AGENT"])) { 
                return false;
            }
            $check_for_mobiles = true;
            foreach($exclude as $not_mobil){
                if( stripos($uastring, $not_mobil) !== false ) {
                    $check_for_mobiles = false;
                    break;
                }
            }

            if ( $check_for_mobiles == true ) {
                $mobiles = array("webOS","midp", "j2me", "avantg", "iphone", "docomo", "novarra", "palmos", "palmsource", "240x320", "opwv", "chtml", "pda", "windows\ ce", "mmp\/", "blackberry", "mib\/", "symbian", "wireless", "nokia", "hand", "mobi", "phone", "cdm", "up\.b", "audio", "SIE\-", "SEC\-", "samsung", "HTC", "mot\-", "mitsu", "sagem", "sony", "alcatel", "lg", "erics", "vx", "NEC", "philips", "mmm", "xx", "mobi", "panasonic", "sharp", "wap", "sch", "rover", "pocket", "benq", "java", "pt", "pg", "vox", "amoi", "bird", "compal", "kg", "voda", "sany", "kdd", "dbt", "sendo", "sgh", "gradi", "jb", "\d\d\di", "moto");
                foreach($mobiles as $mobil){
                    if( stripos($uastring, $mobil) !== false ){
                        if($mid =="" && $url !=""){
                            header("Location: ".$url."");
                        }else{
                            $goto = $modx->makeUrl($mid);
                            $modx->sendRedirect($goto);
                        }
                        exit;
                    }
                }
            }
        }
    }

Next you placed a snippet call on your page above the head section:

[[!Mobile_redirect? &url=`http://m.demonstrationsite.com/` ]]

but, to my surprise I found that if I placed one call on my home page and another on all interior pages (see following) it would work redirecting like a charm!

[[!Mobile_redirect? &url=`http://m.demonstrationsite.com/` &exclude=`iPad`]]

[[!Mobile_redirect? &url=`http://m.demonstrationsite.com/[[~[[*id]]]]` &exclude=`iPad`]]

Now, what really made this add on perfect was the ability to return to the main site (as is commented in the original snippet), all one had to do was add the following link to their website's menu:

http://demonstrationsite.com?views=1

Ok, so what's the problem if everything worked well? Well the add-on is no longer maintained by the folks at brainhandles.com.

After two years, I have decided to stop maintaining and updating this code. I'm not currently using it and it was getting to be in need of an overhaul with all the devices that keep changing the landscape. I'd suggest the open source DetectMobileBrowser.com.

Ok, cool, so I go on over to DetectMobileBrowser.com and get the PHP code:

 <?php
    $useragent=$_SERVER['HTTP_USER_AGENT'];
    if(preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i',$useragent)||preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i',substr($useragent,0,4)))
    header('Location: http://demonstrationsite.com/mobile');
    ?>

Though it works, it will not redirect to a specific page, even if I change the Location to:

 http://m.demonstrationsite.com/[[~[[*id]]]]

No matter how I try, It will simply redirect to the home page, which isn't good if you're trying to leverage social media for marketing...you simply can't send someone to scour through a pile of articles now can you?

So, my question is this; as a front end designer who trembles at the thought of treading where the big kids play with PHP, I can't seem to integrate the two so that in the future, as the code from DetectMobileBrowser updates, I can simply update the Mobile_redirect snippet. I would love to keep an updated device list as provided by DetectMobileBrowser, but with the functionality of the original Brainhandles code.

Any help on this would be so very, very, very appreciated. Heck, even if you could post an updated Mobile_redirect snippet with the detectmobilebrowser dot com code so that I could see the logic would make me forever in debt to you and I would immediately share it with the entire Modx community!

Cheers

1
Try m.demonstrationsite.com/YourId I am assuming YourId is $mid. So, header("Location: http://demonstrationsite.com/$mid");Ersan J Sano

1 Answers

0
votes

This is not so hard to change original snippet. Try rewritten version:

<?php
/*     Mobile_redirect
       01/28/11    1:40 pm cet
       01/28/11    6:14 am est
       11/24/09   10:31 am est

       original code: http://www.brainhandles.com/techno-thoughts/detecting-mobile-browsers
       usage: call in the top of your template
       [[!Mobile_redirect? &mID=`1`]]
       [[!Mobile_redirect? &url=`http://redirectdomain.com`]]
       [[!Mobile_redirect? &exclude=`iPad`]]

       link back to main page:
       add &views=1 to the link
       ex: <a href="http://yourmaindemonstrationsite.com?views=1">Link Back to Main site</a>
*/

// set the MODx document ID of the mobile page
$mid = isset($mID) ? $mID : "";

// set the url you want to redirect to
// http://domain.com   or   http://sub.domain.com
$url = isset($url) ? $url : 'http://m.demonstrationsite.com';

// add any names you want to exclude
$exclude = isset($exclude) ? explode(',', $exclude) : array();

if(isset($_GET['views']) || $_SESSION['views'] =='1'){
    $_SESSION['views'] = 1;
}else{
    $useragent=$_SERVER['HTTP_USER_AGENT'];
    if(preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i',$useragent)||preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i',substr($useragent,0,4))) {
        if($mid =="" && $url !=""){
            header("Location: ".$url."");
        }else{
            $goto = $modx->makeUrl($mid);
            $modx->sendRedirect($goto);
        }
    }
}