Я не уверен, правильно ли я это истолковываю, но, пожалуйста, поправьте меня. Я использую класс загрузчика Code Igniter для загрузки «пакета» приложения. По большей части работает нормально. Тем не менее, одна вещь, которая сбивает меня с толку, - это то, как пути представления работают (или не работают).
В документации (http://codeigniter.com/user_guide/libraries/loader.html), написано:
"По умолчанию пути к файлам представлений пакетов устанавливаются при вызове add_package_path (). Пути к представлениям циклически повторяются, и при обнаружении совпадения это представление загружается.
В этом случае возможно возникновение коллизий именования в пакетах и, возможно, некорректный загружаемый пакет. Чтобы избежать этого, установите необязательный второй параметр FALSE при вызове add_package_path (). "
Это пример кода, который они дают:
$this->load->add_package_path(APPPATH.'my_app', TRUE);
$this->load->view('my_app_index'); // Loads
$this->load->view('welcome_message'); // Will not load the default welcome_message b/c the second param to add_package_path is TRUE
// Reset things
$this->load->remove_package_path(APPPATH.'my_app');
// Again without the second parameter:
$this->load->add_package_path(APPPATH.'my_app', TRUE);
$this->load->view('my_app_index'); // Loads
$this->load->view('welcome_message'); // Loads
Я думаю, что в примере кода есть опечатка, и они означают, что передают FALSE во второй вызов add_package_path (). Моя интерпретация этого заключается в том, что, если вы передадите значение FALSE, путь к просмотру пакета должен быть пропущен и должен использоваться исходный путь к просмотру.
Однако, когда я фактически пытаюсь передать значение FALSE, я все еще получаю представление из внешнего пакета (имя представления существует как во внешнем пакете, так и в текущем приложении). Если посмотреть на класс Loader в /system/core/Loader.php, это определение add_package_path ():
public function add_package_path($path, $view_cascade=TRUE)
{
$path = rtrim($path, '/').'/';
array_unshift($this->_ci_library_paths, $path);
array_unshift($this->_ci_model_paths, $path);
array_unshift($this->_ci_helper_paths, $path);
$this->_ci_view_paths = array($path.'views/' => $view_cascade) + $this->_ci_view_paths;
// Add config file path
$config =& $this->_ci_get_component('config');
array_unshift($config->_config_paths, $path);
}
Что он делает, так это добавляет путь представления пакета в начало массива путей просмотра со значением TRUE или FALSE. В функции, которая фактически загружает представления, также в классе Loader и называется _ci_load ($ _ ci_data), это сегмент, в котором выбирается путь представлений для просмотра:
foreach ($this->_ci_view_paths as $view_file => $cascade)
{
if (file_exists($view_file.$_ci_file))
{
$_ci_path = $view_file.$_ci_file;
$file_exists = TRUE;
break;
}
if ( ! $cascade)
{
break;
}
}
Мне кажется, что если представление существует во внешнем пакете (поскольку оно будет в начале массива из вызова add_package_path), оно будет загружено независимо от того, равен ли второй параметр в add_package_path значению TRUE или FALSE , Там не так много документации по этому вопросу, и я не видел отчетов об ошибках, поданных за это. Опять же, моя интерпретация заключается в том, что если 2-й параметр, переданный в add_package_path (), имеет значение FALSE, путь просмотра пакета должен быть пропущен. Я думаю, что в _ci_load () внутри проверки каскада должно быть продолжение, а не перерыв, и это должно предшествовать проверке файла.
Это ошибка, о которой я должен сообщить, или я что-то здесь неправильно интерпретирую, и функция работает так, как должна быть?