Имя пользователя:
Пароль:
 

Название темы: Мощь DHTML
Показать сообщение отдельно
mar mar вне форума

Аватара для mar

just mar


Moderator


Сообщения: 3906
Благодарности: 165

Профиль | Отправить PM | Цитировать


чтобы ждать было не скучно привожу (правда не свой, а только слегка модифицированный мной) скрипт, позволяющий менять местами строки в таблице.
Оригинал js можно посмотреть по адресу http://surfmind.com/lab/table_reorder.cfm, но на изменения стоит тоже обратить внимание
Итак, имеем комплексную задачу - хочу дать, ну, скажем, админу, - возможность модифицировать порядок показа элементов в каком-то списке (все равно в каком - товаров в магазине, форумов на главной странице форумов и т.д.
делаем раз 1)
- пример для mysql
PHP код: Выделить весь код

ALTER TABLE some_table ADD order_id INT11 ) DEFAULT '0' NOT NULL

- для postgresql
PHP код: Выделить весь код

ALTER TABLE some_table ADD order_id INT4  DEFAULT '0' NOT NULL

(для других СУБД лень - сами напишите )
делаем два 2) html - форма (реализуется в html-файле, или, скорей всего в шаблоне для php, asp, или на чем мы там пишем и заполняется динамически)
PHP код: Выделить весь код

<html>

  <
head>
      <
script language="JavaScript" type="text/javascript" src="/js/table_order.js"></script>    
  </head>
<body onload="rebuild()">
<form>
      <table>
      <tr>
           <th></th><th></th><th></th><th></th><th>Name</th>
      </tr>
     <tr id="node1" taskid="1" position="1" origposition="1">
       <td>
                <input type="hidden" name="id_list[]" value="1">
                <input type="text" id="text1" name="order" value="" size="2" disabled>
                <input type="hidden" id="order1" name="order[1]" value="">
      </td>
      <td>
               <span onclick="moveDown(this.parentNode.parentNode);"> 
                     <img src="t_files/icon_down_12px" height="12" hspace="4" width="12">
               </span>
       </td>
       <td></td>
       <td>Текст нумер раз</td>
     </tr>
     <tr id="node2" taskid="2" position="2" origposition="2">
       <td>
                <input type="hidden" name="id_list[]" value="2">
                <input type="text" id="text2" name="order" value="" size="2" disabled>
                <input type="hidden" id="order1" name="order[2]" value="">
      </td>
      <td>
             <span onclick="moveDown(this.parentNode.parentNode);"> 
                   <img src="t_files/icon_down_12px" height="12" hspace="4" width="12">
             </span>
      </td>
      <td>
              <span onclick="moveUp(this.parentNode.parentNode)"> 
                    <img src="t_files/icon_up_12px" height="12" hspace="4" width="12">
              </span>
       </td>
      <td>Вторая строка</td>
 </tr>
 <!-- и так далее -->
 <tr>
        <th colspan="4"><input type="submit" name="action" value="Order"></th>
  </tr>
</table>
</form>
</body>
</html> 

(вроде, главное показала)

3) JavaScript (/js/table_order.js):
PHP код: Выделить весь код

var prevNode;


function 
moveUp(node) {
    var 
newNode node.cloneNode("true");
    
newNode.setAttribute("position", (newNode.getAttribute("position") - 1));

    var 
prevRow node_before(node);
    var 
prevRowNode prevRow.cloneNode("true");
    
prevRowNode.setAttribute("position", (parseInt(prevRowNode.getAttribute("position")) + 1.0));
    var 
tableNode node.parentNode;
    
    var 
reattachee tableNode.replaceChildnewNodeprevRow);
    var 
reattachee tableNode.replaceChild(prevRowNodenode);
    
rebuild();
}

function 
moveDown(node) {
    var 
newNode node.cloneNode("true");
    
newNode.setAttribute("position", (parseInt(newNode.getAttribute("position")) + 1.0));

    var 
nextRow node_after(node);
    
    var 
nextRowNode nextRow.cloneNode("true");
    
nextRowNode.setAttribute("position", (nextRowNode.getAttribute("position") - 1));
    var 
tableNode node.parentNode;
    
    var 
reattachee tableNode.replaceChildnewNodenextRow);
    var 
reattachee tableNode.replaceChild(nextRowNodenode);
    
rebuild();


function 
rebuild() {

    var 
count =0;
    var 
movedown "<span onclick='moveDown(this.parentNode.parentNode);'> <img src='/img/down.gif' width='12' height='12' hspace='4'></span>";
    var 
moveup "<span onclick='moveUp(this.parentNode.parentNode)'> <img src='/img/up.gif' width='12' height='12' hspace='4'></span>";
    var 
thenode;
    var 
prevbutton;
    var 
tasks document.getElementsByTagName("TR");
    var 
id_name;
    for(var 
i=0i<tasks.length;i++) {

        
thenode tasks.item(i);
        if(
thenode.getAttribute("position")) {
                   
// для доступа к id будем использовать count - тогда работа будет идти только с теми строками, у которых есть атрибут position
                  
count++; 

          
idName 'text' count;  // input type="text"
          
orName 'order' count;  // input type="hidden"
          
var posnode document.getElementById(idName);
          var 
ornode document.getElementById(orName);
          var 
newpos thenode.getAttribute("position");
          
posnode.value newpos// changing field value
          
ornode.value newpos;  // changing field value
          //alert (idName); // проверяем
          //alert(newpos); // проверяем
          
downbutton node_after(first_child(thenode));
          
upbutton node_after(downbutton); 
          if(
count == 1) {
            
upbutton.innerHTML=""// - для первой строки стрелочки-обработчика up.gif не будет
         
} else {
            
upbutton.innerHTML moveup;
         }
         
downbutton.innerHTML movedown;            

    }
    if (
i==(tasks.length-1))downbutton.innerHTML=""// - для последней строки стрелочки-обработчика down.gif не будет
    
}


ну и наконец php 4)

PHP код: Выделить весь код

function set_order() {

        
$order 0;
        foreach (
$_POST['id_list'] as $id) {
            
$order++;
            
/*
                           дальше вызваем кто во что горазд - 
                           у меня, например класс-контроллер, 
                           работающий с соответственным объектом базы данных
                           и функция, делающая там update, 
                           завернутая в обработчик ошибок 
                           (а можно через try-catch) 
                        */
             
        
}
            return 
true;
    } 

Примечание - для совместимости с Mozilla, нужно подклюить еще библиотеку DOM whitespace.
Совсем забыла - из php в базу данных передается переменная цикла $order - которая и опрежеляет получившийся порядок элементов в списке

Последний раз редактировалось mar, 19-12-2005 в 00:19.


Отправлено: 23:23, 18-12-2005 | #12

Название темы: Мощь DHTML