Как получить список пользователей и получить информацию, сколько статей у каждого из них опубликовано (page_state = 0).
Вот как это можно сделать:
Код:
// Получение всех пользователей
$sql_users = "SELECT user_id, user_name FROM " . $db_users; // Извлекаем ID и имя пользователей
$users = $db->query($sql_users)->fetchAll(PDO::FETCH_ASSOC);
// Создаём XTemplate для вывода
$xtpl = new XTemplate(cot_tplfile('example', 'module'));
foreach ($users as $user) {
$userId = $user['user_id']; // ID пользователя
$userName = $user['user_name']; // Имя пользователя
// Подсчёт опубликованных статей пользователя
$sql_count = "SELECT COUNT(*) AS total
FROM " . $db_pages . "
WHERE page_state = 0 AND page_ownerid = ?";
$totalArticles = (int) $db->query($sql_count, [$userId])->fetchColumn();
// Передача данных в шаблон
$xtpl->assign(array(
'USER_ID' => $userId,
'USER_NAME' => $userName,
'TOTAL_ARTICLES' => $totalArticles,
));
$xtpl->parse('MAIN.USER_ROW'); // Обрабатываем блок USER_ROW
}
// Парсим и выводим основной блок
$xtpl->parse('MAIN');
$xtpl->out('MAIN');
Шаблон (example.tpl):
<table>
<tr>
<th>ID пользователя</th>
<th>Имя пользователя</th>
<th>Количество статей</th>
</tr>
<!-- BEGIN: USER_ROW -->
<tr>
<td>{USER_ID}</td>
<td>{USER_NAME}</td>
<td>{TOTAL_ARTICLES}</td>
</tr>
<!-- END: USER_ROW -->
</table>
Объяснение:
Получение данных из users:
SQL-запрос
"SELECT user_id, user_name FROM " . $db_users
извлекает ID и имя всех пользователей.
Данные сохраняются в массив $users.
Подсчёт статей для каждого пользователя:
Для каждого пользователя выполняется отдельный запрос: подсчитывается количество статей (page_state = 0) с помощью фильтрации по page_ownerid.
XTemplate:
Используется цикл foreach для обработки каждого пользователя.
В шаблон передаются переменные: USER_ID, USER_NAME, TOTAL_ARTICLES.
Для каждого пользователя используется блок USER_ROW.
Вывод в шаблон:
В таблице отображаются ID пользователя, его имя и общее количество опубликованных статей.
Теперь вывод будет содержать список всех пользователей с числом опубликованных статей у каждого.
Количество статей на странице пользователя
Чтобы адаптировать функционал для страницы публичного профиля пользователя, и показать количество опубликованных статей, владельцем, которых он является нам нужно:
- Получить ID текущего пользователя, чей профиль просматривается. В Cotonti CMF это обычно переменная
$urr['user_id'].
- Извлечь из таблицы
pages количество статей, которые принадлежат этому пользователю (page_ownerid = $urr['user_id']) и имеют статус page_state = 0.
- Передать результат в шаблон
users.details.tpl.
Код для адаптации:
// Получаем ID текущего пользователя из массива $urr
$userId = $urr['user_id'];
// Проверяем, что ID пользователя корректен
if ($userId > 0) {
// Подсчёт количества статей пользователя
$sql_count = "SELECT COUNT(*) AS total
FROM " . $db_pages . "
WHERE page_state = 0 AND page_ownerid = ?";
$totalArticles = (int) $db->query($sql_count, [$userId])->fetchColumn();
// Передача результата в шаблон
$t->assign(array(
'USER_DETAILS_TOTAL_ARTICLES' => $totalArticles, // Количество статей
));
}
Адаптация в шаблоне users.details.tpl:
Добавьте место для отображения количества статей, например:
<p>Количество опубликованных статей: {USER_DETAILS_TOTAL_ARTICLES}</p>
Объяснение:
-
Получение ID пользователя:
- В Cotonti на странице профиля пользователя данные берутся из массива
$urr. Переменная $urr['user_id'] содержит ID пользователя, чей профиль отображается.
-
SQL-запрос:
- Мы используем запрос
COUNT(*) для подсчёта статей, принадлежащих пользователю с ID из $urr['user_id'] и статусом page_state = 0.
-
Передача в шаблон:
- Передаём результат подсчёта в шаблон с помощью метода
$t->assign. В шаблоне доступна переменная {USER_DETAILS_TOTAL_ARTICLES}.
-
Вывод в шаблоне:
- В шаблоне
users.details.tpl добавляется вывод переменной {USER_DETAILS_TOTAL_ARTICLES} в удобном для вас формате.
Примечание:
Если у вас есть дополнительные данные, которые нужно связать с этой функциональностью, например, ссылки на сами статьи, можно дополнительно реализовать выборку данных через отдельный SQL-запрос.