Часто при разработке сайтов необходимо выполнять сортировку нод по какому-либо отдельному критерию. Для её выполнения используются 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;
}



































































