Drupal: Показать список вкладов (опубликованных материалов) для каждого пользователя - PullRequest
1 голос
/ 12 мая 2011

Я ищу способ отображения на странице профиля участника количества вкладов в некоторых типах контента. В основном это должно отображать что-то вроде этого:

Блог (10)
Статьи (10)
Вопросы (19)
Комментарии (30)
Советы (3)

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

Мне интересно, проще ли было бы просто зашифровать его в свой файл шаблона, начав брать uid и просто выполнить некоторые запросы с типами контента, которые я хочу отобразить, но я не уверен, как это сделать что либо.

Любая помощь или предложения будут очень признательны.

Искренняя - Местика

Edit:
Я нашел решение сделать это вручную с помощью запроса для каждого типа контента, но я все еще очень заинтересован в более элегантном и плавном решении.

Я использую этот код:

global $user;
$userid = $user->uid;
$blog_count  = db_result(db_query("SELECT COUNT(0) AS num FROM {node} n where n.type = 'blog' AND status = 1 AND n.uid = {$userid}"));

Ответы [ 2 ]

1 голос
/ 17 мая 2011

Если вы используете основной модуль Profile, вы можете использовать что-то вроде ниже. Он покажет узлы, созданные пользователем, чей профиль просматривается. В качестве дополнительного преимущества требуется выполнить только один пользовательский запрос к базе данных.

Вставьте этот фрагмент в template.php в папке вашей темы и замените «THEMENAME» на имя вашей темы:

function THEMENAME_preprocess_user_profile(&$variables) {
  // Information about user profile being viewed
  $account = $variables['account'];

  // Get info on all content types
  $content_types = node_get_types('names');

  // Get node counts for all content types for current user
  $stats = array();
  $node_counts = db_query('SELECT type, COUNT(type) AS num FROM {node} WHERE status = 1 AND uid = %d GROUP BY type', $account->uid);
  while ($row = db_fetch_array($node_counts)) {
    $stats[] = array(
      'name' => $content_types[$row['type']],
      'type' => $row['type'],
      'num' => $row['num'],
    );
  }
  $variables['node_stats'] = $stats;
}

Теперь в user-profile.tpl.php можно добавить что-то похожее на:

// If user has created content, display stats
<?php if (count($node_stats) > 0): ?>

  // For each content type, display a DIV with name and number of nodes
  <?php foreach ($node_stats as $value): ?>
    <div><?php print $value['name']; ?> (<?php print $value['num']; ?>)</div>
  <?php endforeach; ?>

// Message to show for user that hasn't created any content
<?php else: ?>
  <?php print $account->name; ?> has not created any content.
<?php endif; ?>

Это всего лишь общее представление о том, что вы можете сделать. Вы также можете добавить ограничения к типам контента, которые вы ищете / отображать, проверить разрешения для пользователей на просмотр этой статистики, использовать CSS для изменения вида статистики и т. Д.

Если вы используете Профиль содержимого , вы можете использовать THEMENAME_preprocess_node() и проверить, что узел является узлом профиля, прежде чем выполнять этот код.

1 голос
/ 12 мая 2011

Учитывая ваше простое требование и тот факт, что у вас есть оператор SQL, я бы сказал, просто используйте его. Нет причин добавлять еще один модуль на ваш сайт и влиять на его производительность ради одного запроса.

Тем не менее, с точки зрения "разделения интересов", вы не должны просто отбрасывать этот SQL в свой шаблон. Вместо этого вы должны добавить его результат в список доступных переменных, используя функцию препроцессора в вашем файле template.php, ограничивая область его действия тем, где вам это нужно, чтобы не выполнять этот запрос к базе данных ни на каких страницах, а на соответствующей странице профиля.

...