Кількість вузлів за типом [закрито]


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');

56

Для цього можна використовувати модуль Views .

  1. Створіть новий вид, видаліть параметри сортування, поля та інші настройки за замовчуванням
  2. Додати поле для "Вміст: Тип"
  3. Розгорніть «розширену» частину праворуч і встановіть «Використовувати агрегацію» на «Так»
  4. Додати ще одне поле для "Вміст: Тип"
  5. У другому полі "Вміст: Тип" натисніть "Налаштування агрегації"
  6. Встановіть тип агрегації на "підрахунок"
  7. Другий "Вміст: Тип" тепер повинен виглядати як "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');

Це виглядає "важким" для продуктивності сервера.
Федір РИХТИК

7
@Fedir, якщо ви вважаєте, що вам потрібно дізнатися більше про модуль Views. Це лише експортована конфігурація, а налаштування властивостей на об'єкт зовсім не важка для сервера. Це правда, що модуль Views в цілому використовуватиме більше ресурсів, ніж спеціальний блок, але найменший спільний сервер не може впоратися. Є вагомі причини використовувати представлення даних на всьому веб-сайті: ремонтопридатність, безпека, швидший розвиток та кешування. Спеціальний код теж добре, але не відкидайте перегляди лише тому, що експорт займає 81 рядок.
marcvangend

3
Я згоден, модуль Views може бути дуже корисним у багатьох ситуаціях. Для поточного завдання я буду використовувати простий запит для підрахунку об'єкта, оскільки він буде легшим. Я не люблю накладати голову там, де я міг би швидше.
Федір РИХТИК

11

Кращим, програмним способом, є використання класу EntityFieldQuery . Дізнайтеся, чому EntityFieldQuery перевершує db_query () .

Ось приклад підрахунку вузлів типу Blog.

$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();

Дивіться подібне запитання .


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']); 
}

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. Я пропоную це лише як досить розумну альтернативу.


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;

Використовуйте цей запит у своєму коді


0

Кількість Тип вузла модуля робити те ж саме , як вам потрібно.

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

Цей модуль буде використовуватися лише для статистичних та розробок.


0

Як варіант у відповіді про використання модуля Views , ви можете "використовувати" представлення, що поставляється з модулем " Графіки" . Просто встановіть / увімкніть її, не потрібно додаткової конфігурації, кодування тощо. Ще деякі подробиці щодо цього подання, включені у вичерпні приклади (цитата за цим посиланням):

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

Примітки:

  • Як бонус, окрім табличного формату, ви також отримуєте діаграму для візуалізації кількості вузлів за типом вмісту.
  • Якщо вам подобається перегляд, та / або він близький до того, що ви хочете, ви також можете клонувати його, а потім просто знову відключити модуль «Графіки».

Розкриття: Я підтримую цей модуль,
сподіваюся, це не порушує політику сайту щодо самореклами .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.