PHP kullanarak birden çok dizin belirli dosya adı eklemeyin nasıl

3 Cevap php

Ben bir klasör yapısı içinde belirli 'admin view' dosyaları dahil etmek için çalışıyorum. Ben aşina olduğum / gerektiren veya ardışık bir klasör eklemek için nasıl, ama yapmam gereken bütün her dizinden bir dosya adı dahil olan dahil - admin_view.php dosyası.

Yani, benim dir. yapısı bu gibi görünüyor:

Var Dosya kökünde içerir.

 - 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

Özyinelemeli biz ana 'tip' klasöründeki dizinleri ekleme ve çıkarma başlayıncaya kadar dosyaları .., çalışma alışkanlık ve bunları el ince işleri dahil olmak üzere gördüğünüz gibi .. o zaman, biz el ile tüm dahil kodlarını düzenlemek zorunda .. yani, ben bir fonksiyonu bulmak umuduyla, ya da pasajı, bana 'tip' dizini ile al dizinlere bakmak sağlayacak ve sadece belirli bir dosya adı (admin_view.php) şunlardır am

Bu şimdiye kadar biraraya getiren şey buydu, ama işe yaramıyor ...: (

$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;
        }
    }
}

Thanks so much! This place is an awesome resource.. and I really appreciate all the knowledge, correction, clarification, etc. that it provides the development community! J

EDIT:

I was able to get the view files loaded with this.. but I have a feeling that there's a better way to do this:

foreach (glob($view_name) as $filename) { include $filename; } ?>

CLARIFICATION

Ben ana belge ... hatası için özür dahil etmek .. sadece php dosyaları Sınıfları yüklerken değilim ben .. __ özdevinimli_yükle işlevini kötüye, ben :) öğrenme yaşıyorum

3 Cevap

Sizin kod tek sorun, ama bu kontrol eğer emin değil:

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

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

Eğer klasör isimleri $modulesDir bir / ile biten değil

Eğer file_exists($directory . $view_name), aslında adında bir dosya için kontrol ediyoruz ne zaman

ROOT_DIR.'mods/typeadmin_view.php'

ve ne istediğini değil

ROOT_DIR.'mods/type/admin_view.php'

Edit:

__autoload($name) kullanımı ile ilgili akılda tutulması gereken bir şey var:

Dan PHP Documentation: Autoloading Classes:

You may define an __autoload function which is automatically called in case you are trying to use a class/interface which hasn't been defined yet.

Bu sınıfları kullanarak veya kullandığınız sınıflar zaten eğer 'dahil' değilseniz, denilen olmayacak anlamına gelir.

Eğer sınıfları kullanarak ya da eğer senin soru, o __autoload() uygun değildi kullanımınız benziyordu Tho bile, ilk bakışta belli değildi.

One way or the other, your approach of using glob("/path/*/file.php") seems good.
It is simple, clear and gets the job done.
Unless you find an specific problem with it, you should be good to go.

You can use the SPL's RecursiveDirectoryIterator to iterate over all files in a directory and its subdirectories.
Then you can use a class extending FilterIterator to limit the result to specific files.

örneğin

<?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;
}