Так что я уже давно к этому прихожу.Я пытаюсь создать перетаскиваемую таблицу, которая имеет отношения родитель-потомок, но где дети не могут быть перемещены из родительской группы, и все родители сортируются между собой.Я смоделировал мою форму и тему из кода меню администратора, и он дублирует эту функциональность.Проблема в том, что я могу перевести детей к другому родителю или позволить ему стать родителем.В качестве иллюстрации:
Category 1
|
|--Item 1
|--Item 2
Category 2
|
|--Item 3
|--Item 4
|--Item 5
Я хотел бы иметь возможность сортировать элементы 1 и 2 друг с другом, а также элементы 3, 4 и 5 друг с другом, но не перемещать их между категориями.1 и Категория 2. Мне также нужно иметь возможность сортировать категории 1 и 2 друг с другом, забирая детей с собой.Я прошел через множество комбинаций настроек $action
, $group
, $subgroup
, смешанных с настройками $class
для категорий и элементов, которые я потерял.Ничто из того, что я пробовал до сих пор, не дало желаемого результата.Вот соответствующие биты моего кода в том виде, в котором он есть на данный момент:
В моей форме:
$form['#tree'] = true;
foreach($categories as $cat) {
if(!isset($form['categories'][$cat->cid])){
$form['categories'][$cat->cid] = array(
'weight' => array(
'#type' => 'weight',
'#delta' => 25,
'#attributes' => array('class' => array('item-weight', 'item-weight-' . $cat->cid)),
),
'cid' => array(
'#type' => 'hidden',
'#value' => $cat->cid,
'#attributes' => array('class' => array('cid')),
),
);
foreach($cats[$cat->cid] as $item) {
$form['categories'][$cat->cid]['items'][$item->id] = array(
'weight' => array(
'#type' => 'weight',
'#delta' => 25,
'#default_value'=> $item->weight,
'#attributes' => array('class' => array('item-weight', 'item-weight-' . $cat->cid)),
),
'cid' => array(
'#type' => 'hidden',
'#value' => $cat->cid,
'#attributes' => array('class' => array('cid')),
),
);
}
}
}
В моей теме:
$children = element_children($form['categories']);
$rows = array();
if(count($children) > 0) {
foreach($children as $cid) {
$row = array(
drupal_render($form['categories'][$cid]['weight']) .
drupal_render($form['categories'][$cid]['cid']),
);
$rows[] = array(
'data' => $row,
'class' => array('draggable', 'tabledrag-root'),
);
foreach(element_children($form['categories'][$cid]['items']) as $id) {
$row = array(
theme('indentation', array('size' => 1)) . drupal_render($form['categories'][$cid]['items'][$id]['name']),
drupal_render($form['categories'][$cid]['items'][$id]['weight']) .
drupal_render($form['categories'][$cid]['items'][$id]['cid']),
);
$rows[] = array(
'data' => $row,
'class' => array('draggable', 'tabledrag-leaf'),
);
}
drupal_add_tabledrag('cat-table', 'order', 'sibling', 'item-weight', 'item-weight-' . $cid);
}
}
drupal_add_tabledrag('cat-table', 'match', 'parent', 'cid', 'cid', 'cid', true, 1);
$output = theme('table', array('header' => $headers, 'rows' => $rows, 'attributes' => array('id' => 'cat-table')));
$output .= drupal_render_children($form);
return $output;
Я прочитал болеедокументация для drupal_add_tabledrag()
, просмотр кода, пример кода, поиск по drupal.org и Google, но ничего не найдено.
Мое единственное решение до сих пор - копировать и изменятьфайл tabledrag.js, чтобы просто исключить эти возможности, но, при этом, останавливая проблему с отступами для элементов (то есть не позволяя им относиться к тем же категориям), хранить их в одной категории было неинтересно.
Полагаю, самый важный вопрос: возможно ли использование стандартного Drupal?