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

ЕСТЬ РЕШЕНИЕ ЗАКРЫТО InstantCMS 2.X
#1 1 февраля 2023 в 19:32

Всем привет! 

На сегодняшний день в настройках приватности при создании ТК Посты и Статьи существует лишь две опции: Показывать всем/Показывать только друзьям.

Изображение

Если пост создается в Группе, то добавляются еще две: Показывать только одногруппникам/Показывать только одногруппникам, имеющим право добавления постов. 

Пользователи сайта, которые пишут посты, просят добавить еще одну опцию — «Показывать только зарегистрированным». Или «Не показывать гостям», что, в принципе, одно и то же. Нужна именно возможность выбора этой опции приватности для определенных постов (статей). Поиск по сайту результатов не дал. Возможно ли реализовать?

Время выполнения открытое (в пределах разумного). Оплату гарантирую. Проверяю работоспособность кода на локальном тестовом сайте. 

#2 2 февраля 2023 в 05:01

Наборы + поле (чекбокс) чем не устраивает?

И я бы пошёл другим путём. Создал три поля, первые два показывал только гостям, поле краткого(обрезанного) содержания поста и сквозного поля ниже первого с текстом «Полный текст видят только зарегистрированные пользователи». Третье поля показывать только зарегистрированным, это поле полного содержания поста.

В вашем варианте, если все блогеры скроют свои посты от гостей, то гостям вы покажете пустой раздел, в моём варианте вы мотивируете посетителя зарегистрироваться, если будут затягивающее краткое содержание.

#3 2 февраля 2023 в 06:44

Наборы + поле (чекбокс) чем не устраивает?

lakomet

Есть куча мест с ссылками ведущими напрямую на статью (активность, профиль, поиск, возможно виджеты), наборы доступ в нее не закроют.

#4 2 февраля 2023 в 08:29

И я бы пошёл другим путём. Создал три поля, первые два показывал только гостям, поле краткого(обрезанного) содержания поста и сквозного поля ниже первого с текстом «Полный текст видят только зарегистрированные пользователи». Третье поля показывать только зарегистрированным, это поле полного содержания поста.… в моём варианте вы мотивируете посетителя зарегистрироваться, если будут затягивающее краткое содержание.

lakomet

Согласен, анонс (в нашем случае — обрезка текста) поста, видимый в лентах и списках, целесообразен, мотивировать посетителей надо. ) 

#5 2 февраля 2023 в 09:05

Согласен, анонс (в нашем случае — обрезка текста) поста, видимый в лентах и списках, целесообразен, мотивировать посетителей надо. ) 

Викторыч

В этом случае всё проще. Добавьте поле флаг (чекбокс) «Показывать только зарегистрированным». Можно подписать, что анонс все равно будет виден всем. И в шаблоне записи (default_item.tpl.php или какой там у вас файл) остается добавить маленькое условие. Вот, например, в файле default_item.tpl.php в шаблоне Модерн.

Найдите

  1. <?php foreach ($fieldset['fields'] as $field) { ?>

И после этой строчка вставьте:

  1. <?php if($field['name'] == 'content' && empty($item['only_users'])) { continue; } ?>
  • content — это системное имя поля, которое надо скрыть от гостей
  • only_users — это системное имя нового чекбокса

Всё, автору только останется сделать выбор, отмечать чекбокс при добавлении записи или нет.

#6 2 февраля 2023 в 13:33

Нифигаccе о-го-гошеньки, спасибо за отклик!
Ваше решение работает — в принципе. ) Получилось так: 

Изображение
— чекбокс работает наоборот, т.е. изначально отключает просмотр текста поста во всех постах сайта. Если в новых постах пользователь будет включать просмотр, то в ранее опубликованных (более 1600 постов!) просмотр надо включать вручную.
— если применить в текущем варианте, посты сайта с отключенным чекбоксом недоступны для просмотра всем — и зарегистрированным, и гостям, и админу. Где копать в настройках доступа, пока не понял (не нашел), предполагаю, что этого просто нет.
— нет предупреждения типа «Этот пост доступен для просмотра только зарегистрированным на сайте!» 
— комментарии к скрытому посту остаются доступными для просмотра. Это неприемлемо, так же как и картинки скрытого поста, которые тоже остаются видимыми. В итоге данное решение применить, увы, не могу.

Уточнение: видна только «картинка для привлечения внимания». Контент поста не виден полностью.

#7 2 февраля 2023 в 13:55

чекбокс работает наоборот, т.е. изначально отключает просмотр текста поста во всех постах сайта. Если в новых постах пользователь будет включать просмотр, то в ранее опубликованных (более 1600 постов!) просмотр надо включать вручную

Викторыч

Если чекбокс для отключения поля, то код такой:

  1. <?php if($field['name'] == 'content' && !empty($item['only_users']) && !cmsUser::getInstance()->is_logged) { continue; } ?>

Если для включения, то код такой:

  1. <?php if($field['name'] == 'content' && empty($item['only_users']) && !cmsUser::getInstance()->is_logged) { continue; } ?>

Отметить чекбоксы во всех записях сразу можно через phpMyAdmin. Во вкладке SQL выполните запрос:

  1. UPDATE `cms_con_ctype` SET `field`= 1

Где ctype — имя типа контента, field — имя поля.

если применить в текущем варианте, посты сайта с отключенным чекбоксом недоступны для просмотра всем — и зарегистрированным, и гостям, и админу

Викторыч

Да, ошибочка вышла)) Скрыли от всех, получается. В этом сообщении чуть выше исправленные варианты.

нет предупреждения типа «Этот пост доступен для просмотра только зарегистрированным на сайте!» 
— комментарии к скрытому посту остаются доступными для просмотра. Это неприемлемо, так же как и картинки скрытого поста, которые тоже остаются видимыми. В итоге данное решение применить, увы, не могу.

Уточнение: видна только «картинка для привлечения внимания». Контент поста не виден полностью.

Викторыч

Вообще-то да, так просто не выкрутитесь одним чекбоксом.

Скрыть комментарии можно в другом файле — templates/шаблон/controllers/content/item_view.tpl.php. В самом низу:

  1. <?php if (!empty($item['comments_widget'])){ ?>
  2. <?php echo $item['comments_widget']; ?>
  3. <?php } ?>

Заменить на 

  1. <?php $no_comments = empty($item['field']) && !cmsUser::getInstance()->is_logged;
  2. if (!empty($item['comments_widget']) && !$no_comments){ ?>
  3. <?php echo $item['comments_widget']; ?>
  4. <?php } ?>

Где field — имя чекбокса. Можно спрятать не только поле с подробным описанием, а любые другие. Продублируйте строки, в которых скрываем поле, но вместо content вставьте другие имена полей.

А вот саму строку, скрывающую поле content, удалите. Сейчас сделаем по-другому.

Найдите в default_item.tpl.php строку 

  1. <div class="value"><?php echo $field['html']; ?></div>

И замените на это:

  1. <?php if($field['name'] == 'content' && empty($item['only_users']) && !cmsUser::getInstance()->is_logged) { ?>
  2. <div class="value"><?php html(string_short($item['content'], 150, '<p style="font-weight:bold;">Полный текст доступен только зарегистрированным пользователям. <a href="/auth/login" class="ajax-modal">Войдите</a> или <a href="/auth/register" target="_balnk">зарегистрируйтесь</a>, если хотите почитать еще.</p>', 's')); ?>
  3. <?php } else { ?></div>
  4. <div class="value"><?php echo $field['html']; ?></div>
  5. <?php } ?>

Где, 150 — количество символов для обрезки, s — обрезка по последнему предложению. Можно по последнему слову — тогда напишите w

#8 2 февраля 2023 в 15:10

Сейчас все работает как должно! За исключением: 

Изображение

Что-то здесь не так, понимаю (но не понимаю)… *и так ничего не знал, да еще и забыл, что знал.

#9 2 февраля 2023 в 15:22

Наверное нельзя теги туда добавлять. Вот так сделайте:

  1. <?php if($field['name'] == 'content' && empty($item['only_users']) && !cmsUser::getInstance()->is_logged) { ?>
  2. <div class="value"><?php html(string_short($item['content'], 150, '', 's')); ?><p style="font-weight:bold;">Полный текст доступен только зарегистрированным пользователям. <a href="/auth/login" class="ajax-modal">Войдите</a> или <a href="/auth/register" target="_balnk">зарегистрируйтесь</a>, если хотите почитать еще.</p></div>
  3. <?php } else { ?>
  4. <div class="value"><?php echo $field['html']; ?></div>
  5. <?php } ?>
#10 2 февраля 2023 в 17:29

Теперь все в порядке! Благодарю! )

p.s. На рабочем сайте проверил… вскрылись непонятки со скрытием комментариев (при скрытии одного поста комментарии исчезают во всех). Убрал пока, но без скрытия комментариев плохо… Ну и, нелишним будет добавить, что в ленте комментариев все комменты скрытого поста прекрасно видно, тоже не торт.

#11 2 февраля 2023 в 19:08

при скрытии одного поста комментарии исчезают во всех

Викторыч

Если чекбоксом включается просмотр, а не отключается, то тогда добавьте восклицательный знак перед empty в первой строчке:

  1. <?php $no_comments = !empty($item['field']) && !cmsUser::getInstance()->is_logged;
  2. if (!empty($item['comments_widget']) && !$no_comments){ ?>
  3. <?php echo $item['comments_widget']; ?>
  4. <?php } ?>
#12 2 февраля 2023 в 19:14

Нет, чекбоксом отключается просмотр.

#13 2 февраля 2023 в 20:07
  1. <?php $no_comments = !empty($item['only_users']) && !cmsUser::getInstance()->is_logged;
  2. if (!empty($item['comments_widget']) && !$no_comments){ ?>
  3. <?php echo $item['comments_widget']; ?>
  4. <?php } ?>
#14 2 февраля 2023 в 20:42
  1. <?php $no_comments = !empty($item['only_users']) && !cmsUser::getInstance()->is_logged;
  2. if (!empty($item['comments_widget']) && !$no_comments){ ?>
  3. <?php echo $item['comments_widget']; ?>
  4. <?php } ?>
Нифигаccе о-го-гошеньки

Заработало! ) Еще раз спасибо!

Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.