Как я могу сделать эту функцию динамической на основе обхода директории в явно известной папке, на которую есть ссылки? - PullRequest
0 голосов
/ 21 марта 2011

Сценарий, приведенный ниже, предназначен для получения каждой папки, определенной как «WIDGET», и перебора ее файлов, загрузки их содержимого в базу данных в качестве объекта виджета.

Это работает нормально, однако, как вы можете видеть ниже, для каждой папки внутри папки виджетов, для которой я хочу выполнить эту подпрограмму, мне нужно создать отдельную ветвь почти идентичного кода, заполнив оператор DEFINE командой жестко заданный путь к папке, содержащей содержимое виджета для этого объекта виджета. Например, имя_фолдера (WIDGET) и $ sidebar_id для этого объекта виджета (которые совпадают).

Поскольку я называю свои папки в каталоге «widgets», так же, как и мои зарегистрированные «виджеты» в базе данных, я хотел бы преобразовать эту процедуру в динамическую, которая зацикливается на каталогах внутри «widgets» "папка и для каждой найденной папки выполняет код, начинающийся с оператора DEFINE.

Как бы я преобразовал это в одну подпрограмму, которая выполняется для любой папки внутри папки "widgets"?

//Install Wigets
$sidebars_widgets = get_option('sidebars_widgets');
$widget_id = count($opts)+1;
$widget_ops = get_option('widget_text');

//1st Widget Area
//make this directory pointer dynamic based on which folder under widgets we are currently working on
DEFINE ('WIDGET', ABSPATH.'/wp-content/plugins/myplugin/widgets/home-header-area/'); 
$directory_widgets = new DirectoryIterator(WIDGET); 
foreach ($directory_widgets as $files_widgets) {
    if ($files_widgets->isFile()) {
        $file_name_widget = $files_widgets->getFilename();
        $widget_text = file_get_contents(WIDGET. $file_name_widget);
        $sidebar_id = 'home-header-widget'; //make this dynamic based on the current foldername in the loop
        $sidebars_widgets[$sidebar_id] = array("text-".$widget_id);
        $widget_ops[$widget_id] = array('title' => $files_widgets->getBasename('.txt'),'text' => $widget_text,);
        update_option('widget_text', $widget_ops);  
        update_option('sidebars_widgets', $sidebars_widgets);
    }
}

//2nd Widget Area
//make this directory pointer dynamic based on which folder under widgets we are currently working on
DEFINE ('WIDGET', ABSPATH.'/wp-content/plugins/myplugin/widgets/inside-header-area/');
$directory_widgets = new DirectoryIterator(WIDGET); 
foreach ($directory_widgets as $files_widgets) {
    if ($files_widgets->isFile()) {
        $file_name_widget = $files_widgets->getFilename();
        $widget_text = file_get_contents(WIDGETS. $file_name_widget);
        $sidebar_id = 'inside-header-widget'; //make this dynamic based on the current foldername in the loop
        $sidebars_widgets[$sidebar_id] = array("text-".$widget_id);
        $widget_ops[$widget_id] = array('title' => $files_widgets->getBasename('.txt'),'text' => $widget_text,);
        update_option('widget_text', $widget_ops);  
        update_option('sidebars_widgets', $sidebars_widgets);
    }
}

Обновлен код с ответом Чарльза:

$base = dirname(__FILE__).'/widgets/';
$rdi = new RecursiveDirectoryIterator($base);
foreach(new RecursiveIteratorIterator($rdi) as $files_widgets) 
    {
     if ($files_widgets->isFile()) 
         {
            $file_name_widget = $files_widgets->getFilename();
            $widget_text = file_get_contents($base . [current directory?] .$file_name_widget);
//NOT SURE IF THIS IS IT OR NOT. I NEED THE CURRENT PARENT DIRECTORY'S NAME
            $sidebar_id = $files_widgets->getBasename(); //make this dynamic based on the current foldername in the loop
            $sidebars_widgets[$sidebar_id] = array("text-".$widget_id);
            $widget_ops[$widget_id] = array('title' => $files_widgets->getBasename('.txt'),'text' => $widget_text,);
            update_option('widget_text', $widget_ops);  
            update_option('sidebars_widgets', $sidebars_widgets);
        }
    }

1 Ответ

1 голос
/ 22 марта 2011

Как бы я преобразовал это в одну процедуру, которая выполняется для любой папки внутри папки "widgets"?

Ну, вы уже используете DirectoryIterator, так что, вероятно,безопасно для вас рассмотреть RecursiveDirectoryIterator.Его можно использовать для перебора всех объектов файловой системы в данном родительском каталоге и всех его подкаталогов.

$base = '/path/to/whatever';
$rdi = new RecursiveDirectoryIterator($base);
foreach(new RecursiveIteratorIterator($rdi) as $files_widgets) {
// Your same foreach contents go here.
}

Просто прекратите использовать константу в пользу переменной.Я использовал $base в примере.


, если я ожидаю, что в папке $ base будет только одно поколение дочерних папок (без дальнейшей вложенности папок), мне все еще нужноRecursiveDirectoryIterator?

Вам нужно это?Нет, но вы все еще можете использовать это.Например, если вы только когда-либо хотите иметь дело с первым уровнем, тогда вы можете установить глубину рекурсии на уровне итератора:

$rdi = new RecursiveDirectoryIterator($base);
$rii = new RecursiveIteratorIterator($rdi);
$rii->setMaxDepth(1); // Or 2?  I dunno, actually.
foreach($rii as $files_widgets) {
// Your same foreach contents go here.
}

Как получить ссылку на текущее имя папки во время циклического перебора ее файлов?

В цикле $files_widgets является SplFileInfo , поэтому вы должны иметь возможность получить каталог, в котором находится файл, проверяя getPathname() или getRealPath() в зависимости от того, что вам нужно.

...