Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: RecursiveIteratorIterator - obsługa klasy - przechwycenie wyniku
Forum PHP.pl > Forum > PHP
wujek2009
Hej,

W sieci znalazłem klasę, która generuje drzewko z kategorii - w pakiecie z tą klasą była klasa, która wyświetla listę w postaci elementów UL, LI. Przerobiłem nieco pod swoje potrzeby i zrobiłem z tego listę select. Mój problem polega na tym, że chciałbym przechwycić te wyniki w postaci "return" - natomiast to działa tylko jeśli w dekonstruktorze jest "echo" - więc wywołanie samego budowania drzewka wygląda następująco:
  1. foreach ($it as $k => $v) {}


Właściwie nie trzeba nic więcej robić - samo się wyrenderuje - dodam, że:

- $k - zwróci ID kategorii
- $v - zwróci obiekt NODE (z innej klasy)

Sama klasa, która renderuje widok wygląda tak:
  1. class JTree_JTreeRecursiveSelectIterator extends RecursiveIteratorIterator
  2. {
  3. /**
  4.   * @var _jTree the JTree object
  5.   */
  6. private $_jTree;
  7. /**
  8.   * @var _str
  9.   */
  10. private $_str;
  11.  
  12. /**
  13.   * @var array
  14.   */
  15. private $params;
  16.  
  17. /**
  18.   * JTreeRecursiveIterator::__construct()
  19.   *
  20.   * @param mixed $jt - the tree object
  21.   * @param mixed $iterator - the tree iterator
  22.   * @param mixed $mode
  23.   * @param integer $flags
  24.   * @return
  25.   */
  26. public function __construct(JTree_JTree $jt, $iterator, array $params = array(), $mode = RecursiveIteratorIterator::LEAVES_ONLY, $flags = 0) {
  27.  
  28. parent::__construct($iterator, $mode, $flags);
  29. $this->_jTree = $jt;
  30. $this->_str = array();
  31. $this->params = $params;
  32. }
  33.  
  34. /**
  35.   * JTreeRecursiveIterator::endChildren()
  36.   * Called when end recursing one level.(See manual)
  37.   * @return void
  38.   */
  39. public function endChildren() {
  40. parent::endChildren();
  41. }
  42.  
  43. /**
  44.   * JTreeRecursiveIterator::callHasChildren()
  45.   * Called for each element to test whether it has children. (See Manual)
  46.   *
  47.   * @return mixed
  48.   */
  49. public function callHasChildren() {
  50. $ret = parent::callHasChildren();
  51. $value = $this->current()->getValue();
  52.  
  53. if (!in_array($value, Arr::get($this->params, 'ignore_categories')))
  54. {
  55. $selected = ($this->current()->getUid() == Arr::get($this->params, 'selected_id')) ? ' selected="selected"' : NULL;
  56. $this->_str[] = '<option value="'. $this->current()->getUid() .'"'. $selected .'>'. $value .'</option>' . PHP_EOL;
  57. }
  58.  
  59. return $ret;
  60. }
  61.  
  62. /**
  63.   * JTreeRecursiveIterator::__destruct()
  64.   * On destruction end the list and display.
  65.   * @return void
  66.   */
  67. public function __destruct() {
  68. echo implode(' ', $this->_str);
  69. }
  70. }


Próbowałem już dekonstruktor zmodyfikować tak aby zamiast "echo" był "return" - jednak to nie pomaga - nic nie zwraca (zmienne $k, $v z pętli wyżej - dalej zwracają "swoje")

Ma ktoś pomysł, aby to obsłużyć?
Dipter
__destruct nie zajmuje się takimi rzeczami. Od tego masz __toString
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.