При розробці сайтів досить часто потрібно виконати сортування нод за якимось окремим критерієм. Для цього здебільшого використовують Views, NodequeueFlag та інші схожі модулі. Але нерідко трапляється так, що функціоналу цих модулів виявляється замало, аби задовольнити хитрі вимоги замовника. Звісно ж, можна вдатись до створення безлічі 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; }