DirectotyFilter accept() van RecursiveFilterIterator

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

12/08/2015 12:17:56
Quote Anchor link
Hoi Allen,

Ik ben bezig met mijn Delistio.us project maar loop nu tegen een probleem.

In het project bestaat een DirectoryFilter waarin ik mappen en bestanden kan filteren, althans als het werkte.
Ik laadt via de constructor de RecursiveIterator die dan ook waarde bevat van de map waarover geitereerd wordt.

Maar nu wil ik filteren wat ik via de setFilters() heb opgegeven.

De waardes uit de setFilters() zijn gewoon arrays die vanuit een yml bestand komen en dus irelevant zijn voor nu.

Voor het voorbeeld wil ik het bestand .DS_Store filteren wat dus niet lukt.
Ik gebruik de accept() method die van de RecursiveIterator class komt op basis hiervan kan ik, hopelijk, zeggen wat wel en niet in de lijst mag komen staan.

Het resultaat is nu dat hij helemaal niets filtert en alles gewoon lekker erbij zet.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php

namespace Delistious;

use ArrayIterator;
use Exception;
use FilesystemIterator;
use IteratorAggregate;
use RecursiveCallbackFilterIterator;
use RecursiveDirectoryIterator;
use RecursiveIteratorIterator;

/**
 * Class DirectoryReader
 */

class DirectoryReader implements IteratorAggregate
{
    /**
     * @var
     */

    private $directoryPath;


    public function __construct(array $config)
    {

        $this->directoryPath        = $config['directory'];
        $this->directoryBlackList   = $config['directoryBlackList'];
        $this->filesBlackList       = $config['filesBlackList'];

        if( ! is_dir($this->directoryPath)) {
            throw new Exception("Directory <code>{$this->directoryPath}</code> doesn't exist");
        }
    }


    /**
     * @return RecursiveDirectoryIterator
     */

    public function getIterator()
    {

        $result     = array();

        $directoryIterator = new RecursiveDirectoryIterator(
                $this->directoryPath,
                RecursiveDirectoryIterator::SKIP_DOTS
        );

        $filter = new DirectoryFilter($directoryIterator);
        $filter->setFilters($this->directoryBlackList, $this->filesBlackList);

        $iteration = new RecursiveIteratorIterator(
            $filter,
            RecursiveIteratorIterator::SELF_FIRST,
            RecursiveIteratorIterator::CATCH_GET_CHILD
        );

        $iteration->setMaxDepth(1);


        foreach ($iteration as $path => $directory) {
           $result[] = $directory;
        }


        return new ArrayIterator($result);
    }
}

?>


Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php

namespace Delistious;

use RecursiveFilterIterator;
use RecursiveIterator;

/**
 * Class DirectoryFilter
 */

class DirectoryFilter extends RecursiveFilterIterator
{
    /**
     * @var array
     */

    private $blackList = [];

    /**
     * @var array
     */

    private $skippedItems = [];

    public function __construct(RecursiveIterator $iterator)
    {

        parent::__construct($iterator);
    }


    public function setFilters(array $configBlacklist, array $configSkippedItems)
    {

        $this->blackList    = $configBlacklist;
        $this->skippedItems = $configSkippedItems;
    }


    /**
     * @return bool
     */

    public function accept()
    {

        if ( in_array($this->current()->getFilename(), $this->skippedItems)) {
            return false;
        }


        return true;
    }
}

?>
 
PHP hulp

PHP hulp

23/04/2024 09:27:04
 
Richard Snijders

Richard Snijders

12/08/2015 12:32:02
Quote Anchor link
Heb je al gedebugt wat jouw overschreven accept() methode doet? Ik twijfel namelijk een beetje aan de waarde van getFilename() (moet fileName niet camel-cased zijn trouwens?)
Je zou kunnen var_dumpen wat de waarde is van de expressie in accept(), de waarde van getFilename() en de waarde van skippedItems. Als dat allemaal klopt, weet je dat de fout niet in de Iterator zit. Als het niet klopt, dan heb meteen de oorzaak van het probleem :)

Daarna kun je natuurlijk gewoon return !in_array($this->current()->getFilename(), $this->skippedItems); schrijven :)
 

12/08/2015 12:37:38
Quote Anchor link
Richard, ik ging even twijfelen.
Maar nee het klopt echt haha
http://php.net/manual/en/splfileinfo.getfilename.php

Verder als ik var_dump kreeg ik de bestandsnaam netjes te zien maar het lijkt wel of hij het niet accept ofzo?
Het is toch zo dat de accept method een true of false moet terugeven? Althans dat las ik wel dacht ik zo.

Jullie kunnen het ook clonen, zal een branch aanmaken hiervoor.
git clone -b phphulp [email protected]:rickdgraaff/delistious.git

Check de branch "phphulp" uit
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.