Ho risolto..
la rilettura di alcune sezioni che avevo sottovalutato della documentazione ufficiale mi hanno aiutato a capire http://framework.zend.com/manual/en/...b.select.html.
spiego qui di seguito il problema che ho avuto in quanto penso che capiterà ad altri:
per la gestione delle tabelle ricorsive ho creato una classe 'middleware' che estende Zend_Db_Table_Abstract, soluzione ideata principalmente da Hector Virgen nel suo sito
http://www.virgentech.com/blogs/view/id/4.
La sua soluzione è molto estesa, un po' troppo per ciò di cui avevo attualmente bisogno io, prendendo in considerazone il concetto di left e right values di un record. La sua classe è ottima ma non gestisce il ripristino di questi valori all'atto di eliminazione di un record.
Ho pensato quindi di fare qualcosa di più 'classico', creando un metodo ricorsivo. Il problema è che il metodo deve accettare come argomento una istanza di Zend_Db_Select in modo tale da poter gestire eventuali join e filtri. Effettuando la ricorsione, il metodo 'where' di Zend_Db_Select appendeva il contenuto alla vecchia query e nessun dato veniva quindi estratto, questo è una prima versione, priva di controlli, del metodo in questione:
Codice PHP:
public function fetchDescendants($parent_id, Zend_Db_Select $select = null){
if (null === $select){
$select = $this->select();
}else{
$select = $select;
}
// Ad ogni chiamata questi 'where' sono aggiunti alla query,
$select->where('b.language_id = ?', 1)
->where($this->_parentKey . ' = ?', (int) $parent_id);
$rowset = $this->fetchAll($select);
//echo $select->__toString();
if(count($rowset)>0){
foreach($rowset AS $k => $v){
$this->traverse[] = $v;
$this->fetchDescendants($v->{$this->primaryKey()},$select);
}
}
return $this->traverse;
}
La soluzione arriva grazie all'utilizzo del metodo 'reset', che resetta una certa parte della query
Codice PHP:
public function fetchDescendants($parent_id, Zend_Db_Select $select = null){
if (null === $select){
$select = $this->select();
}else{
$select = $select;
}
// in questo punto la clausola where viene resettata e reimpostata
$select->reset( Zend_Db_Select::WHERE );
$select->where('b.language_id = ?', 1)
->where($this->_parentKey . ' = ?', (int) $parent_id);
$rowset = $this->fetchAll($select);
//echo $select->__toString();
if(count($rowset)>0){
foreach($rowset AS $k => $v){
$this->traverse[] = $v;
$this->fetchDescendants($v->{$this->primaryKey()},$select);
}
}
return $this->traverse;
}
In questo modo il metodo funziona.
Questa non è la versione definitiva, l'ho pubblicata solo per chiarire di cosa stessi parlando, spero sia utile a qualcuno.