Views. Как показывать вначале списка пользователей, разместивших когда-либо хоть один материал?

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

Аватар пользователя misterpronin misterpronin 1 мая 2015 в 17:58

Здравствуйте. У меня есть выборка views, отображающая пользователей, проиндексированных в apache solr. Хочу отсортировать пользователей таким образом, чтобы в самом начале были те, кто когда-либо разместил хоть один материал.

Кто-нибудь сталкивался с решением подобной задачи?

Заранее спасибо за помощь!

Комментарии

Аватар пользователя dashiwa dashiwa 1 мая 2015 в 18:23

SELECT COUNT(nid) AS countnid,
FROM node
ORDER BY countnid ASC'"

А вообще надо смотреть запрос ,кто его знает какие там таблицы,может вьюхой и не получится

Аватар пользователя kirill_dan kirill_dan 1 мая 2015 в 22:16

dashiwa wrote:
select nid as countnid from node order by(select count(nid) from node)
то бишь так..ну или типо того..

Вы просто разорвали всех друпалеров в клочья!

Аватар пользователя kirill_dan kirill_dan 1 мая 2015 в 22:14

Во вьюсе вы этого не сделаете никак. Так как можете оперировать там только индексированными данными из Solr. Как вариант, то можно ловить данные в шаблоне и там шаманить. Но тогда побьется пейджер. Но скорее всего придется писать свой виджет для вьюса. Все еще зависит от того, куда вы хотите вывести данные. В блок или на страницу. Но мне не совсем понятно, зачем пользователей индексировать? У вас миллионы пользователей с кучей полей по которым постоянно происходит поиск? Вы бы еще таблицу ролей проиндексировали в Solr (сарказм).

Аватар пользователя misterpronin misterpronin 1 мая 2015 в 23:54

"dashiwa" wrote:
то бишь так..ну или типо того..

Как я понял это не совсем то. Похоже на то, что это способ сортировать материалы, а не пользователей. Поправьте если ошибаюсь.

"kirill_dan" wrote:
Но мне не совсем понятно, зачем пользователей индексировать?

А почему бы и нет? Полей много, есть фасетный поиск по ним, а если есть фасетный поиск, то почему бы и apache solr не подключить...

Задача конечно не из простых, но всё равно спасибо за идеи.

Аватар пользователя sg85 sg85 2 мая 2015 в 9:42

Чтобы сделать подобное, включите пользователей материала в индекс(то есть, индексируете ноды с полями авторов), иначе, при любых манипуляциях с views в обход с search api и facet api у Вас возникнут проблемы вида - на фесете написано, что например, в категории рубашек 65 материалов, а отображаются почему-то только 40, что, согласитесь, не красиво.

НУ или если Вам не надо связывать эту задачу с поиском, а просто нужно вывести пользователей, у которых есть материалы, то либо создаете вьювс материала, в котором в relations указываете таблицу пользователей, и выводите этих самых пользователей, либо наоборот, вьюху пользователей с обязательным relation ноды, но если галки "обязательная связь" не хватит, то тут возможно понадобится добавить фильтр uid >= 0(не помню есть ли там в фильтрах not isNull), такой вариант может оказаться самым запутанным, потому его не советую.

Аватар пользователя sg85 sg85 2 мая 2015 в 10:09

Хотя хрень написал, судя по названию топика, Вам нужна именно сортировка по кол-ву материала у пользователя, тут в голову по приходит только - реализовать как раз через Search API, индекс по пользователям, а в полях число материала(если в возможных индексируемых полях такого пункта нет, то можно написать свой плагин к Search API, там должно получиться буквально 3 строки(давно не писал к нему плагины, так что Вам придется курить маны по плагинам Serach API, так же, скорее всего, придется добавить обновление записи в индексе при добавлении/удалении ноды). И когда создадите вьюху по этому индексу - просто добавьте сортировку по этому полю по убыванию.

Аватар пользователя kirill_dan kirill_dan 2 мая 2015 в 14:31

sg85 wrote:
Хотя хрень написал, судя по названию топика, Вам нужна именно сортировка по кол-ву материала у пользователя, тут в голову по приходит только - реализовать как раз через Search API, индекс по пользователям, а в полях число материала(если в возможных индексируемых полях такого пункта нет, то можно написать свой плагин к Search API, там должно получиться буквально 3 строки(давно не писал к нему плагины, так что Вам придется курить маны по плагинам Serach API, так же, скорее всего, придется добавить обновление записи в индексе при добавлении/удалении ноды). И когда создадите вьюху по этому индексу - просто добавьте сортировку по этому полю по убыванию.

Ваша первая идея была верной. Нужно индексировать ноду с включением в индекс поля автора. Выводить ноды сгруппировав их по автору. И указав сортировку по группе (если будет такая возможность). А плагины к поисковому АПИ ничего не знают о ваших нодах и способах их сортировки, так как данные вы выводите через вьюсы.

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

Аватар пользователя sg85 sg85 3 мая 2015 в 15:15

"kirill_dan" wrote:
Но опять таки, вопрос остался актуальным, куда вы вывод делаете? Если в блок, то задача простая, как угол дома.

Это вьювс, вывод можно делать куда душе угодно - блок/страница/xml/в другую вьюху и т.д.

Аватар пользователя sg85 sg85 3 мая 2015 в 15:53

"kirill_dan" wrote:
Ваша первая идея была верной. Нужно индексировать ноду с включением в индекс поля автора. Выводить ноды сгруппировав их по автору. И указав сортировку по группе (если будет такая возможность). А плагины к поисковому АПИ ничего не знают о ваших нодах и способах их сортировки, так как данные вы выводите через вьюсы.

Там на самом деле не совсем плагины, я ошибся, а дополнительное свойство сущности, например:

function yourmodule_entity_property_info_alter(&$info) {
  $properties = &$info['user']['properties'];
  $properties['mcount'] = array(
    'type' => 'integer',
    'label' => t('Node count'),
    'sanitized' => TRUE,//дабы не вызывать всяких check_plain ибо тут это не имеет смысла
    'getter callback' => 'mcount_getter_callback',//геттер этого свойства
  );
}
function mcount_getter_callback($item){
  return db_query("SELECT COUNT(*) FROM {node} WHERE uid = :uid", array(
    ':uid' => $item->uid,
  ))->fetchField();
}

тут вроде бы будет казаться, что все замечательно, но, т.к. индекс будет по сущностям user, а это новое свойство целиком и полностью зависит от сущности node, надо будет при добавлении и удалении ноды обновлять запись в индексе user, сделать это можно в соответствующих хуках при помощи search_api_track_item_change($type, array $item_ids) (вроде)

Аватар пользователя dashiwa dashiwa 3 мая 2015 в 16:53

В контексте задачи, я думаю, может проще тянуть из базы в блок одним запросом?
Хотя теоретизировать можно по разному.
Но не вижу смысла, здесь использовать, что-то более сложное