Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Joao borges

adaptar função recursiva para exibição de plano de contas

Recommended Posts

Estou desenvolvendo um sistema de plano de contas para um sistema em PHP/MYSQL.

 

Minha tabela tem os seguintes campos: id, nome, parent.

 

Preciso gerar buscar no BD e exibir com os níveis corretos.

 

 

1
1.1
1.1.1
1.1.2
2
2.1
2.1.1
etc...

 

Depois de muito procurar consegui fazer com a função abaixo. (Vi algumas soluções com SQL Recursivo mais são tantas linhas de código tão complexo que desisti.)

 

 

 

 

function print_kids($pos=null, $level) { 
global $link;
global $table;


if($level > 0) echo "<ol>\n"; 


$pos = ($pos?$pos:null);


$query = "SELECT * from plano_contas WHERE parent".($pos == null ? " IS NULL" : "=".$pos);
$res = mysql_query($query, $link) OR DIE (mysql_error());


while($row = mysql_fetch_array($res)) {


$has_kids=mysql_fetch_array(mysql_query("SELECT * from $table where parent=$row[0]", $link)) != null;
echo '<li>'.$row[1]."\n";
echo (!$has_kids) ? "</li>\n" : ""; 
if ($has_kids) {
print_kids($row[0], $level+1);
echo "</li>\n";
}
} 
if($level > 0) echo "</ol>\n";    
}
echo "<ol >\n";
print_kids(null, 0);
echo "</ol>\n";

O Resultado do HTML foi esse:

 

 

<ol >
  <li>RECEITAS </li>
  <li>DESPESAS
    <ol>
      <li>Despesas Administrativas
        <ol>
          <li>13º Salário </li>
          <li>Adicional noturno </li>
          <li>Água / Esgoto </li>
        </ol>
      </li>
      <li>Despesas Comerciais
        <ol>
          <li>Combustível </li>
          <li>Propaganda e publicidade </li>
        </ol>
      </li>
    </ol>
  </li>
</ol>

No Browse esta exibindo assim:

 

1. RECEITAS

2. DESPESAS

1. Despesas Administrativas

1. 13º Salário

2. Adicional noturno

3. Água / Esgoto

2. Despesas Comerciais

1. Combustível

2. Propaganda e publicidade

Com a ajuda do CSS, até consegui exibir corretamente no browser:

 

 

<style>
ol {
counter-reset: section;
list-style-type: none;
}
li:before {
counter-increment: section;
content: counters(section, ".") " - ";
}
</style>

O resultado ficou como eu queria, porem só no navegador:

 

1 - RECEITAS

2 - DESPESAS

2.1 - Despesas Administrativas

2.1.1 - 13º Salário

2.1.2 - Adicional noturno

2.1.3 - Água / Esgoto

2.2 - Despesas Comerciais

2.2.1 - Combustível

2.2.2 - Propaganda e publicidade

Porem, isso é um gatilho apenas para exibição no browser, se eu precisar mostrar esses dados em um select, ou em um relatório PDF a numeração se perde.

 

Preciso da ajuda dos amigos para adaptar essa função PHP acima. Preciso que ela me devolva o HTML já numerado com os níveis corretos, como o CSS esta fazendo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.