Есть представление со списком материалов.
Настройка стандартных полей не подойдет, так как для каждого пользователя сортировка материалов будет индивидуальной.
Из базы по uid пользователя получаю массив такого вида.
<?php
$material_weights = array(
0 => array(
'nid' => 54545,
'weight' => 0
),
1 => array(
'nid' => 545,
'weight' => 1
),
2 => array(
'nid' => 225,
'weight' => 2
),
3 => array(
'nid' => 6,
'weight' => 5
),
)
?>
Понимаю, что надо использовать какой-то hook. Если найду, что писать внутри представления никакого нет...(
Во вьюсе может быть больше материалов, в этом случае все, которых нет в массиве, должны встать в конец (ну это я решу). Существующим понять бы, как задать порядок вывода.
Комментарии
Например передать в рендер элементы с #weight рендер их сам отсортирует
Дело в том что у меня еще идет группировка по термину, и в первую очередь должна срабатывать сортировка по нему, то есть чтобы последовательность групп не изменилась, а потом уже должна сработать сортировка по весу. То есть вес должен менять внутри группы, не затрагивая последовательность групп.
И второе: что значит передать weight в рендер?))
перебрать $view->result и просто на каждой итерации добавлять в массив соответствующий ему элемент weight?
Группы рендерятся выше, Вам надо изменить рендер внутри группы, добавить к элементам #weight
Если анформат лист, то например
hook_preprocess_views_view_unformatted(&$vars)
там есть rows
перебрал массив из объектов, вот содержимое
<?php
stdClass Object
(
[nid] => 20990
[node_title] => 4848548
[users_node_name] => erer
[users_node_uid] => 487
[profile_users_pid] => 59
[users_node_picture] => 843
[users_node_mail] => mail@mail.ru
[node_comment_statistics_comment_count] => 0
[node_type] => task
[node_field_data_field_link_to_project_title] => Сделать выплату верстальщику 5
[node_field_data_field_link_to_project_nid] => 20860
[node_uid] => 487
[profile_users_1_pid] => 2
[users_field_data_field_task_executor_name] => zlenk
[users_field_data_field_task_executor_uid] => 502
[users_field_data_field_task_executor_picture] => 866
[users_field_data_field_task_executor_mail] => mail@mail.ru
[taxonomy_term_data_field_data_field_task_status_weight] => 0
[taxonomy_term_data_field_data_field_priority_weight] => 2
[field_data_field_weight_field_weight_value] => 0
[node_created] => 1556254103
[field_data_field_task_status_node_entity_type] => node
[field_data_field_weight_node_entity_type] => node
[field_data_field_task_files_node_entity_type] => node
[field_data_field_fio_profile2_entity_type] => profile2
[field_data_field_recording_node_entity_type] => node
[field_data_field_priority_node_entity_type] => node
[field_data_field_task_date_node_entity_type] => node
[field_data_field_local_phone_profile2_entity_type] => profile2
[_field_data] => Array
(?>
вот сам перебор
<?php foreach($vars['view']->result as $item){
if (array_key_exists($item->nid, $tasksarray)) {
$item->{'#weight'} = $tasksarray[$item->nid]->weight;//вот тут в объект добавил новое свойство '#weight'
}
}
?>Вижу что один простой шаг остался, но опыта не было, не понимаю как его воткнуть теперь, чтобы заработало.
распечатываю объекты в переборе. свойство '#weight' появилось, но на порядок оно не влияет...
Это не Drupal-way.
Drupal-way будет - добавить к материалу поле-флаг модулем https://www.drupal.org/project/flag
У него как раз есть подмодуль https://www.drupal.org/project/flag_weights или любой другой, более "удобный".
"флаги" - "персональны" для каждого пользователя.
добавляете в вьюс это поле-флаг и делаете по нему сортировку.
Всё.
у меня есть материал с прикрепленными к нему материалами, перетаскиванием пользователь меняет их последовательность.
последовательность должна сохраниться, сохраниться.
Как флаги могут помочь с сортировкой?
Я бы посмотрел в сторону очередей https://www.drupal.org/project/entityqueue и вообще модулей сортировки вьюсов.
Там всякое, от node order до draggable views.
Может кто-то из них умеет сохранять сортировки per user