Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Pessoal, tenho uma classe de categoria, mas ela pode ser filha dela mesmo, assim criando uma arvrore. Quando o idpai for 0, ele é root (raiz)
<?php
class Application_Model_Categorias extends Zend_Db_Table_Abstract {
protected $_name = "categorias";
protected $_cols = array(
'idcategoria',
'nome',
'descricao',
'idpai'
);
protected $_dependentTables = array('Categorias');
// Seta as chaves extangeiras
protected $_referenceMap = array(
'CategoriaPai' => array(
'columns' => array("idpai"),
'refTableClass' => "Categorias",
'refColumns' => array("idcategoria")
)
);
}
Não consigo buscar o nome do pai. No meu controlador, eu dou o fetchAll()
/**
* Ação Index
*
* @indexAction
*/
public function indexAction() {
// Configura a query
$query = $this->_model->select()->order("nome");
// Lista de produtos
$list = $this->_model->fetchAll($query);
// Assina as variaveis
$this->view->assign("list", $list);
}
E no view
<a href="{$this->url(["controller"=>"categorias", "action"=>"form"])}" class="uri-novo">Novo</a>
<table class="table-list">
<thead>
<tr>
<th width="80">ID</th>
<th>Nome</th>
<th>Pai</th>
<th width="60"> </th>
</tr>
</thead>
<tbody>
{foreach from=$list item=item}
<tr>
<td>{$item['idcategoria']}</td>
<td>{$item['nome']}</td>
<td>{$item['pai']</td>
<td>
...
</td>
</tr>
{/foreach}
</tbody>
</table>
Note no view, $item['pai']. Gostaria que esse index fosse a descrição do pai, mas não to conseguindo fazer isso. Achei umas pessoas dando o foreach no controle, e ir montando um vetor para assiar esse vetor para o view, mas fico imaginando ter 500 categorias, assim darei 1000 loops, 500 no controle, 500 no view, não acho que seja certo.
Alguem tem idéia de como fazer isso pelo model? fazer com que ele ja traga o item relacionado (caso houver relação)
De qualquer forma, se alguem puder me explicar como criar um outer join, talvez tambem ajude, mas preferiria fazer isso pelo model =)
Valeu gente
Oi matias, valeu pelas dicas, arrumei alguma coisa aqui, outra ali, e funcionou.
Descobri queo refTablesClass não relaciona com a tabela, mas sim com a classe, ai facilitou alguma coisa, mas mesmo assim, com suas dicas, acho que meu problema é esses namespaces. No meu ini ja ta la o application, então estou tendo que colocar todo o nome da classe Application_Model_Categorias, é muito grande, tem alguma dica ai para ficar só Categoria? ja tentei manipular o _iniAutoload, ja tentei adicionar no index.php, mas nao saquei essa parada dos namespaces não
Bem, de qualquer forma, sua dica foi muito valida, pois consegui entender o que tava fazendo de errado, valeu mesmo
>
então estou tendo que colocar todo o nome da classe Application_Model_Categorias, é muito grande, tem alguma dica ai para ficar só Categoria?
Olha, tem uma dica para ficar só Model_Categorias. Só Categorias é estranho, porque como você vai saber o que é esta categorias? Então, pra deixar Model_Categorias:
Estrutura das pastas:
/application
/models
Categorias.php => DbTable
/row
Categorias.php => Linha
A linha você deixa assim:
Model_Row_Categorias extends Zend_Db_Table_Row_Abstract {
private $_pai = null;
// o melhor seria adicionar este método em uma classe abstrata, que todos os seus models -> linha derivariam dela:
public function __get($columnName) {
$newColumnName = ucfirst ( $columnName );
$methodName = sprintf ( 'get%s', $newColumnName );
if (method_exists ( $this, $methodName )) {
return $this->$methodName ();
} else {
return parent::__get ( $columnName );
}
}
public function getPai() {
if($this->_pai === null) {
$this->_pai = $this->findParentRow('Model_Categorias', 'CategoriaPai');
}
return $this->_pai;
}
}
O DbTable você deixa assim:
<?php
class Model_Categorias extends Zend_Db_Table_Abstract {
protected $_name = "categorias";
protected $_cols = array(
'idcategoria',
'nome',
'descricao',
'idpai'
);
protected $_rowClass = 'Model_Row_Categorias';
protected $_dependentTables = array('Categorias');
// Seta as chaves extangeiras
protected $_referenceMap = array(
'CategoriaPai' => array(
'columns' => array("idpai"),
'refTableClass' => "Categorias",
'refColumns' => array("idcategoria")
)
);
}
No application.ini você só define isto:
appnamespace = "Application"
A partir daí você pode usar nos seus controllers:
$model = new Model_Categorias();
Veja se deu certo e qualquer coisa, só voltar a perguntar.
Carlos Eduardo
Olha, eu faço desta forma:
No DbTable:
protected $_rowClass = 'Model_Categorias';
Aí dentro da pasta Models, você cria um arquivo chamado Categorias, com algo assim:
Model_Categorias extends Zend_Db_Table_Row_Abstract {
Agora, algumas pequenas modificações que eu sugeriria:
Adicione appnamespace = "Application" ao seu application.ini. Depois disto, você pode trocar class Application_Model_Categorias por class Model_DbTable_Categorias, mudando este arquivo para a pasta DbTable colocada dentro da pasta models.
Isto aqui:
// Configura a query
Você pode trocar por isto aqui:
// Assina as variaveis
$this->view->assign("list", $this->_model->fetchAll(null, 'nome'));
Acho que era por aí.
Carlos Eduardo