Как программно отсортировать материалы во views

Главные вкладки

Аватар пользователя engenes engenes 26 апреля 2019 в 9:13

Есть представление со списком материалов.
Настройка стандартных полей не подойдет, так как для каждого пользователя сортировка материалов будет индивидуальной.

Из базы по uid пользователя получаю массив такого вида.

<?php
$material_weights 
= array(
    
=> array(
        
'nid' => 54545,
        
'weight' => 0
    
),
    
=> array(
        
'nid' => 545,
        
'weight' => 1
    
),
    
=> array(
        
'nid' => 225,
        
'weight' => 2
    
),
    
=> array(
        
'nid' => 6,
        
'weight' => 5
    
),
)
?>

Понимаю, что надо использовать какой-то hook. Если найду, что писать внутри представления никакого нет...(

Во вьюсе может быть больше материалов, в этом случае все, которых нет в массиве, должны встать в конец (ну это я решу). Существующим понять бы, как задать порядок вывода.

Комментарии

Аватар пользователя engenes engenes 26 апреля 2019 в 11:16

Дело в том что у меня еще идет группировка по термину, и в первую очередь должна срабатывать сортировка по нему, то есть чтобы последовательность групп не изменилась, а потом уже должна сработать сортировка по весу. То есть вес должен менять внутри группы, не затрагивая последовательность групп.

И второе: что значит передать weight в рендер?))

перебрать $view->result и просто на каждой итерации добавлять в массив соответствующий ему элемент weight?

Аватар пользователя sas@drupal.org sas@drupal.org 26 апреля 2019 в 11:28

Группы рендерятся выше, Вам надо изменить рендер внутри группы, добавить к элементам #weight

Если анформат лист, то например
hook_preprocess_views_view_unformatted(&$vars)
там есть rows

Аватар пользователя engenes engenes 26 апреля 2019 в 12:37

перебрал массив из объектов, вот содержимое

<?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' появилось, но на порядок оно не влияет...

Аватар пользователя Orion76 Orion76 26 апреля 2019 в 9:38
1

Это не Drupal-way.
Drupal-way будет - добавить к материалу поле-флаг модулем https://www.drupal.org/project/flag
У него как раз есть подмодуль https://www.drupal.org/project/flag_weights или любой другой, более "удобный".

"флаги" - "персональны" для каждого пользователя.

добавляете в вьюс это поле-флаг и делаете по нему сортировку.

Всё.

Аватар пользователя engenes engenes 26 апреля 2019 в 11:19

у меня есть материал с прикрепленными к нему материалами, перетаскиванием пользователь меняет их последовательность.
последовательность должна сохраниться, сохраниться.
Как флаги могут помочь с сортировкой?