Поле "Мои социальные сети"

+12
247

Поле, которое просили на форуме. В рамках изучения системы написал строго по ТЗ. Позволяет выводить ссылки на социальные сети. ОБласть применения — различная, но больше наверное подойдет для профилей пользователей, хотя можно использовать и в группах, и в типах контента. 

Настройки — минимальны. Позволяют выбрать, какие соцсети будут доступны в поле, а также можно задать заголовок:

Изображение

В типе контента поле выглядит так:

Изображение

В самой записи выглядит так:

Изображение

Иконки берутся из системного набора иконок brands.svg, но если это кого-то не устроит — могу переписать механизм выбора соцсетей. Поле бесплатное и писалось больше для знакомства с системой, нежели для какого-то отклика сообщества.

+2
Fuze Fuze 2 дня назад #

Неплохое начинание. Понимаю, что писалось быстро, но всё же позволю себе прокомментировать.

Преобразования json_decode я бы вынес в отдельный метод, вы дублируете механизм всё время.

Вместо

  1. $this->addCSS('templates/default/css/socials.css');

Лучше использовать

  1. $this->addTplCSSName('socials');
  2. // Если подключаете в классе поля
  3. cmsTemplate::getInstance()->addTplCSSName('socials');

Поскольку так вы подключите независимо от шаблона.

Иконки лучше подключать так:

  1. <?php html_svg_icon('brands', $social['icon']); ?>

Что так же подключит их независимо, учитывая наследование в шаблонах. И в целом, будет учитываться возможность того, что CMS установлена в поддиректории.

  1. protected $use_language = true;

Вы не используете языковые фразы, это лишнее.

  1. // Вместо этого
  2. htmlspecialchars($url, ENT_QUOTES);
  3. // Используйте это
  4. html($url, false);

Методы storeCachedValue и hookAfterAdd в поле лишние, вы не используете денормализацию. Это же касается и метода applyFilter:

  1. public function applyFilter($model, $value) {
  2. if (!$value) { return $model; }
  3. return $model->filterLike($this->name, "%{$value}%");
  4. }

Не критики ради и без негатива, исключительно пояснения, чтобы вы быстрее разобрались с InstantCMS.

+1
Печора Печора 2 дня назад #

Благодарю за пояснения, обязательно это учту в будущем.

Преобразования json_decode я бы вынес в отдельный метод

Да, это тоже разумно. Буду тренироваться на новом функционале поля, буду признателен за пояснения к коду

+1
Fuze Fuze 2 дня назад #

буду признателен за пояснения к коду

Без проблем :) Вот ещё на скорую руку.

  1. new fieldList('networks', array(
  2. 'title' => 'Доступные социальные сети',
  3. 'is_multiple' => true,
  4. 'default' => implode(',', array_keys($this->network_titles)),
  5. 'items' => $this->network_titles,
  6. 'hint' => 'Разрешенные социальные сети появятся в опциях поля'
  7. ))

Зачем в default вы ставите строку через implode, так и оставили бы массив array_keys($this->network_titles), вы же указали is_multiple.

  1. $allowed_networks = (array)$this->getOption('networks', array_keys($this->network_titles));
  2. // Никогда не сработает, вы выше приводите к массиву
  3. if(is_string($allowed_networks)) {
  4. $allowed_networks = explode(',', $allowed_networks);
  5. }
  1. public function validate_value($value) {
  2.  
  3. if (empty($value)) {
  4. return true;
  5. }
  6.  
  7. if (!is_array($value)) {
  8. return ERR_VALIDATE_INVALID;
  9. }
  10.  
  11. $allowed_networks = $this->getOption('networks', array_keys($this->network_titles));
  12.  
  13. if (count($value) > count($allowed_networks)) {
  14. return ERR_VALIDATE_INVALID;
  15. }
  16.  
  17. foreach ($value as $item) {
  18.  
  19. // Все поля обязательные?
  20. foreach (['url', 'icon', 'text'] as $field_name) {
  21. if (empty($item[$field_name]) || !is_string($item[$field_name])) {
  22. return ERR_VALIDATE_INVALID;
  23. }
  24. }
  25.  
  26. if (!in_array($item['icon'], $allowed_networks)) {
  27. return ERR_VALIDATE_INVALID;
  28. }
  29.  
  30. if (mb_strlen($item['url']) > 255) {
  31. return ERR_VALIDATE_INVALID;
  32. }
  33.  
  34. if (!preg_match('/^(?:https?:\/\/)?(?:[\w\-]+\.)+[a-z]{2,}(?:\/.*)?$/i', $item['url'])) {
  35. return ERR_VALIDATE_INVALID;
  36. }
  37.  
  38. // буквы, цифры, пробел
  39. if (!preg_match('/^[\p{L}0-9 ]+$/ui', $item['text'])) {
  40. return ERR_VALIDATE_INVALID;
  41. }
  42. }
  43.  
  44. return true;
  45. }
0
Александр Александр 2 дня назад #

спасибо, а для профиля пользователя использовать можно?

0
Shuma Shuma 16 часов назад #

Можно

0
Shuma Shuma 16 часов назад #

Было бы хорошо, если бы при заполнении поля ссылка можно было вводить логин/никнейм, а не полностью ссылка

0
Печора Печора 14 часов назад #

Да, уже обсуждали это на форуме. Добавлю такую возможность.

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