Хотите показать Дерево каталогов сервера (PHP) на стороне клиента, используя FLEX? - PullRequest
1 голос
/ 16 ноября 2010

Используя RecursiveDirectoryIterator из PHP, я могу создать дерево каталогов и даже выровнять его с помощью класса RecursiveIteratorIterator, но я хочу создать структуру дерева каталогов, которую понимает TREE-компонент flex.Ниже приведена структура массива в php, которую понимает flex.

array('label'=>'rootDirectory','children'=>array(array('label'=>'subFolder1','children'=>array(array('label'=>'file.jpg'))),array('label'=>'EmtptyFolder','children'=>array())));

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

1 Ответ

3 голосов
/ 16 ноября 2010

Вы можете настроить этот код в соответствии со своими потребностями.Это не решение для копирования и вставки, так как оно мне понадобилось для другого UseCase, но оно должно помочь вам по крайней мере на полпути реализовать собственное решение.Ключ заключается в настройке методов, которые RecursiveIteratorIterator будет вызывать при обходе дерева каталогов.

<?php
/**
* Prints a Directory Structure as an Nested Array
*
* This iterator can be used to wrap a RecursiveDirectoryIterator to output
* files and directories in a parseable array notation. Because the iterator
* will print the array during iteration, the output has to be buffered in
* order to be captured into a variable.
*
* <code>
* $iterator = new RecursiveDirectoryAsNestedArrayFormatter(
*     new RecursiveDirectoryIterator('/path/to/a/directory'),
*     RecursiveIteratorIterator::SELF_FIRST
* );
* ob_start();
* foreach($iterator as $output) echo $output;
* $output = ob_get_clean();
* </code>
*
*/
class RecursiveDirectoryAsNestedArrayFormatter extends RecursiveIteratorIterator
{
    /**
     * Prints one Tab Stop per current depth
     * @return void
     */
    protected function indent()
    {
        echo str_repeat("\t", $this->getDepth());
    }
    /**
     * Prints a new array declaration
     * return void
     */
    public function beginIteration()
    {
        echo 'array(', PHP_EOL;
    }
    /**
     * Prints a closing bracket and semicolon
     * @return void
     */
    public function endIteration()
    {
        echo ');', PHP_EOL;
    }
    /**
     * Prints an indented subarray with key being the current directory name
     * @return void
     */
    public function beginChildren()
    {
        $this->indent();
        printf(
            '"%s" => array(%s',
            basename(dirname($this->getInnerIterator()->key())),
            PHP_EOL
        );
    }
    /**
     * Prints a closing bracket and a comma
     * @return void
     */
    public function endChildren()
    {
        echo '),', PHP_EOL;
    }
    /**
     * Prints the indented current filename and a comma
     * @return void
     */
    public function current()
    {
        if ($this->getInnerIterator()->current()->isFile()) {
            printf(
                '%s"%s",%s',
                str_repeat("\t", $this->getDepth() +1),
                $this->getInnerIterator()->current()->getBasename(),
                PHP_EOL
            );
        }
    }
}

...