CodeIgniter - список файлов и папок, использующих opendir

Я довольно плохо знаком с некоторыми методами программирования. Очень плохо знакомы с ООП и MVC в целом. И я уверен, что это мой первый вопрос Stackru!

Я только что скачал CodeIgniter и у меня есть небольшой проект.

У меня есть список файлов и папок на сервере, и я хотел бы использовать opendir, readdir, closedir и т. Д., Чтобы перечислить их на веб-странице в ul и li - я делал это ранее в процедурном режиме, но не имею Идея, где даже начать с CodeIgniter.

Есть ли помощник или библиотека, которая уже делает это? Если нет, то какой метод лучше? Должен ли я поместить свой код в папку модели?

Так неловко!

4 ответа

Я надеюсь, что вы узнали об архитектуре MVC уже в прошлом году:)

Теперь о вашем вопросе. Этот помощник или библиотека, о которой вы просили, действительно существует. Для той же самой "проблемы" я использовал вспомогательный каталог и его функцию directory_map("относительный / путь / к / вашему / каталогу"). Эта функция рекурсивно получает содержимое из вашего каталога и сортирует его в массив следующим образом

    Array
    (
    [banner] => Array
        (
        [0] => banner1.jpg
        [1] => banner2.jpg
        [2] => banner3.jpg
        [3] => banner4.jpg
        )
    [galerie] => Array
        (
        [0] => 0-PB083393.JPG
        [1] => DSCN2897.JPG
        [2] => DSCN2908.JPG
        [3] => DSCN2917.JPG
        [thumb] => Array
            (
                [0] => 0-PB083393_thumb.JPG
                [1] => DSCN2897_thumb.JPG
                [2] => DSCN2908_thumb.JPG
            )
        )
    [0] => mapa.jpg
    )

что довольно удобно, и вы можете использовать его, например, в цикле foreach и добавлять теги ul / li.

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

Ха. Это смешно. Я искал что-то еще и наткнулся на свой первый в мире вопрос о КИ, не осознавая, что это был я:D

Я зашел так далеко с КИ менее чем за месяц.

Я нашел Справочник Справочника - directory_map, который в основном помещает вашу структуру папок в массив массивов.

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

http://ellislab.com/codeigniter/user-guide/helpers/directory_helper.html

Во-первых, добро пожаловать в CodeIgniter. Это правила. Сейчас...

Вам нужна функция контроллера для фактической обработки каталога, подобная этой:

public function dir_to_array($dir, $separator = DIRECTORY_SEPARATOR, $paths = 'relative') 
{
    $result = array();
    $cdir = scandir($dir);
    foreach ($cdir as $key => $value)
    {
        if (!in_array($value, array(".", "..")))
        {
            if (is_dir($dir . $separator . $value))
            {
                $result[$value] = $this->dir_to_array($dir . $separator . $value, $separator, $paths);
            }
            else
            {
                if ($paths == 'relative')
                {
                    $result[] = $dir . '/' . $value;                    
                }
                elseif ($paths == 'absolute')
                {
                    $result[] = base_url() . $dir . '/' . $value;
                }
            }
        }
    }
    return $result;
} 

Теперь вам нужно вызвать эту функцию, чтобы получить результаты, похожие на:

$modules['module_files'] = $this->dir_to_array(APPPATH . 'modules');

Это поместит результаты в переменную с именем $modules, которую вы можете использовать любым удобным вам способом, как правило, в таком виде:

$this->load->view('folder/file', $modules);

Если вы предоставите необязательный третий параметр TRUE для функции load->view, результат этого представления снова будет возвращен вам для использования в любом месте, в противном случае он будет отображаться там, где вы его вызываете. Вид может выглядеть примерно так:

<?php

    if (isset($module_files) && !empty($module_files))
    {
        $out = '<ul>';
        foreach ($module_files as $module_file)
        {
            if (!is_array($module_file))
            {

                // the item is not an array, so add it to the list.
                $out .= '<li>' . $module_file . '</li>';
            }
            else
            {
                // Looping code here, as you're dealing with a multi-level array.
                // Either do recursion (see controller function for example) or add another
                // foreach here if you know exactly how deep your nested list will be.
            }
        }
        $out .= '</ul>';
        echo $out;
    }

?>

Я не проверял это на синтаксические ошибки, но он должен работать нормально. Надеюсь это поможет..

Если бы я делал это, я бы:

(1) Создайте класс библиотеки с методом, который принимает имя каталога и возвращает массив файлов.

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

(3) Затем я загружал бы представление, передавая массив имен файлов в представление, где я собирал список.

Начните с изучения того, как использовать контроллер для загрузки представления с данными (начните со статического массива). Затем узнайте, как создать библиотеку и интегрировать ее с вашим контроллером.

Вы также можете прочитать о библиотеке помощника по файлам CodeIgniter, если не хотите использовать встроенные функции PHP.

Также узнайте о модульном тестировании PHP.

Я склонен использовать модели для работы с данными из баз данных MySQL. В вашем случае вы имеете дело с информацией о вашей файловой системе.

Удачи, CI - хороший выбор для среды PHP/MySQL!

Другие вопросы по тегам