Získávání komponent z ComponentCon­taineru

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
romansklenar
Člen | 655
+
0
-

Mějme ComponentContainer naplněný komponentama přes $this->addComponent($component, $name);

Debug::dump($this->components);

vypíše:

object(RecursiveComponentIterator) (3) {
  "colName1" => object(DataGridColumn) (11) {
    ...
  }
  "colName2" => object(DataGridColumn) (11) {
    ...
  }
  "colName3" => object(DataGridColumn) (11) {
    ...
  }
}

Takže container je naplněn třema componentama DataGridColumn (potomkem Component), ještě zkontroluju jednou přes getComponents().

Debug::dump($this->getComponents(FALSE));

vypíše:

object(RecursiveComponentIterator) (3) {
  "colName1" => object(DataGridColumn) (11) {
    ...
  }
  "colName2" => object(DataGridColumn) (11) {
    ...
  }
  "colName3" => object(DataGridColumn) (11) {
    ...
  }
}

Což sedí, když chci ale získat DataGridColumn-y přes určení filtru pomocí názvu třídy

Debug::dump($this->getComponents(FALSE, 'DataGridColumn'));

dostanu kůlové…

object(InstanceFilterIterator) (1) {
  "type" private => string(14) "DataGridColumn"
}

Je v tom něco opomenutého? Protože na formulářích to funguje bezvadně.

EDIT: při posledním volání doběhne kód zde kde do konstruktoru InstanceFilterIterator-u vstupují oba parametry se správnýma hodnotama, ven už však vyleze to co je na posledním dumpu (prázdný InstanceFilterIterator) – metoda InstanceFilterIterator::accept() neproběhne.

LM
Člen | 206
+
0
-

Projdi to foreachem a uvidíš že to ty tři komponenty vrátí, ale malá chyba tam asi bude a to že FilterIterator nejde dumpovat.

romansklenar
Člen | 655
+
0
-

Fakt, že jo… díky za nakopnutí… taková blbá chyba a tolik času v háji…

romansklenar
Člen | 655
+
0
-

Jen si doplním pro sebe, že nejde použít ani count:

  • count na FilterIterator – vrací za všech okolností 1
  • count na FilterIterator::getInnerIterator – vrací zase počet všech prvků
David Grudl
Nette Core | 8284
+
0
-

Mělo by fungovat

count(iterator_to_array($this->getComponents(FALSE, 'DataGridColumn')))

ale pravda, count() by mohlo vyhodit výjimku NotSupportedException (ovšem je to spíš na tvůrce SPL)