【问题标题】:CodeIgniter Mobile Site RoutesCodeIgniter 移动站点路由
【发布时间】:2013-03-01 20:15:37
【问题描述】:

我的网站“site.xyz.com”被 iframe 编入客户的主网站“abc.com”。客户希望在 iframe 中加载我的网站的移动版本,并且他们想决定哪个用户需要查看我们网站的移动版本,因此他们请求了类似 site.xyz.com/mobile 的链接加载移动网站。

我的站点已经在 CodeIgniter 中构建,服务器上不允许使用 .htaccess。移动网站具有相似的 html,但大小和图像会略有不同。所以我打算为移动网站使用相同的 MVC 结构但不同的样式表。我要检查它是否是移动网站。对 site.xyz.com/mobile 的任何访问都应显示移动版本。

我尝试了$route['mobile/(:any)'] = '$2';,但在我使用base_url() 的代码中,它回显的是site.xyz.com/products 而不是site.xyz.com/mobile/products。确定查看者是否正在查看网站的桌面/移动版本也很重要。

我不打算依赖会话/cookie 并根据这些变量设置样式表。未来的访问可能是一个问题。

看起来很简单,但没有得到正确的想法......有什么技巧可以让我完成这项工作吗?

【问题讨论】:

    标签: codeigniter url mobile routes


    【解决方案1】:

    您可以创建自己的base_url() 函数,通过检查uri_string() 返回的内容来检查用于查看该页面的网址,从而检测用户是否正在查看移动网站。

    内部application/helpers/url_helper.php

    if ( ! function_exists('base_url'))
    {
        /**
         * Base URL
         *
         * Create a local URL based on your basepath.
         * Segments can be passed in as a string or an array, same as site_url
         * or a URL to a file can be passed in, e.g. to an image file.
         *
         * @param   string
         * @return  string
         */
        function base_url($uri = '')
        {
            $currentUri = uri_string(); // Get current URI 
            $currentUri = rtrim($currentUri,'/').'/'; // make sure $uri ends in a '/'
            // If the string begins with 'mobile/', 
            // prepend it to the given array/string
            if(strpos($currentUri,'mobile/') === 0)
            {
                if(is_array($uri)))
                    array_unshift($uri,'mobile');
                else
                    $uri = 'mobile/'.$uri;
            }
    
            $CI =& get_instance();
            return $CI->config->base_url($uri);
        }
    }
    

    【讨论】:

    • 这实际上是一个好主意,可以引用 URL 并动态更改 CSS。难道他还必须让他的路线匹配吗?
    • 我相信它应该可以工作,因为他已经尝试过使用$route['mobile/(:any)'] = '$2'; 并且它可以工作,只是base_url() 会给出一个错误的网址。
    • 好电话,错过了那部分。我将来可能会使用它。好建议。
    • 我添加了这个函数,但是,base_url 现在缺少末尾的“/”。我的 html 代码是<script src="<?=base_url()?>js/default.js" type="text/javascript"></script>,它返回为<script src="http://site.xyz.com/mobilejs/default.js" type="text/javascript"></script>;而不是site.xyz.com/mobile/js/default.js,我尝试将.'/'附加到$uri,但仍然返回相同的结果。网站上有很多视图文件,我的网站上提到了base_url()
    • 通常你会做base_url('js/default.js')。尾部的斜杠可能会被最后一行删除:$CI->config->base_url($uri);
    【解决方案2】:

    执行此操作的一种可能(不是完全漂亮)的方法是在您的控制器文件夹中有一个名为“mobile”的子文件夹。然后,您基本上可以将所有控制器复制到该目录中,并更改路径/逻辑以适合您的移动站点。

    根据CodeIgniter's docs,如果控制器位于子文件夹中,则路由将呈现为 *base_url/subfolder/controller/method*。如果您使用模板,您可以加载与普通站点相同的视图,只需在 mobile 文件夹内的控制器中加载 mobile_template.php。

    看起来工作量超出了您的预期,但您可能需要对您的移动网站做更多的事情,而不仅仅是更改 CSS 文件。

    【讨论】:

    • Devin - 我之前确实考虑过这个选项,但不想朝那个方向发展。但是,出于对学习的好奇,一个问题 - 我的代码中有很多路线条件,例如$route['thanks'] ='cart/thanks';,是否会有类似$route['(:any)/thanks'] ='$1/cart/thanks'; 这样的东西,这样我就不必单独复制每条路线,但是因为目前,他们没有从控制器中的移动子文件夹中拉入。
    • 可以理解,但您可能没有更好的选择。根据 URL 参数动态加载 CSS 文件本身就很困难,但试图通过仅更改 CSS 文件来使移动网站看起来稳定则更加困难。
    • CSS 更改无论如何我都必须这样做。但我想做的是不复制当前的 MVC 代码,看看是否有任何方法可以使用路由对其进行调整并提供更清晰的代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    相关资源
    最近更新 更多