Количество узлов по типу [закрыто]

39

Я ищу фрагмент, который позволяет мне отображать общее количество для определенного типа узла, например "Pages = 167" или "Products = 10630".

Какой код я должен использовать для достижения этой цели?

Диана
источник

Ответы:

34

Вот функция, которая будет возвращать количество узлов для определенного типа контента:

function YOURTHEME_get_node_count($content_type) {
  $query = 'SELECT COUNT(*) ' .
           'FROM {node} n ' .
           'WHERE n.type = :type';
  return db_query($query, array(
      ':type' => $content_type
  ))->fetchField();
}

Чтобы использовать этот код в своей теме, добавьте функцию в свою template.phpи затем вы можете вызвать функцию следующим образом:

echo 'Pages: ' . YOURTHEME_get_node_count('page');
echo 'Products: ' . YOURTHEME_get_node_count('product');
Cyclonecode
источник
56

Вы можете использовать модуль Views, чтобы сделать это.

  1. Создать новый вид, удалить параметры сортировки, поля и другие настройки по умолчанию
  2. Добавьте поле для «Содержимое: Тип»
  3. Разверните «расширенную» часть справа и установите «Использовать агрегацию» на «Да»
  4. Добавьте еще одно поле для «Content: Type»
  5. Во втором поле «Содержимое: Тип» нажмите «Параметры агрегации».
  6. Установите тип агрегации «считать»
  7. Второй «Content: Type» теперь должен выглядеть как «COUNT (Content: Type)»

Так и должно быть! При необходимости настройте дополнительные параметры, такие как метки полей и настройки стиля строки.

Вот экспорт такого представления, так что вы можете легко импортировать его и попробовать:

$view = new view;
$view->name = 'nodecounts';
$view->description = '';
$view->tag = 'default';
$view->base_table = 'node';
$view->human_name = 'Node counts';
$view->core = 7;
$view->api_version = '3.0';
$view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

/* Display: Master */
$handler = $view->new_display('default', 'Master', 'default');
$handler->display->display_options['title'] = 'Node counts';
$handler->display->display_options['group_by'] = TRUE;
$handler->display->display_options['access']['type'] = 'perm';
$handler->display->display_options['cache']['type'] = 'none';
$handler->display->display_options['query']['type'] = 'views_query';
$handler->display->display_options['query']['options']['query_comment'] = FALSE;
$handler->display->display_options['exposed_form']['type'] = 'basic';
$handler->display->display_options['pager']['type'] = 'none';
$handler->display->display_options['style_plugin'] = 'default';
$handler->display->display_options['row_plugin'] = 'fields';
$handler->display->display_options['row_options']['inline'] = array(
  'type_1' => 'type_1',
  'type' => 'type',
);
$handler->display->display_options['row_options']['separator'] = ': ';
$handler->display->display_options['row_options']['hide_empty'] = 0;
$handler->display->display_options['row_options']['default_field_elements'] = 1;
/* Field: Content: Type */
$handler->display->display_options['fields']['type_1']['id'] = 'type_1';
$handler->display->display_options['fields']['type_1']['table'] = 'node';
$handler->display->display_options['fields']['type_1']['field'] = 'type';
$handler->display->display_options['fields']['type_1']['label'] = '';
$handler->display->display_options['fields']['type_1']['alter']['alter_text'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['absolute'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['external'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['replace_spaces'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['trim_whitespace'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['nl2br'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['type_1']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['type_1']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['trim'] = 0;
$handler->display->display_options['fields']['type_1']['alter']['html'] = 0;
$handler->display->display_options['fields']['type_1']['element_label_colon'] = FALSE;
$handler->display->display_options['fields']['type_1']['element_default_classes'] = 1;
$handler->display->display_options['fields']['type_1']['hide_empty'] = 0;
$handler->display->display_options['fields']['type_1']['empty_zero'] = 0;
$handler->display->display_options['fields']['type_1']['hide_alter_empty'] = 1;
$handler->display->display_options['fields']['type_1']['link_to_node'] = 0;
$handler->display->display_options['fields']['type_1']['machine_name'] = 0;
/* Field: COUNT(Content: Type) */
$handler->display->display_options['fields']['type']['id'] = 'type';
$handler->display->display_options['fields']['type']['table'] = 'node';
$handler->display->display_options['fields']['type']['field'] = 'type';
$handler->display->display_options['fields']['type']['group_type'] = 'count';
$handler->display->display_options['fields']['type']['label'] = '';
$handler->display->display_options['fields']['type']['alter']['alter_text'] = 0;
$handler->display->display_options['fields']['type']['alter']['make_link'] = 0;
$handler->display->display_options['fields']['type']['alter']['absolute'] = 0;
$handler->display->display_options['fields']['type']['alter']['external'] = 0;
$handler->display->display_options['fields']['type']['alter']['replace_spaces'] = 0;
$handler->display->display_options['fields']['type']['alter']['trim_whitespace'] = 0;
$handler->display->display_options['fields']['type']['alter']['nl2br'] = 0;
$handler->display->display_options['fields']['type']['alter']['word_boundary'] = 1;
$handler->display->display_options['fields']['type']['alter']['ellipsis'] = 1;
$handler->display->display_options['fields']['type']['alter']['strip_tags'] = 0;
$handler->display->display_options['fields']['type']['alter']['trim'] = 0;
$handler->display->display_options['fields']['type']['alter']['html'] = 0;
$handler->display->display_options['fields']['type']['element_label_colon'] = FALSE;
$handler->display->display_options['fields']['type']['element_default_classes'] = 1;
$handler->display->display_options['fields']['type']['hide_empty'] = 0;
$handler->display->display_options['fields']['type']['empty_zero'] = 0;
$handler->display->display_options['fields']['type']['hide_alter_empty'] = 1;
$handler->display->display_options['fields']['type']['separator'] = '';
$handler->display->display_options['fields']['type']['format_plural'] = 0;

/* Display: Block */
$handler = $view->new_display('block', 'Block', 'block');
marcvangend
источник
Это выглядит "тяжелым" для производительности сервера.
Федир Рыхтик
7
@Fedir, если вы так думаете, вам нужно больше узнать о модуле Views. Это просто экспортированная конфигурация, и настройка свойств объекта совсем не тяжелая для сервера. Это правда, что модуль Views в целом будет использовать больше ресурсов, чем пользовательский блок, но это ничто, с чем не мог бы справиться самый маленький общий сервер. Существуют веские причины для использования представлений по всему сайту: удобство обслуживания, безопасность, ускоренная разработка и параметры кэширования. Пользовательский код тоже подойдет, но не отказывайтесь от Views только потому, что экспорт занимает 81 строку.
Marcvangend
3
Я согласен, модуль Views может быть весьма полезен во многих ситуациях. Для текущей задачи я буду использовать простой запрос для подсчета объекта, так как он будет легче. Я не люблю накладывать расходы, где я мог бы это быстрее.
Федир Рыхтик
11

Предпочтительным программным способом является использование класса EntityFieldQuery . Узнайте, почему EntityFieldQuery превосходит db_query () .

Вот пример подсчета узлов типа Блог.

$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node') // grab nodes
->entityCondition('bundle', 'blog') // filter by blog type
->propertyCondition('status', 1) // filter by published
->count(); // count

$result = $query->execute();

Смотрите аналогичный вопрос .

timofey.com
источник
7

Я сделал это с помощью EntityFieldQuery.

$query = new EntityFieldQuery();
$query->entityCondition('entity_type', 'node')
    /* this is the content type machine name */
    ->entityCondition('bundle', 'product')
    /* You can set extra properties using fieldCondition and properties with propertyCondition */
    ->fieldCondition('field_product_status', 'tid', key(taxonomy_get_term_by_name('New')))
    ;

$result = $query->execute();
if (isset($result['node'])){
    $count_of_new_product_nodes = count($result['node']); 
}
Coomie
источник
3
К сожалению, EntityFieldQuery должен будет извлечь все узлы из баз данных, а затем посчитать, сколько их там. Так что это действительно тяжело. Используйте приведенные выше представления или ответы на SQL, они намного легче.
Марио Авад
5

Использование Drush просто и быстро.

drush sqlq 'select count(node.nid) as node_count, node_type.type from node inner join node_type on node.type = node_type.type group by node_type.type'

Это дает вывод, похожий на:

node_count  type
17  category_2012
20  category_2013
19  category_2014
3   competition
19  entry_2012_breakthrough
89  entry_2012_digitalother
50  entry_2012_directdirect
19  entry_2012_filmsecscn
17  entry_2012_insights
12  entry_2012_outdoor
31  entry_2012_promo
19  entry_2013_breakthrough
100 entry_2013_digitalother
40  entry_2013_directdirect

И затем, если вы хотите фильтровать по определенному типу, просто используйте grep следующим образом:

drush sqlq 'select count(node.nid) as node_count, node_type.type from node inner join node_type on node.type = node_type.type group by node_type.type' | grep 2014
Патоши パ ト シ
источник
3

Для тех , кто заинтересован, другим решением является использование countQuery метод SelectQuery класса (через db_select ).

$count = db_select('node')
  ->condition('type', 'some-type')
  ->countQuery()->execute()->fetchField();

Однако я предпочитаю решение EntityFieldQuery, опубликованное Timofey. Я предоставляю это только в качестве разумной альтернативы.

tomcant
источник
1
SELECT
  COUNT({node}.nid) AS node_count,
  {node_type}.type
FROM {node}
  INNER JOIN {node_type} ON {node}.type = {node_type}.type
GROUP BY {node_type}.type;

Используйте этот запрос в своем коде

Adi
источник
0

Модуль подсчета Типа узла делает то же самое, что вам требуется.

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

Этот модуль будет использоваться только для целей статистики и разработки.

ДЕВАРАЖ ДЖОНСОН
источник
0

В качестве варианта ответа на вопрос об использовании модуля Views вы можете «использовать» представление, которое поставляется с модулем Charts . Просто установите / включите его, никаких дополнительных настроек, кодирования и т. Д. Не требуется. Еще некоторые подробности об этом представлении, включенные в готовые примеры (цитата по этой ссылке):

... перейти на charts/examples/viewsваш сайт. Затем вы должны увидеть столбчатую диаграмму и круговую диаграмму, за которой также следует табличное отображение. Обе диаграммы и отображение таблицы содержат данные об общем количестве узлов для каждого из доступных типов контента.

Заметки:

  • В качестве бонуса, кроме табличного формата, вы также получаете диаграмму для визуализации количества узлов по типу контента.
  • Если вам нравится вид, и / или он близок к тому, что вы хотите, вы также можете клонировать вид, а затем просто снова отключить модуль Charts.

Раскрытие: я поддерживаю этот модуль,
я надеюсь, что это не нарушает политику сайта по саморекламе .

Pierre.Vriens
источник