Как включить конкретное имя файла из нескольких каталогов, используя PHP - PullRequest
1 голос
/ 05 декабря 2009

Я пытаюсь включить определенные файлы 'admin view' в структуру папок. Я знаком с include / require или как рекурсивно включать папку, но все, что мне нужно сделать, это включить одно имя файла из каждого каталога - файл admin_view.php.

Итак, мой реж. Структура выглядит так:

Файл для включения находится в корневом каталоге.

 - mods
  - type
    -- type1
       -admin_view.php
       -other files I do not need included
    -- type2
       -admin_view.php
       -other files I do not need included
    -- type3
       -admin_view.php
       -other files I do not need included

Как вы можете видеть, рекурсивное включение файлов не работает, и ручное включение их работает нормально, ... пока мы не начнем добавлять и удалять каталоги из основной папки "type" ... тогда мы должны вручную редактировать все включаемые файлы. коды ... так что я надеюсь найти функцию или фрагмент, который позволит мне просматривать все каталоги с каталогом 'type' и включать ТОЛЬКО определенное имя файла (admin_view.php)

Это то, что я пока собрал, но это не работает ...: (

$modulesDir = array (
    ROOT_DIR.'mods/type',

);
$view_name = "admin_view.php";

function __autoload($view_name) {
    global $modulesDir;
    foreach ($modulesDir as $directory) {
        if (file_exists($directory . $view_name)) {
                require_once ($directory . $view_name);
                return;
        }
    }
}

Большое спасибо! Это замечательный ресурс ... и я очень ценю все знания, исправления, разъяснения и т. Д., Которые оно предоставляет сообществу разработчиков! J

EDIT:

Мне удалось загрузить файлы представлений с этим ... но у меня есть ощущение, что есть лучший способ сделать это:

ПОЯСНЕНИЯ

Я неправильно использовал функцию __autoload ... так как я НЕ загружаю классы ... просто файлы php для включения в основной документ ... извините за ошибку, я учусь:)

Ответы [ 3 ]

1 голос
/ 05 декабря 2009

Не уверен, что это единственная проблема в вашем коде, но проверьте это:

$modulesDir = array (
    ROOT_DIR.'mods/type',
);

if (file_exists($directory . $view_name)) { ... }

Вы не заканчиваете имена папок в $modulesDir на /

Когда вы делаете file_exists($directory . $view_name), вы фактически проверяете файл с именем

ROOT_DIR.'mods/typeadmin_view.php'

а не то, что вы хотели

ROOT_DIR.'mods/type/admin_view.php'

Edit:

Что касается использования __autoload($name), следует иметь в виду следующее:

С PHP Документация: автозагрузка классов :

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

Это означает, что если вы не используете классы или если используемые вами классы уже включены, он не будет вызван.

Судя по вашему вопросу, на первый взгляд неясно, использовали ли вы классы или нет, даже если выглядело, как вы используете __autoload(), неуместно.

Так или иначе, ваш подход к использованию glob("/path/*/file.php") кажется хорошим.
Это просто, понятно и выполняет свою работу.
Если вы не обнаружите в ней конкретной проблемы, вам следует идти.

1 голос
/ 05 декабря 2009

Вы можете использовать SPL's RecursiveDirectoryIterator для перебора всех файлов в каталоге и его подкаталогах.
Затем вы можете использовать класс, расширяющий FilterIterator , чтобы ограничить результат определенными файлами.

, например

<?php
class EndsWithFilterIterator extends FilterIterator {
  protected $s;
  public function __construct($s, $it) {
    parent::__construct($it);
    $this->s = $s;
  }

  public function accept() {
    $c = parent::current();
    return false!==stripos($c, $this->s, strlen($c)-strlen($this->s));
  }
}


$directory = 'type/';
$it = new EndsWithFilterIterator('admin_view.php',
  new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory))
);
foreach($it as $f) {
  echo $f, "\n";
  // require_once $f;
}
0 голосов
/ 05 декабря 2009

__autoload используется для автоматического включения класса загрузки.

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

Я не вижу никакого кода, создающего объект в вашем коде, если вы посмотрите на PHP __autoload, они предоставляют этот пример.

<?php
function __autoload($class_name) {
    require_once $class_name . '.php';
}

$obj  = new MyClass1();
$obj2 = new MyClass2(); 
?>

Если вы ищете включение представления при создании объекта контроллера, что-то вроде этого должно работать, ваш контроллер должен иметь имя, например foobarController, чтобы это работало должным образом.

$modulesDir = array (
    ROOT_DIR.'mods/type',

);
$view_name = "admin_view.php";

function __autoload($class_name) {
    global $modulesDir;
    if(preg_match('/(\w+)Controller/', $class_name, $match)){
      $class = $match[1];
      // TODO: include the class definition
      // require CONTROLLER_DIR . $class_name . '.php';
      foreach ($modulesDir as $directory) {
        if (file_exists($directory . strtolower($class) . '_view.php')) {
                require_once ($directory . strtolower($class) . '_view.php');
                return;
        }
      }
    }
}

$adminController = new AdminController();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...