View Full Version : PHP editar menu - mudar ordem,...
Bom dia!
Estou a tentar fazer a edição de um menu apartir de um área de background, gostaria que pudesse fazer as seguintes opções: mudar a ordem dos items e colocar ou não determinado link visível.
Penso que para fazer isto a melhor opção seria criar algo que mudasse o id de determinado item de mudo a que este mudasse a sua posição. Para o outro ponto talvez queria um campo de visibilidade em que 1 o menu estaria visível e 0 o menu não seria visível, depois ao chamar os campos filtrava-se os resultados somente aparecendo os campos com 1.
Há formas mais simples/melhores de fazer isto?
No segundo ponto não me parece que tenha problemas para o realizar, mas em relação a como mudar a id do item ai estou um pouco perdido, como poderei fazer isso, alguma sugestão?
Obrigado!
hostmake 08-04-2008, 11:46 Devo ser eu, mas não percebi nada :confused:
Bem vou tentar então explicar-me melhor (de facto o primeiro texto está bastante confuso e mal escrito, é das horas).
Exemplo de um menu: Home, About, Contact
Um menu que se encontra num base de dados,
algo assim:
ID NAME LINK VISIBLE
1 Home home.php 1
2 About about.php 1
3 Contact contact.php 1
Gostaria de ter um área de edição em que pudesse fazer duas coisas:
- um das quais mudar a ordem do menu para por exemplo: Home, Contact, About
- outra ter a hipótese de colocar determinado item invisível, ficando assim: Home, Contact
Para a primeira questão pensei em puder mudar a id dos itens.
Para a segunda pensei em colocar um campo que seria a visibilidade onde 1 seria visível e 0 não. Assim ao chamar os resultados chamava apenas os iguais a 1.
Bem vou tentar então explicar-me melhor (de facto o primeiro texto está bastante confuso e mal escrito, é das horas).
Exemplo de um menu: Home, About, Contact
Um menu que se encontra num base de dados,
algo assim:
ID NAME LINK VISIBLE
1 Home home.php 1
2 About about.php 1
3 Contact contact.php 1
Gostaria de ter um área de edição em que pudesse fazer duas coisas:
- um das quais mudar a ordem do menu para por exemplo: Home, Contact, About
- outra ter a hipótese de colocar determinado item invisível, ficando assim: Home, Contact
Para a primeira questão pensei em puder mudar a id dos itens.
Para a segunda pensei em colocar um campo que seria a visibilidade onde 1 seria visível e 0 não. Assim ao chamar os resultados chamava apenas os iguais a 1.
$query_menu = "SELECT * FROM menu WHERE visible = 1";
$result_menu = mysql_query($query_menu) or die('Erro na query: ' . mysql_error());
$row_menu = mysql_fetch_assoc($result_menu);
$totalRows = mysql_num_rows($result_menu);
echo "<table>";
echo "<tr>";
while ($row_menu = mysql_fetch_assoc($result_menu)){
echo "<td>";
echo "<a href='".$_SERVER['PHP_SELF']."/".$row_menu['LINK']."'>".$row_menu['NAME']."</a>";
echo "</td>";
}
echo "</tr>";
echo "</table>";
Não testei o código, mas vê se é isto de que estás a precisar.
Obrigado, mas onde estou com problemas (isto é não sei como fazer) é na parte de mudar a ordem dos ID na base de dados.
hostmake 08-04-2008, 12:42 Fazes um count á quantos links tens na base de dados, e com esse count crias dentro de uma form selects.
algo do do estilo:
<select name="ordem_1">
<select name="ordem_2">
<select name="ordem_3">
e dentro de cada, corres o while dos links, e metes o ($i do loop) que está no ordem_$i, selected.
e ao fazer update, actualizas os campos todos, espero que me tenha feito entender.
DanielGomes 08-04-2008, 12:55 O mais simples é criares um campo "ordem" ou "peso" e atribuis um número de 1 a 100, os números maiores ficam no fundo do menu, os menores mais em cima. Podes fazer com uma simples caixa de texto. Não tem nada a ver com o ID.
SELECT * FROM menu ORDER BY peso;
hostmake 08-04-2008, 13:01 Era o que eu estava a dizer, com um campo ordem, mas de forma a ele ter as selects que ele queria.
Ex:
$numero_links = MYSQL_QUERY("SELECT * FROM links");
$numero_links = mysql_num_rows($numero_links);
//Criar selects da form
for ($i = 1; $i <= $numero_links; $i++) {
echo "<select name='ordem_".$i."'>";
//Listar os links
while ($nlink = mysql_fetch_assoc($numero_links)) {
if ($nlink['ordem'] == $i)
echo "<option value='".$nlink['id']."' SELECTED>".$nlink['nome']."</option>";
else
echo "<option value='".$nlink['id']."'>".$nlink['nome']."</option>";
}
</select>
}
O mais simples é criares um campo "ordem" ou "peso" e atribuis um número de 1 a 100, os números maiores ficam no fundo do menu, os menores mais em cima. Podes fazer com uma simples caixa de texto. Não tem nada a ver com o ID.
SELECT * FROM menu ORDER BY peso;
Acho que depende da utilização que ele dá ao ID do registo.
Se lá na estiver tabela só para ordenar os registos podem bem definir o campo ID como inteiro sem autoincrement e editar á mão os IDs.
Depois pode usar á vontade o ORDER by ID sem ocupar espaço desnecessário com um novo campo "peso".
Era o que eu estava a dizer, com um campo ordem, mas de forma a ele ter as selects que ele queria.
Ex:
$numero_links = MYSQL_QUERY("SELECT * FROM links");
$numero_links = mysql_num_rows($numero_links);
//Criar selects da form
for ($i = 1; $i <= $numero_links; $i++) {
echo "<select name='ordem_".$i."'>";
//Listar os links
while ($nlink = mysql_fetch_assoc($numero_links)) {
if ($nlink['ordem'] == $i)
echo "<option value='".$nlink['id']."' SELECTED>".$nlink['nome']."</option>";
else
echo "<option value='".$nlink['id']."'>".$nlink['nome']."</option>";
}
</select>
}
Quanto a mim isso não faz o minimo de sentido.
Porque motivo fazes dois loops ???
Se o objectivo dele é sacar os registos da tabela e mostra-los por uma ordem.
1 WHILE chega e sobra.
Estás a complicar sem necessidade.
hostmake 08-04-2008, 13:57 o objectivo era clarificar o código para ele, separando-o tbh.
DanielGomes 08-04-2008, 19:03 Acho que depende da utilização que ele dá ao ID do registo.
Se lá na estiver tabela só para ordenar os registos podem bem definir o campo ID como inteiro sem autoincrement e editar á mão os IDs.
Depois pode usar á vontade o ORDER by ID sem ocupar espaço desnecessário com um novo campo "peso".
Porque ter ou não ter um campo "peso" a mais é irrelevante em termos de espaço para algo tão pequeno quanto uma tabela de menus.
Depois o id é chave do registo e não deve ser mudada de qualquer maneira e muito menos por uma razão como esta. Pela tua lógica o que não faz falta na tabela é mesmo o campo ID. Mas pronto há muitas maneiras de alcançar o mesmo objectivo.
Porque ter ou não ter um campo "peso" a mais é irrelevante em termos de espaço para algo tão pequeno quanto uma tabela de menus.
Depois o id é chave do registo e não deve ser mudada de qualquer maneira e muito menos por uma razão como esta. Pela tua lógica o que não faz falta na tabela é mesmo o campo ID. Mas pronto há muitas maneiras de alcançar o mesmo objectivo.
Pela "minha lógica" o campo ID pode servir tanto de "peso" como continuar a servir de chave.
Pois caso ele vá criar backoffice para introduzir os links na tabela, pode muito bem fazer um ID=max(ID)+1 antes de inserir um link novo e ter o ID como "peso" e chave ao mesmo tempo, além de ainda poder utilizar o ID futuramente como numero de referência para referênciar áreas para o site de acordo com aquela tabela sem ter que a vir a alterar.
A "minha lógica" é simples e directa, ou seja maximizar a eficacia dos campos que estão na tabela, e por esse mesmo motivo não vejo a tua lógica de dizeres que pela minha o ID nem faz falta.
Mas concordo contigo "há muitas maneiras de alcançar o mesmo objectivo".
Okay, fiz o menu ordenado por um campo que criei para esse fim (denominado order), também já coloquei a função de ser possível escolher se um item está ou não visível (através do campo visible).
No entanto estou com um problema na alteração do menu, no que respeita à ordem do mesmo.
Isto porque que se por exemplo tenho o menu: 1, 2, 3, 4, 5 e quero mudar o 5 para 2 mudo o valor do campo order, mas o antigo 2 continua a ser 2 ficando assim com dois items com esse valor.
DanielGomes 09-04-2008, 17:38 Okay, fiz o menu ordenado por um campo que criei para esse fim (denominado order), também já coloquei a função de ser possível escolher se um item está ou não visível (através do campo visible).
No entanto estou com um problema na alteração do menu, no que respeita à ordem do mesmo.
Isto porque que se por exemplo tenho o menu: 1, 2, 3, 4, 5 e quero mudar o 5 para 2 mudo o valor do campo order, mas o antigo 2 continua a ser 2 ficando assim com dois items com esse valor.
Então tens de mudar o valor do antigo. Uma forma mais simples de não teres de trocar todos é, em vez de 1,2,3,4,5 usares, 10,20,30,40,50. Se queres mudar o 50 para antes do 20 podes usar 11 (exemplo) e tens o caso arrumado.
Se quiseres fazer as coisas de outra forma, podes usar um sistema de setas pra cima e setas pra baixo e ordenas os campos assim, mas aí vais ter de puxar um bocadinho pela cabeça.
hostmake 09-04-2008, 19:49 Isso é "batota", não sou nada apologista desses "truques" :P
É óbvio que se ele quer alterar um campo, o outro valor também tem que ser alterado, isto é tao simples com JavaScript, e depois se quiseres por AJAX então fica um mimo, ao mudares um, fazes com que mude os outros campos sozinho, fazes um POST geral, e um foreach.
|
|