Путь (и) просмотра сторонних_партий Проверить в CodeIgniter 3

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

Обычно я проверял бы, существует ли представление с помощью is_file(APPPATH.'/views/folder/'.$view)

Я могу получить все загруженные сторонние пути с помощью get_package_paths (спасибо комментарий Tpojka), а затем проверьте в своих папках, существует ли файл,

но я надеялся на "прямую" проверку, как если бы функция ->view вернула false вместо перенаправления на страницу с ошибкой

$html = $this->load->view($tpl,'',TRUE) ? $this->load->view($tpl,'',TRUE) : $another_template;

Хотя я понимаю, что может не быть других решений, которые добавляют эту ручную проверку с циклом через загруженные пути и скрывают ее в расширении класса CI_Load (application/core/MY_Loader), чтобы создать видимость прямой проверки в контроллере:

РЕДАКТИРОВАТЬ: Это плохая идея, потому что view() может возвращать false в функцию CI, которая может быть не предназначена для

class MY_Loader extends CI_Lodaer{

public function __construct() {

    parent::__construct();

}

public function view($view, $vars = array(), $return = FALSE)
{
    foreach( $this->get_package_paths( TRUE ) as $path )
    {
        // this will only retrieve html from the first file found
        if( is_file( $path."/views/".$view ) ) return parent::view($view, $vars, $return);
    }
    // if no match
    return false;
}
}

Что меня раздражает, так это то, что load->view уже выполняет проверку путей, поэтому это решение добавит вторую проверку и увеличит потребление сервера.


person Renard Masque    schedule 05.06.2016    source источник
comment
Может ли помочь get_package_paths?   -  person Tpojka    schedule 06.06.2016
comment
это хорошее начало, да, спасибо за подсказку! Тем не менее, я должен вручную проверять файлы в папке представления Third_Party, но это определенно упрощает пересечение результатов.   -  person Renard Masque    schedule 06.06.2016
comment
На самом деле, в конце концов, я думаю, что я буду делать; Хотя я надеялся, что возможна прямая проверка (возможно, с расширением окна загрузки...)   -  person Renard Masque    schedule 06.06.2016
comment
Я рад, что смог указать что-то полезное, хотя я не понимаю, почему вы не можете использовать is_file($file). Вы хотите загрузить файл пакета, если он существует, или файл основного вида, если файл пакета не существует?   -  person Tpojka    schedule 06.06.2016


Ответы (1)


Ну, в конце концов, я выбираю это теплое решение:

Вместо того, чтобы расширять функцию view(), чтобы она возвращала false (и иметь дело с ней через CI, а затем после!), я просто сделал функцию is_view() в application/core/MY_Loader.php

Я не уверен, что MY_Loader — это правильное место для размещения такой функции, но пока мне это помогло...

(спасибо Tpojka за указание)

в приложении/ядре/MY_Loader.php

/**
 * is_view
 *
 * Check if a view exists or not through the loaded paths
 *
 * @param   string          $view           The relative path of the file
 *
 * @return  string|bool     string          containing the path if file exists
 *                          false           if file is not found
 */
public function is_view($view)
{
    // ! BEWARE $path contains a beginning trailing slash !
    foreach( $this->get_package_paths( TRUE ) as $path )
    {
        // set path, check if extension 'php' 
        // (would be better using the constant/var defined for file extension of course)
        $path_file = ( strpos($view,'.php') === false ) ?  $path."views/".$view.'.php' : $path."views/".$view ;

        // this will return the path at first match found
        if( is_file( $path_file ) ) return $path."views/";
    }
    // if no match
    return false;
}

и в приложении/контроллерах/Welcome.php

$view = "frames/my_html.php";

/*
 *   the view file should be in 
 *   application/third_party/myapp/views/frames/my_html.php
 *   
 *   so far, if the file does not exists, and we try 
 *   $this->load->view($view) will redirect to an error page
*/

// check if view exists and retrieve path
if($possible_path = $this->load->is_view($view)) 
{
    //set the data array
    $data = array("view_path"=>$possible_path);

    // load the view knowing it exists
    $this->load->view($view,$data)
}
else echo "No Template for this frame in any Paths !";

и конечно на вид

<h1>My Frame</h1>
<p>
    The path of this file is <=?$view_path?>
</p>
person Renard Masque    schedule 10.06.2016