Часто при разработке сайтов необходимо выполнять сортировку нод по какому-либо отдельному критерию. Для её выполнения используются Views, Nodequeue, Flag и другие похожие модули. Но иногда функционала таких модулей бывает недостаточно для удовлетворения хитрых требований заказчика. Конечно же, можно наплодить nodequeue и дальше рассказывать заказчику, которая из них за что отвечает, но такая система, с точки зрения юзабилити, выглядит по меньшей мере сомнительной. Другим вариантом решения может стать добавление cck-поля “weight”, когда вручную для каждой ноды выставляется ее вес и уже по нему производиться сортировка. Но опять же, при наличии тысяч нод, данный способ не представляется реализуемым.
Адекватным же решением этой проблемы будет обращение к “drag-and-drop” интерфейсу, и то, как это реализуется, является темой данной статьи. Первым делом мы, все-таки, добавляем к нужному типу контента cck-поле “weight”. Затем в hook_menu объявляем страницу, на которой будет draggable-интерфейс и, собственно, сама форма:
function my_module_drag_form($form_state, $node) { $form['my_items']['#tree'] = TRUE; $vids = my_module_select_vids_function(); // выбираем нужные ноды //правильный способ выполнения запроса к ссk-полям $type_name = 'product'; $field_name = 'field_product_weight'; $type = content_types($type_name); $field = $type['fields'][$field_name]; $data = content_database_info($field); $join = $data['table']; $field = $data['columns'][end(array_keys($data['columns']))]['column']; //выбираем тайтлы нод и значение поля "weight" $q = db_query("SELECT f.%s, n.title, n.nid, n.vid FROM {node} n INNER JOIN {%s} f ON f.vid = n.vid WHERE n.vid IN (" . db_placeholders($vids, 'int') . ") ORDER BY f.%s ASC", array_merge(array($field), array($join), $vids, array($field))); //собственно сама форма while ($d = db_fetch_array($q)) { $form['my_items'][$d['vid']] = array( 'name' => array( '#type' => 'markup', '#value' => l($d['title'], 'node/' . $d['nid']), ), 'weight' => array( '#type' => 'weight', '#delta' => 10, '#default_value' => $d[$field], '#attributes' => array('class' => 'weight'), ), ); } $form['submit'] = array( '#type' => 'submit', '#value' => t('Save Changes'), ); return $form; }