Organizar conteudo - php

candycane

Power Member
Boa tarde :)

Estou precisando de uma ajudinha... :D

Tenho que criar um sistema em php que possibilita ao administrador organizar o conteudo a ser mostrado,

por ex:

insere-se na base de dados 4 artigos. Mas na pagina onde vou mostrar esses artigos tenho k poder escolher a ordem que eles vao aparecer, digamos que quero que o 2 artigo introduzido seja o 1º a aparecer e o ultimo o segundo...

Como poderei fazer isso?

obrigada :)
 
Podes criar uma celula na BD onde "ordenas" os artigos. por exemplo:

Sapatos - 1
Couves - 2

E por ai a diante.

Sendo que o numero maximo de ordenação é o numero máximo de artigos, neste caso 2.
Depois ao escrever os dados, tens que ler a BD e escrever os numeros por essa ordem.

Provavelmente haverão melhores formas, mas a mais flagrante é esta ;)

Já agora depois ao mudar lembra-te que tens de alterar os numeros todos, ou podem haver repetidos. ao mudar:

Sapatos = 2
então o que estiver na posição dois vai ficar na 3, o que estiver na 3 vai descer para dois e por ai a diante. Com um pequeno ciclo fazes isso bem

Depois crias um ciclo para não haver repetições, por exempo:

Sapatos = 2
então o que está no numero 2 desce para 3, o que esta em 3 desce para 4, e por ai a diante.
 
Última edição:
orbigada por responderem :)

eu já tenho uma coluna onrdem na tabela.

Mas o que pretendo é que o administrador possa mudar a ordem... fazer um update as ordem dos conteudo...

Iso é k me esta a complicar a vida, pk como tenho k fazer é com uma tabela com o titulo dos coteudos e umas setas para cima e outra para baixo, ao clicar na seta para cima, esse conteudo sobe um posiçao.. e vice versa :(
 
Para não te complicar as ideias com AJAX candycane.

Cada seta, representa um post.
Lês o id do item q fizeste post, e ves a posicao, se a seta for para cima, pegas no item q ta na posição de cima e metes em baixo.

Tao simples.
 
estou com uma dificuldade..

como é que eu vou saber qual é o numero da ordem do conteudo que quero por para cima?

O numero da ordem esta numa td de uma tabela... :\ na~a tenho em nenhum elemento de um form... como faço? :(
 
eu tenho uma tabelinha com ordem, titulo, subtitulo e dois botões( cima, baixo).

para buscar o valor da ordem na mesma linha em que se clicou em um dos botoes, no onclick chamei o ajax:

Código:
function UpdateOrdem(tabela, linha){ 
  var req = CreateRequest(); 

  req.onreadystatechange = function() { 
    //pedido completo e com sucesso 
    if(req.readyState == 4 && req.status == 200){ 
          //buscar o numero da ordem
          var row = tabela.rows[linha];
        var cell = row.cells[0].id;    
          cell+=req.responseText; 
    } 
  }; 
  
  var option = cell;

  //efectuar pedido 
  req.open("GET", "ajax/organizar.php?id=" + option, true); 
  req.send(null); 
}

não pus nenhum hidden field... é necessario?

é que n estou a conseguir :(
 
Código:
var row = tabela.rows[linha];
var cell = row.cells[0].id;

Isto é tipo tas a procura do id da td? Eu sei que deve existir algo que faça isso, mas parece-me que está algo mt mal ai nessas duas linhas, tabela? linha? tabela.rows? de onde vem essas coisas todas.

Se só tens duas setas para cima e para baixo, e tens que usar um onClick, para selecionar, tens mesmo que temporariamente guardar o id no onClick, para quando alguem clicar nas setas para cima e para baixo, saber qual é que tem que puxar.

Cria um hidden field, stora-lhe o valor no onClick e muda a cor do fundo, dps as pessoas usam a seta para cima, e ai mandas um post\get ao ajax apenas para mudar na bd a ordem, e a response do ajax vai ser outra funcaso, que mova essa div para cima, porque td's não consegues arrastar.


--

O que eu fazia era:

Um div contentor, com vários div's de baixo, com os dados e etc.. e dps ao lado, outra div, com as 2 imagens que esteja a altura das 2 setas.. ao clicar numa div, fazes store do id dessa div, e mudas-lhe o fundo para dar ideia d estar seleccionado, carrega-se na seta, mandas request ao ficheiro php atraves do ajax, e a response chama uma função js para mover o div para cima do outro.

Com tabelas o máximo que acho que dá para fazer, é com o DOM cortares o td que vais mexer, e desenha-lo entre os outros, mas com esforço estúpido.. e as tabelas não são muito amigáveis para estas andanças, muito menos DOM.

Só te estou a deixar as possibilidades em aberto!

Espero que tenhas percebido o essencial!
 
Não querendo invalidar qualquer proposta de solução nesta thread, porque não usas uma listbox com (por exemplo) os titulos dos artigos e depois vais re-ordenando a listbox movendo os itens para cima ou para baixo.

Tens um esquema "id=>Nome Artigo", como por ex. <option value="1">Artigo 1</option>
Depois ao submeteres o formulário corres um script sobre listbox que vai buscar os values dos itens e guarda-os num hidden text field, separados por ";" ou outro caracter qualquer.

Vê se este exemplo te ajuda em alguma coisa:

Código:
<html>
<head>

  <script type="text/javascript" language="javascript">
    /**
    * Re-ordenar listbox
    *
    * @param boolean Direction => true (cima) / false (baixo)
    * @param String Field => Nome da listbox
    *
    */
    MoveDDListItem = function(direction,field) {
      var el = document.getElementById(field);
      var idx = el.selectedIndex;
      if (idx == -1){
        alert("Selecione um item ...");
        return false;
      }

      var nxidx = idx+( direction ? -1 : 1);

      if (nxidx<0){nxidx=el.length-1;}
      if (nxidx>=el.length){nxidx=0;}

      var oldVal = el[idx].value;
      var oldText = el[idx].text;
      el[idx].value = el[nxidx].value;
      el[idx].text = el[nxidx].text;
      el[nxidx].value = oldVal;
      el[nxidx].text = oldText;
      el.selectedIndex = nxidx;
    }
    
    /**
    * Preencher campo com a ordenação
    *
    * @param String ListBox
    * @param String HiddenField
    *
    */
    SetItensOrder = function(field, submit_field){
      var el=document.getElementById(field);
      var txt=document.getElementById(submit_field);
      txt.value="";
      
      var count=el.length;
      
      for (var i=0;i<count;i++){
        txt.value+=el[i].value+";";  
      }
    }
  </script>

</head>
<body>
  <form method="post" id="my_form" onsubmit="SetItensOrder('ddl_ordenar','itens_ordenados');">
    <select size="5" name="ddl_ordenar" id="ddl_ordenar">
      <option value="1">Titulo do Artigo 1</option>
      <option value="2">Titulo do Artigo 2</option>
      <option value="3">Titulo do Artigo 3</option>
      <option value="4">Titulo do Artigo 4</option>
      <option value="5">Titulo do Artigo 5</option>
    </select>
    <input type="hidden" name="itens_ordenados" id="itens_ordenados">
    <input type="button" value="Cima" onclick="MoveDDListItem(true,'ddl_ordenar')">
    <input type="button" value="Baixo" onclick="MoveDDListItem(false,'ddl_ordenar')">
    <input type="submit" value="Ordenar Itens">
  </form>
</html>

Depois no php usavas algo deste tipo:
PHP:
<?php
$itens_ordenados=$_POST["itens_ordenados"];

$itens=explode(";",$itens_ordenados);
$count=sizeof($itens)-1;

for ($i=0;$i<$count;$i++){
  if(is_numeric($itens[$i])){
    $sql="Update `table` Set `reg_order`='$i' Where `id`='{$itens[$i]}' <br>";
    mysql_query($sql);
  }
}
?>
 
Código:
var row = tabela.rows[linha];
var cell = row.cells[0].id;

o tabela e linha são 2 parâmetros da função, a tabela é o id da tabela e linha é a linha em que estou a clicar... Interceptando a linha com a coluna obtenho o id do da td.

Eu fiz uma tabela com os conteudos, e pra dar a sensação de que mexi na ordem fiz um location.reload(); :(

mas queria evitar o reload a página....

Com divs n sei dar sensação de tabla... Sei mto pouco sobre div, só o básico mesmo...

em releção ao php...

Como é que vou buscar a ordem anterior.. a seguinte consigo com:

Código:
SELECT ordem
FROM eventos
WHERE ordem > $ordem limit 1

mas se faço o mesmo para o anterior, ele vai-me sempre buscar o primeiro valor da tabela... :(
 
Vou re-explicar:


O ideal continua a ser Div's, mas vamos com tabelas, simplificar o processo, primeiro sem dar a impressão que tabelas são decentes para isto.

1º Existe uma form geral a cobrir a tabela, onde estão as 2 seta (cima e baixo, e os rows (rows estes que convem ter um id no nome, para usarmos)), e um campo hidden chamado id.

2º td onClick, pegas no id que tens no row (this.parentNode.id) e atribuis esse id, ao campo hidden da form (convem tambem mudar a cor, para dar o efeito de selecionado)

3º Seta para cima, onClick muda o action da form, e acrescenta um ordenar.php?m=up, e faz submit a form

4º Seta par baixo, onClick muda o action da form, e acrescenta um orndear.php?m=dw, e faz submit a form

5º tens o id, e se é para cima ou para baixo.

-> SELECT ordem FROM conteudos WHERE id=4

#Resultado: ordem -> 2

Se foi dw que veio no get: -> Select id FROM conteudos WHERE ordem=2+1

#Resultado: id = 9

-> UPDATE conteudo SET ordem=3 WHERE id=4
-> UPDATE conteudo SET ordem=2 WHERE id=9
 
Eu tenho um hidden com os id de cada conteúdo, e em numa td a ordem...

No java tenho uma variável que guarda o valor da ordem... e com o ajax vai buscar o ficheiro php com o id, ordem...

Onde empanquei foi no php... na parte de trocar a posição dos conteúdo... :(


sinceramente não entendi essa parte:
5º tens o id, e se é para cima ou para baixo.

-> SELECT ordem FROM conteudos WHERE id=4

#Resultado: ordem -> 2

Se foi dw que veio no get: -> Select id FROM conteudos WHERE ordem=2+1

#Resultado: id = 9

-> UPDATE conteudo SET ordem=3 WHERE id=4
-> UPDATE conteudo SET ordem=2 WHERE id=9
 
Ok, sabes o id do produto que queres ordenar.
é o ID->5 que tem por exemplo a ordem->3, e mandaste ordenar para baixo.

Se ele vai passar para a ordem->4, o ID que estava anteriormente na ordem->4 tem que passar para a 3, certo? Troca de posições..

Ou seja, tu vais buscar o ID da posição para onde estás a mandar o teu id que estás a mudar.
Dai o select ao ID da posição 4, e depois de passares o teu id para 4, passas o id que estava lá para 3.


O código é muito simples
 
O problema é que os ids podem não ser seguidos... :\

Pode-se ter apagado o conteúdo com id 3 por ex... então fica 1,2,3,5,9,12 etc... :(

Tou a tentar saber como é que vou buscar o id anterior.. pk o seguinte consigo com o limt 1...
 
Back
Topo