1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

Organizar conteudo - php

Discussão em 'Web Development' iniciada por candycane, 1 de Setembro de 2008. (Respostas: 24; Visualizações: 2583)

  1. candycane

    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 :)
     
  2. Porque não tens um campo "Posição" na base de dados, depois para mostrares é só ordenar por Posição
     
  3. masterArt

    masterArt Power Member

    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: 1 de Setembro de 2008
  4. candycane

    candycane Power Member

    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 :(
     
  5. hostmake

    hostmake Power Member

    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.
     
  6. candycane

    candycane Power Member

    hmm

    tou a entender.. faça seta como botões, e ao clicar em cada um "chamo o ajax" e faz-se o update?
     
  7. hostmake

    hostmake Power Member

    Exacto, e se usares ajax mesmo, depois precisar de mexer os div's de posição
     
  8. candycane

    candycane Power Member

    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? :(
     
  9. hostmake

    hostmake Power Member



    Imagem Link, codigo GET\POST com o id do conteudo.



    Forms individuais para imagem como submit button,com um hidden field.
     
  10. candycane

    candycane Power Member

    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 :(
     
  11. hostmake

    hostmake Power Member

    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!
     
  12. p3dro

    p3dro Power Member

    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);
      }
    }
    ?>
     
  13. hostmake

    hostmake Power Member

    Na boa, eu apenas dei o que acho ser o melhor método para o utilizador.
     
  14. candycane

    candycane Power Member

    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... :(
     
  15. candycane

    candycane Power Member

    p3dro não posso fazer com listbox pk foi-me pedido pra ser em tabela :(
     
  16. hostmake

    hostmake Power Member

    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
     
  17. candycane

    candycane Power Member

    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:
     
  18. hostmake

    hostmake Power Member

    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
     
  19. candycane

    candycane Power Member

    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...
     
  20. candycane

    candycane Power Member

    ahhh ja vi como é...

    tem que ser:
    Código:
    
    SELECT ordem
    FROM eventos
    WHERE id < $id limit 1,1
    
    
     

Partilhar esta Página