Tenho uma paradinha de menus aninhados eternos, talvez lhe interesse ou
outra pessoa, a estrutura é pessoa esta vinculada a uma pessoa pai, tem
ate impressao
*Model Menu*
*
*
* *class Model_Menu extends ORM {
..
protected $_belongs_to = array('pai' => array('model' => 'menu',
'foreign_key' => 'menu_id'));
public static function getMenus() {
return ORM::Factory('menu')
->find_all()
->as_array('id', 'descricao');
}
*Helper de Impressao*
*
*
* *public static function imprimeMenu(&$saida, array $menus, $pai = 0,
$nivel = 0) {
$atributos = '';
if ($pai == 0)
$atributos = ' class="sf-menu"';
$i = 0;
$saida .= str_repeat(" ", $nivel) . "<ul$atributos>" . PHP_EOL;
if (isset($menus[$pai])) {
foreach ($menus[$pai] as $id => $menu) {
// imprime o item do menu
$saida .= str_repeat(" ", $nivel + 4);
$saida .= '<li>';
$saida .= '<a href="' . strtolower($menu['url']) . '"
class="' . ($i == 0 && $nivel == 0 ? 'first' : '') . '">';
if ($menu['exibe_icone'] != "N")
$saida .= '<img src="' . URL::base() .
'media/imagens/icones/' . strtolower($menu['icone']) . '" /> ';
else
$saida .= '<img src="' . URL::base() .
'media/imagens/icones/empty.png" /> ';
if ($menu['exibe_descricao'] != "N")
$saida .= $menu['descricao'];
if (isset($menus[$id])) {
if ($nivel == 0)
$saida .= '<img src="' . URL::base() .
'media/imagens/icones/arrow_down_gray.png" /> ';
else
$saida .= '<img src="' . URL::base() .
'media/imagens/icones/arrow_right_gray.png" /> ';
}
$saida .= '</a>';
// se tiver filhos, entra recursivamente
if (isset($menus[$id]))
self::imprimeMenu($saida, $menus, $id, $nivel + 4);
$saida .= '</li>' . PHP_EOL;
$i++;
}
}
$saida .= str_repeat(" ", $nivel) . '</ul>' . PHP_EOL;
}
public static function getMenu() {
$grupo = Helper_USUARIO::getGrupo();
if ($grupo->grupomenu->id == null) {
$menus = $grupo->menus;
} else {
$menus = $grupo->grupomenu->menus;
}
$menus = $menus->where('ativo', '!=', 'N')
->order_by('ordem', 'asc')
->order_by('descricao', 'asc')
->find_all();
foreach ($menus as $menu) {
if ($menu->pai->id == null)
$menu->pai->id = 0;
$menuArray[$menu->pai->id][$menu->id] =
array('descricao' => $menu->descricao,
'icone' => $menu->icone,
'exibe_descricao' => $menu->exibe_descricao,
'exibe_icone' => $menu->exibe_icone,
'url' => $menu->url);
}
$saida = '';
if (isset($menuArray)) {
self::imprimeMenu($saida, $menuArray);
}
return $saida;
}
[]s,
Douglas J.A.M
[email protected]
(37) 9949-8949
Em 24 de maio de 2013 14:05, Fabyo Guimaraes <[email protected]> escreveu:
> Felipe do jeito que voce falou deu certo em parte funcionou para o pai
> menos para o avo
>
> $accounts = ORM::Factory('filho')
> ->with('pai')
> ->order_by('pai.name', 'ASC')
>
> só que para o avo nao deu certo porque o filho nao tem relação direta com
> o avo e sim com o pai
> entao como ficaria para ordenar o avo?
> tentei isso mas nao deu
>
> $accounts = ORM::Factory('filho')
> ->with('avo')
> ->order_by('avo.name', 'ASC')
>
> Database_Exception [ 1054 ]: Unknown column 'avo.name' in 'order clause'
>
>
> Em 24 de maio de 2013 13:49, Fabyo Guimaraes <[email protected]>escreveu:
>
> Valeu Felipe vou tentar dessa maneira tbm
>>
>>
>>
>> Em 24 de maio de 2013 13:11, felipe bastos <[email protected]>escreveu:
>>
>> Opa, cheguei e nao li tudo ..
>>>
>>> Acho que fez uma arvora de tres niveis: filho, pai e avo ;)
>>>
>>> Imagino que tenha colocado ..
>>>
>>> Model Algo
>>> Belongs_to pai array model Algo
>>>
>>> Sua chave estrangeira de si proprio deve ser pai_id
>>>
>>> Assim, o avo é o pai do pai (obvio)
>>>
>>> $filho ....
>>> $pai ... $filho-pai;
>>> $avo ... $filho-pai-pai;
>>>
>>> Neste caso, vc pode ordenar por pai_id ..
>>>
>>> E para ordenar pelo avo, tem de usar with(campo belongs nome pai) ..
>>>
>>> Fica, order_by("pai.pai_id desc")
>>>
>>> Se ainda nao resolveu, ve se isso resolve.
>>>
>>> Enviado via sp android
>>> Em 24/05/2013 11:53, "Paulo Duarte" <[email protected]>
>>> escreveu:
>>>
>>> hum, foi mau... pai está ligado com avo e não o filho...
>>>> cara, eu nunca teste, mais de repente da para usar with com pai e avo,
>>>> senão tenta com JOIN.
>>>>
>>>> Outra solução é executar a query assim:
>>>>
>>>> $query = "
>>>> SELECT
>>>> f.id
>>>> FROM
>>>> filho f,
>>>> pai p,
>>>> avo a
>>>> WHERE
>>>> f.pai_id = p.id AND
>>>> p.avo_id = a.id
>>>> ORDER BY
>>>> a.nome,
>>>> f.expiration_date,
>>>> LIMIT
>>>> 0, 50";
>>>> $resultado = DB::query(Database::SELECT,$query)->execute();
>>>> foreach($resultado as $r) {
>>>> $filho = ORM::Factory('filho',$r['id']);
>>>> echo $filho->name;
>>>> echo $filho->pai->name;
>>>> echo $filho->pai->avo->name;
>>>> }
>>>>
>>>> Você pode para otimizar o tempo já trazer no resultado do select todas
>>>> as informações que quer mostrar, não precisando carregar o filho a cada
>>>> interação... aí fica a seu critério.
>>>> Isso deve resolver.
>>>>
>>>> Abs
>>>>
>>>>
>>>> Atenciosamente,
>>>>
>>>>
>>>> *Paulo Duarte*
>>>> Inteligência Web - Comunicação e Sistemas
>>>>
>>>> Fone: (48) 3028.5141 / 8426.3629
>>>> E-mail: [email protected]
>>>> Skype: paulo.iw
>>>>
>>>>
>>>> -------------------------------------------------------------------------------------------
>>>> Aviso de confidencialidade:
>>>> Esta mensagem da Empresa IW - Inteligência Web Comunicação e Sistemas,
>>>> empresa privada, é enviada exclusivamente a seu destinatário e pode conter
>>>> informações confidenciais, protegidas por sigilo profissional. Sua
>>>> utilização desautorizada é ilegal e sujeita o infrator às penas da lei. Se
>>>> você a recebeu indevidamente, queira, por gentileza, reenviá-la ao
>>>> emitente, esclarecendo o equívoco.
>>>>
>>>>
>>>> Em 24 de maio de 2013 11:33, Fabyo Guimaraes <[email protected]>escreveu:
>>>>
>>>>> Valeu Paulo e Beto
>>>>>
>>>>> eu tentei usar o with e o order by mas esta dando esse erro
>>>>>
>>>>> ErrorException [ 4 ]: syntax error, unexpected '$filhos' (T_VARIABLE) ~
>>>>> APPPATH\classes\Controller\Filhos.php [ 20 ]
>>>>>
>>>>> linha 20 : $filhos = ORM::Factory('filho')
>>>>>
>>>>> linha 21 : ->with('avo')
>>>>>
>>>>>
>>>>>
>>>>> Em 24 de maio de 2013 11:19, Paulo Duarte <
>>>>> [email protected]> escreveu:
>>>>>
>>>>>> Cara, o avô está em outra tabela...
>>>>>> se não me engano você tem q fazer algo assim (se for utilizar ORM):
>>>>>> $filhos = ORM::Factory('filho')
>>>>>> ->with('avo')
>>>>>> ->offset(0)
>>>>>> ->limit(50)
>>>>>> ->order_by('filho.expiration_date', 'ASC')
>>>>>> ->order_by('avo.nome', 'ASC')
>>>>>> ->find_all();
>>>>>>
>>>>>> Atenciosamente,
>>>>>>
>>>>>>
>>>>>> *Paulo Duarte*
>>>>>> Inteligência Web - Comunicação e Sistemas
>>>>>>
>>>>>> Fone: (48) 3028.5141 / 8426.3629
>>>>>> E-mail: [email protected]
>>>>>> Skype: paulo.iw
>>>>>>
>>>>>>
>>>>>> -------------------------------------------------------------------------------------------
>>>>>> Aviso de confidencialidade:
>>>>>> Esta mensagem da Empresa IW - Inteligência Web Comunicação e
>>>>>> Sistemas, empresa privada, é enviada exclusivamente a seu destinatário e
>>>>>> pode conter informações confidenciais, protegidas por sigilo
>>>>>> profissional.
>>>>>> Sua utilização desautorizada é ilegal e sujeita o infrator às penas da
>>>>>> lei.
>>>>>> Se você a recebeu indevidamente, queira, por gentileza, reenviá-la ao
>>>>>> emitente, esclarecendo o equívoco.
>>>>>>
>>>>>>
>>>>>> Em 24 de maio de 2013 10:32, Fabyo <[email protected]> escreveu:
>>>>>>
>>>>>>> Oi Pessoal
>>>>>>>
>>>>>>> eu estava usando o recurso do kohana sobre relacionamento de tabelas
>>>>>>> e estava perfeito, ate que eu precisei ordenar um campo da tabela e deu
>>>>>>> erro
>>>>>>> estou testando e acho que para ordenar do jeito que eu quero nao vou
>>>>>>> poder usar o modo padrado do kohana
>>>>>>> vou postar um exemplo para voces entenderem melhor
>>>>>>>
>>>>>>> $filhos = ORM::Factory('filho')
>>>>>>> ->offset(0)
>>>>>>> ->limit(50)
>>>>>>> ->order_by('expiration_date', 'ASC')
>>>>>>> ->find_all();
>>>>>>>
>>>>>>> foreach ($filhos as $filho)
>>>>>>> {
>>>>>>> echo $filho->name;
>>>>>>> echo $filho->pai->name;
>>>>>>> echo $filho->pai->avo->name;
>>>>>>> }
>>>>>>>
>>>>>>> esse exemplo funciona perfeitamente só que precisei ordenar o nome
>>>>>>> do avo ai que eu percebi um problema
>>>>>>> do jeito que eu estou fazendo acima nao tem como certo?
>>>>>>>
>>>>>>> vou ter que fazer de outra maneira? se for isso blz eu consigo
>>>>>>> fazer, mas só queria uma opniao pra saber se tem como fazer continuando
>>>>>>> usando o exemplo acima
>>>>>>>
>>>>>>> valeu
>>>>>>>
>>>>>>> --
>>>>>>> Você está recebendo esta mensagem porque se inscreveu no grupo
>>>>>>> "Kohana Php" dos Grupos do Google.
>>>>>>> Para cancelar a inscrição neste grupo e parar de receber seus
>>>>>>> e-mails, envie um e-mail para
>>>>>>> [email protected].
>>>>>>> Para postar neste grupo, envie um e-mail para
>>>>>>> [email protected].
>>>>>>> Visite este grupo em
>>>>>>> http://groups.google.com/group/kohana-php?hl=pt-BR.
>>>>>>> Para obter mais opções, acesse
>>>>>>> https://groups.google.com/groups/opt_out.
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> --
>>>>>> Você está recebendo esta mensagem porque se inscreveu no grupo
>>>>>> "Kohana Php" dos Grupos do Google.
>>>>>> Para cancelar a inscrição neste grupo e parar de receber seus
>>>>>> e-mails, envie um e-mail para [email protected]
>>>>>> .
>>>>>> Para postar neste grupo, envie um e-mail para
>>>>>> [email protected].
>>>>>> Visite este grupo em
>>>>>> http://groups.google.com/group/kohana-php?hl=pt-BR.
>>>>>> Para obter mais opções, acesse
>>>>>> https://groups.google.com/groups/opt_out.
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>> --
>>>>> Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana
>>>>> Php" dos Grupos do Google.
>>>>> Para cancelar a inscrição neste grupo e parar de receber seus e-mails,
>>>>> envie um e-mail para [email protected].
>>>>> Para postar neste grupo, envie um e-mail para
>>>>> [email protected].
>>>>> Visite este grupo em
>>>>> http://groups.google.com/group/kohana-php?hl=pt-BR.
>>>>> Para obter mais opções, acesse
>>>>> https://groups.google.com/groups/opt_out.
>>>>>
>>>>>
>>>>>
>>>>
>>>> --
>>>> Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana
>>>> Php" dos Grupos do Google.
>>>> Para cancelar a inscrição neste grupo e parar de receber seus e-mails,
>>>> envie um e-mail para [email protected].
>>>> Para postar neste grupo, envie um e-mail para
>>>> [email protected].
>>>> Visite este grupo em http://groups.google.com/group/kohana-php?hl=pt-BR
>>>> .
>>>> Para obter mais opções, acesse https://groups.google.com/groups/opt_out
>>>> .
>>>>
>>>>
>>>>
>>> --
>>> Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana
>>> Php" dos Grupos do Google.
>>> Para cancelar a inscrição neste grupo e parar de receber seus e-mails,
>>> envie um e-mail para [email protected].
>>> Para postar neste grupo, envie um e-mail para
>>> [email protected].
>>> Visite este grupo em http://groups.google.com/group/kohana-php?hl=pt-BR.
>>> Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
>>>
>>>
>>>
>>
>>
> --
> Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana
> Php" dos Grupos do Google.
> Para cancelar a inscrição neste grupo e parar de receber seus e-mails,
> envie um e-mail para [email protected].
> Para postar neste grupo, envie um e-mail para [email protected].
> Visite este grupo em http://groups.google.com/group/kohana-php?hl=pt-BR.
> Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
>
>
>
--
Você está recebendo esta mensagem porque se inscreveu no grupo "Kohana Php" dos
Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um
e-mail para [email protected].
Para postar neste grupo, envie um e-mail para [email protected].
Visite este grupo em http://groups.google.com/group/kohana-php?hl=pt-BR.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.