CodeIgniter 3.x - 使用用户输入重新加载具有不同CSS文件的视图

时间:2017-05-23 01:26:13

标签: php codeigniter codeigniter-3

问题:

我创建了一个静态页面视图(在自己的视图文件夹中),演示了新的Sakura.css框架。该框架带有四个CSS主题。我希望能够从链接列表中选择一个主题,并通过控制器重新加载与相关CSS主题文件相同的视图。 我还需要将视图默认为'standard.css'主题。最后,我想避免使用JavaScript / jQuery解决方案。

我正在努力掌握控制器功能名称,自定义路由和URI之间的关系。我认为我处于'aha'时刻的边缘,找到解决方案这个问题肯定会有所帮助。

当前代码:

注意:我还设置.htaccess从URL中删除index.php。

视图/樱/ index.php的

<!DOCTYPE html>

<html lang="en-us">
<head>
    <meta charset="utf-8">
    <title>Sakura Demo</title>

    <link rel="stylesheet" href="<?php echo asset_url() ;?>css/<?php echo $theme; ?>.css" media="screen" />
</head>
<body>
<header>
    <nav>
        <ul>
            <li><a <?php if (isset($theme) && ($theme = 'standard')) { echo 'class="current"'; } ?>href="<?php echo base_url('sakura/standard'); ?>">Standard</a></li>
            <li><a <?php if (isset($theme) && ($theme = 'dark')) { echo 'class="current"'; } ?>href="<?php echo base_url('sakura/dark'); ?>">Dark</a></li>
            <li><a <?php if (isset($theme) && ($theme = 'earthly')) { echo 'class="current"'; } ?>href="<?php echo base_url('sakura/earthly'); ?>">Earthly</a></li>
            <li><a <?php if (isset($theme) && ($theme = 'vader')) { echo 'class="current"'; } ?>href="<?php echo base_url('sakura/vader'); ?>">Vader</a></li>
        </ul>
    </nav>
</header>

<main>
    <h1>Sakura.css Demo</h1>
    <p>Sakura.css is a minimal css framework/theme that can be dropped into any project for an instantaneous modern-looking website.</p>
</main>

<footer>
    <p>Footer Text</p>
</footer>
</body>
</html>

控制器/ Sakura.php

<?php
class Sakura extends CI_Controller {

    public function theme($theme)
    {
        $data['theme'] = array(
            'standard' => "standard",
            'dark' => "dark",
            'earthly' => "earthly",
            'vader' => "vader"
        );

        $this->load->view('sakura/theme', $data);
    }
}

配置/ routes.php文件

<?php
$route['sakura/(:any)'] = 'sakura/$1';
$route['sakura'] = 'sakura';
$route['default_controller'] = 'pages/view';
$route['404_override'] = '';
$route['translate_uri_dashes'] = FALSE;

我能够让视图加载的唯一方法是在Sakura.php控制器中使用此功能:

public function index()
{
    $data['theme'] = "standard";

    $this->load->view('sakura/index', $data);
}

所需的网址结构:&lt; - 没必要,但会很棒!

默认视图:mywebsite.com/sakura/ - 或 - mywebsite.com/sakura/standard

主题视图:mywebsite.com/sakura/selected-theme

最后的想法:

提前感谢大家对此问题的任何帮助。我经常依赖StackOverflow社区,我非常感谢解决问题的时间和考虑。

2 个答案:

答案 0 :(得分:3)

只是一个猜测,但尝试类似......?

控制器

$css = $this->uri->segment(2);
$allowed_input = array('standard', 'dark', 'earthly', 'vader');
if ((isset($css)) && (!in_array($css, $allowed_input))) {
    echo 'Filthy human!';
}

$data['css'] = $css; // You can probably just do this above, it's just harder to type.

查看

<link rel="stylesheet" href="<?php echo asset_url() ;?>css/<?php echo (!isset($css) ? 'standard' : $css);?>.css" media="screen" />

路线

将第一行更改为:

$route['sakura/(:any)'] = 'sakura/index/$1';

然后mywebsite.com/sakura/standard应该可以工作,但是如果&#34;标准&#34;它不在那里,它默认加载标准。将in_array()位作为一个小的健全性检查,但您可能希望在验证中更加彻底。

答案 1 :(得分:1)

我认为你不需要处理实现它的路线。这就是我要解决的问题:

控制器(Sakura.php)

class Sakura extends CI_Controller {

    public function index()
    {
        $this->load->view('welcome_message');
    }

    public function theme($theme='standard') {
        $data['theme']=$theme;
        $data['main_content'] = 'sakura/sakura_view';
        $this -> load -> view('sakura/sakura_view', $data);
    }
}

请注意,我使用了public function theme($theme='standard'),因此如果第三个URI段上没有定义参数,则默认为标准。

查看(views / sakura / sakura_view.php)

<!DOCTYPE html>

<html lang="en-us">
<head>
    <meta charset="utf-8">
    <title>Sakura Demo</title>

    <link rel="stylesheet" href="<?php echo asset_url() ;?>css/<?php echo $theme; ?>.css" media="screen" />
</head>
<body>
<header>
    <nav>
        <ul>
            <li><a <?php if (isset($theme) && ($theme = 'standard')) { echo 'class="current"'; } ?>href="<?php echo base_url('sakura/standard'); ?>">Standard</a></li>
            <li><a <?php if (isset($theme) && ($theme = 'dark')) { echo 'class="current"'; } ?>href="<?php echo base_url('sakura/dark'); ?>">Dark</a></li>
            <li><a <?php if (isset($theme) && ($theme = 'earthly')) { echo 'class="current"'; } ?>href="<?php echo base_url('sakura/earthly'); ?>">Earthly</a></li>
            <li><a <?php if (isset($theme) && ($theme = 'vader')) { echo 'class="current"'; } ?>href="<?php echo base_url('sakura/vader'); ?>">Vader</a></li>
        </ul>
    </nav>
</header>

<main>
    <h1>Sakura.css Demo</h1>
    <p>Sakura.css is a minimal css framework/theme that can be dropped into any project for an instantaneous modern-looking website.</p>
</main>

<footer>
    <p>Footer Text</p>
</footer>
</body>
</html>