Всем привет! Подскажите, можно ли сделать, чтобы посты со стены были в ленте постов? У меня несколько типов контента на сайте: посты (на главной сайта), фото, статьи, объявления и они все на разных страницах. У каждого типа своя страница. Стену у пользователей отключил. Вот думаю включить ее, но хотелось бы, чтобы посты со стены появлялись в ленте постов на главной странице сайта. Можно ли такое сделать?
Всем привет! Подскажите, можно ли сделать, чтобы посты со стены были в ленте постов?
виджет лента активности
виджет лента активности
Нет, не то. Нужно, чтобы в определенную ленту контента посты со стены шли. У меня отдельные ленты — фото, посты, статьи и т.д. И вот надо, чтобы в ленту с постами шли посты со стены
Заказывать виджет с выводом списка типов контента (чтобы можно было выбирать) и ставить его на главную
виджет лента активности TOPg Нет, не то. Нужно, чтобы в определенную ленту контента посты со стены шли. У меня отдельные ленты — фото, посты, статьи и т.д.
1. Сделайте бекап
2. замените содержимое файла шаблона ленты активности list.php
<?php $last_date = ''; $widget_id = $widget_id ?? 'activity'; $unique_prefix = 'activity_widget_' . $widget_id; $js_class = 'js-activity-widget-' . $widget_id; ?> <div class="icms-activity__list_wd <?php echo $js_class; ?>" id="<?php echo $unique_prefix; ?>"> <?php foreach($items as $item) { ?> <?php if ($show_date_groups) { ?> <?php if ($item_date != $last_date) { ?> <?php switch($item_date) { case $today_date: $date = LANG_TODAY; break; case $yesterday_date: $date = LANG_YESTERDAY; break; default: $date = lang_date($item_date); } ?> <h4 class="icms-activity__list-day"><?php echo $date; ?></h4> <?php $last_date = $item_date; ?> <?php } ?> <?php } ?> <?php $url = href_to_profile($item['user']); ?> <div class="icms-activity__list-item media mb-3" id="<?php echo $unique_prefix; ?>_item_<?php echo $item['id']; ?>"> <?php if ($show_avatars) { ?> <a href="<?php echo $url; ?>" class="icms-user-avatar mr-2 mr-md-3 small <?php echo !empty($item['user']['is_online']) ? 'peer_online' : 'peer_no_online'; ?>"> <?php if($item['user']['avatar']) { ?> <?php echo html_avatar_image($item['user']['avatar'], 'micro', $item['user']['nickname']); ?> <?php } else { ?> <?php echo html_avatar_image_empty($item['user']['nickname'], 'avatar__mini'); ?> <?php } ?> </a> <?php } ?> <div class="media-body"> <h6 class="my-0"> <a class="author" href="<?php echo $url; ?>"><?php html($item['user']['nickname']); ?></a> <?php echo $item['description']; ?> <?php if ($item['is_private']) { ?> <span class="is_private" title="<?php html(LANG_PRIVACY_PRIVATE); ?>"> <?php html_svg_icon('solid', 'lock'); ?> </span> <?php } ?> </h6> <div class="details"> <?php echo $item['date_diff']; ?> </span> <a href="<?php echo $item['reply_url']; ?>" class="btn btn-sm"> <?php html_svg_icon('solid', 'reply'); ?> <?php echo LANG_REPLY; ?> </a> <?php } ?> </div> <div class="d-flex justify-content-start flex-wrap"> <?php foreach($item['images'] as $image) { ?> <a href="<?php echo $image['url']; ?>" class="mr-1 mt-1" data-fancybox="<?php echo $unique_prefix; ?>_gallery_<?php echo $item['id']; ?>"> <img src="<?php echo $image['src']; ?>" class="img-fluid" alt="<?php html(!empty($image['title']) ? $image['title'] : $item['subject_title']); ?>"> </a> <?php } ?> </div> <?php } ?> </div> </div> <?php } ?> </div> <script> if (typeof window.ActivityWidgetManager === 'undefined') { window.ActivityWidgetManager = { initializedWidgets: new Set(), initWidget: function(widgetId) { if (this.initializedWidgets.has(widgetId)) return; this.initializedWidgets.add(widgetId); this.initFancybox(widgetId); }, initFancybox: function(widgetId) { if (typeof $.fancybox === 'undefined') return; const galleryGroups = {}; document.querySelectorAll(`#${widgetId} [data-fancybox]`).forEach(element => { const galleryName = element.getAttribute('data-fancybox'); if (!galleryGroups[galleryName]) galleryGroups[galleryName] = []; galleryGroups[galleryName].push({ src: element.getAttribute('href'), opts: { caption: element.querySelector('img')?.alt || '' } }); }); for (const [galleryName, items] of Object.entries(galleryGroups)) { document.querySelectorAll(`#${widgetId} [data-fancybox="${galleryName}"]`).forEach(element => { element.addEventListener('click', function(e) { e.preventDefault(); $.fancybox.open(items, {}, 0); }); }); } }, initAllWidgets: function() { document.querySelectorAll('.icms-activity__list_wd').forEach(container => { this.initWidget(container.id); }); } }; document.addEventListener('DOMContentLoaded', () => window.ActivityWidgetManager.initAllWidgets()); window.addEventListener('load', () => window.ActivityWidgetManager.initAllWidgets()); } else { document.addEventListener('DOMContentLoaded', () => window.ActivityWidgetManager.initAllWidgets()); } </script>
3. по адресу system/controllers/activity/widgets/list/ заменить содержимое файла widget.php
<?php
class widgetActivityList extends cmsWidget {
public function run() {
$show_avatars = $this->getOption('show_avatars');
$show_date_groups = $this->getOption('date_group');
$offset = $this->getOption('offset', 0);
$limit = $this->getOption('limit', 10);
$only_wall = $this->getOption('only_wall', false);
$items = $only_wall? $this->getWallEntries($offset, $limit): $this->getActivityEntries($offset, $limit);
if (!$items) {
return false;
}
return [
'widget_id' => $this->id,
'show_avatars' => $show_avatars,
'show_date_groups' => $show_date_groups,
'items' => $items
];
}
private function getActivityEntries($offset, $limit) {
$activity = cmsCore::getController('activity');
$activity->model->orderBy('date_pub', 'desc');
$activity->model->filterPrivacy()->enableHiddenParentsFilter()->filterEqual('is_pub', 1);
cmsEventsManager::hook('activity_list_filter', $activity->model);
$items = $activity->model->limit($offset, $limit)->getEntries();
return $items? cmsEventsManager::hook('activity_before_list', $items): [];
}
private function getWallEntries($offset, $limit) {
$model = new cmsModel();
$entries = $model->filterEqual('controller', 'users')
->filterEqual('profile_type', 'user')
->orderBy('date_pub', 'desc')
->limit($offset, $limit)
->get('wall_entries');
if (!$entries) {
return [];
}
$user_ids = array_unique(array_column($entries, 'user_id'));
$users = $user_ids? array_column($model->filterIn('id', $user_ids)->get('users'), null, 'id'): [];
$formatted_items = [];
foreach ($entries as $entry) {
if (empty($users[$entry['user_id']])) continue;
$user = $users[$entry['user_id']];
$description = strip_tags($entry['content']);
$description = mb_strlen($description) > 100? mb_substr($description, 0, 100). '...': $description;
$formatted_items[] = [
'id' => $entry['id'],
'user_id' => $entry['user_id'],
'user' => [
'id' => $user['id'],
'nickname' => $user['nickname'],
'avatar' => $this->getAvatarUrl($user),
'slug' => $user['slug'],
'is_online' => !empty($user['is_online'])
],
'date_pub' => $entry['date_pub'],
'date_diff' => $this->getDateDiff($entry['date_pub']),
'description' => $description,
'subject_title' => $description,
'subject_url' => $this->getWallEntryUrl($entry),
'reply_url' => $this->getWallEntryUrl($entry). '?reply=1',
'is_private' => 0,
'images' => $this->getWallEntryImages($entry),
'images_count' => 0
];
}
return $formatted_items;
}
private function getProfileUrl($user) {
return href_to_profile([
'id' => $user['id'],
'slug' => $user['slug'],
'nickname' => $user['nickname']
]);
}
private function getWallEntryUrl($entry) {
return href_to('users', $entry['profile_id'], ['wall', $entry['id']]);
}
private function getAvatarUrl($user) {
return $user['avatar']? '/uploads/users/'. $user['id']. '/avatar/'. $user['avatar']: '/templates/default/images/avatar.png';
}
private function getDateDiff($date) {
$time = strtotime($date);
$now = time();
$diff = $now — $time;
if ($diff < 60) return $diff. ' сек. назад';
if ($diff < 3600) return floor($diff / 60). ' мин. назад';
if ($diff < 86400) return floor($diff / 3600). ' час. назад';
return lang_date($date, 'j F Y');
}
private function getWallEntryImages($entry) {
$images = [];
$content = $entry['content_html'] ?: $entry['content'];
if (preg_match_all('/<img[^>]+src="([^">]+)"/i', $content, $matches)) {
foreach ($matches[1] as $src) {
$clean_src = $this->getAbsoluteUrl($src);
$images[] = ['src' => $clean_src, 'url' => $clean_src, 'title' => ''];
}
}
return $images;
}
private function getAbsoluteUrl($url) {
if (strpos($url, 'http') === 0) return $url;
$base_url = 'https://'. $_SERVER['HTTP_HOST'];
return $base_url. (strpos($url, '/') === 0? $url: '/'. $url);
}
}
и options.form.php на
<?php
class formWidgetActivityListOptions extends cmsForm {
public function init() {
cmsCore::loadControllerLanguage('activity');
return [
[
'type' => 'fieldset',
'title' => LANG_OPTIONS,
'childs' => [
new fieldList('options:dataset', [
'title' => LANG_WD_ACTIVITY_LIST_DATASET,
'items' => [
'all' => LANG_ACTIVITY_DS_ALL,
'friends' => LANG_ACTIVITY_DS_FRIENDS,
'my' => LANG_ACTIVITY_DS_MY,
],
'visible' => "!options.only_wall"
]),
new fieldCheckbox('options:show_avatars', [
'title' => LANG_WD_ACTIVITY_LIST_SHOW_AVATARS
]),
new fieldCheckbox('options:date_group', [
'title' => LANG_WD_ACTIVITY_LIST_DATE_GROUP
]),
new fieldCheckbox('options:only_wall', [
'title' => 'Выводить только записи со стены',
'hint' => 'Если включено — будут показаны ТОЛЬКО записи, добавленные через стену пользователей',
'onchange' => "$('#dataset_field').toggle(!this.checked);"
]),
new fieldNumber('options:offset', [
'title' => LANG_LIST_OFFSET,
'hint' => LANG_LIST_OFFSET_HINT,
'default' => 0
]),
new fieldNumber('options:limit', [
'title' => LANG_LIST_LIMIT,
'default' => 10,
'rules' => [['required'], ['min', 1]]
])
]
]
];
}
}
хоть бы отписались по результатам, пол дня просидел с вашими хотелками
хоть бы отписались по результатам, пол дня просидел с вашими хотелками
Здравствуйте. Извините, пока не попробовал. Отпишусь обязательно)))
замените содержимое файла шаблона ленты активности list.php
Возникла проблема. Что это за файл? Что-то не могу его найти



по адресу system/controllers/activity/widgets/list/ заменить содержимое файла widget.php
С этим проблем, это нашел.
И подскажите, как это будет выглядеть? В определенную ленту контента посты будут идти?
перечитайте еще раз моё сообщение, там изменения касаются 3х файлов, подробно везде пошагово написано. Используется стандартный виджет ленты активности
хоть бы отписались по результатам, пол дня просидел с вашими хотелками
Отписываюсь. То ли у меня руки кривые, то ли в другом проблема, но у меня просто перестал открываться сайт