Изменение темы в Codeigniter - PullRequest
0 голосов
/ 31 января 2012

Я разрабатываю сайт с дополнительными возможностями, изменяя темы на стороне пользователя. Для этого я создал библиотеку. Я написал функцию в этой библиотеке для загрузки страницы header.php.

Это код моей библиотеки:

<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
    class CI_theme_lib {
        public $theme_dir       = "themes/winter";
        public $header_page     = "header.php";

        public function get_header($header = ""){
            $dir = $this->theme_dir;
            $hdr = $this->header_page;
            $this->CI =& get_instance();
            $string = $this->CI->load->view($dir.'/'.$hdr, '', true);
            return $string;

        }

    }
?>

В темах / зима - это папка моей темы, которую я хочу применить. И я создал контроллер для просмотра темы: Код контроллера:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class test extends CI_Controller {

    public  function  __construct() {

        parent::__construct();
        $this->load->library(array('theme_lib'));
    }
    public function index()
    {

        $this->load->view('themes/winter/index');
    }
    }
?>

А в темах / зима / index.php код:

<?php
    echo $res = $this->theme_lib->get_header();
?>

В header.php:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>title</title>
</head>

Поэтому, когда я использовал этот код, я получил сообщение об ошибке:

An Error Was Encountered

Unable to load the requested file: themes/winter/header.php

themes в корневой папке. Так как же загрузить страницу просмотра из каталога корневой папки, а не из каталога просмотра?

1 Ответ

1 голос
/ 31 января 2012

Краткий ответ: Вы не можете.Вы не можете этого сделать, чтобы сделать вещи чище, «системные» пути должны быть исправлены, чтобы у вас всегда были модели в папке моделей, представления в папке представлений и т. Д., И поэтому ваша структура всегда будет регулярной ипрактично.Представьте, что вы собираетесь поддерживать это приложение через несколько месяцев, когда вам нужно что-то изменить в представлении: где это было?Я помещал это в папку представлений w или где-нибудь еще?темы?пользовательские виды?какие бы ни были виды?

Хранение вещей строго разделенных помогает гарантировать, что ваше приложение будет согласованным и легко обслуживаемым от того, кто смотрит на код после вас.Даже если это вы сами, потому что легко забыть, что вы делали, когда даже в своем собственном коде.

Длинный ответ (включая решения): ну, на самом деле это может быть сокращено, чемвыше :), но если вы перейдете к строке 130 в файле system / core / loader.php (по крайней мере, в версии 2.1.0; в любом случае, это конструктор класса Loader), вы увидите следующее:

    $this->_ci_view_paths = array(APPPATH.'views/'  => TRUE);

, что означает, что вашему представлению всегда будет предшествовать жестко заданный путь к папке представления.

Решения?

[1] Вы можете удалить часть 'view /', но это будет означать, что вам нужно:

  1. , чтобы переписать каждый вид, который вы связываете, с помощью метода view() и добавить к нему view/, или ваше приложение будет непоправимо сломано;
  2. вам не нужно обновлять свой CI, или, если вы это сделаете, вам придется помнить, чтобы что-то изменить снова, иначе другой драматический отказ будетслучиться.

[2] Еще одна вещь, которую вы можете сделать, это создать другой путь,например,

    $this->_ci_themes_paths = array(APPPATH.'themes/'=> TRUE);

, а затем создайте метод, аналогичный методу view() класса загрузчика (если хотите, вызовите метод themes()), который будет работать точно так же (буферизация включена), так что у вас будет возможность вызывать

$this->load->themes('path/to/theme')

в вашем контроллере и загружать свои темы, сохраняя при этом возможность загрузки просмотра.Я определенно пойду на это решение, среди двух.Но все равно вам не нужно обновлять класс загрузчика или добавлять изменения, когда вы это делаете.Но, по крайней мере, вы не нарушите никакой основной функциональности.

Бонусный ответ для практических людей: почему бы просто не создать папку themes внутри папки view,и поместить все свои темы там?легко, чисто и без проблем :) 1048 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...