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!