Новости Joomla

Свои типы полей в Joomla.

Свои типы полей в Joomla.Это большая тема, о которой можно говорить очень много

Это большая тема, о которой можно говорить очень много. Самое главное, что возможности применения ограничиваются только вашей больной фантазией. Вы строите интерфейс своего модуля или плагина и вам нужно подтянуть данные из сторонней системы (список чего-нибудь по какому-нибудь API), чтобы сохранить выбранный id в Joomla. Или сделать какую-то проверку и в зависимости от неё показать то или иное сообщение пользователю. Для этого подойдут свои пользовательские типы полей. Интерфейс Joomla по большей части описан в XML-файлах. У каждого из них свои параметры. Некоторые не описаны в документации (manual.joomla.org), поэтому самым любопытным будет полезно заглянуть в собственно файлы фреймворка по пути

libraries/src/Form/FormField.php, а так же в
libraries/src/Form/Fields. У каждого класса поля перечислены его специфические свойства, которые можно описывать в XML. А в своём типе поля вы можете устанавливать эти значения программно. В моём модуле WT Quick links под капотом происходят изменения. Теперь для работы (в админке) ему нужен вспомогательный плагин. А в самом модуле нам бы проверить, а не выключен ли он? В Joomla есть тип поля Note - заметка. Его можно использовать для вывода примечаний.

<field type="note" name="your_note_for_user" label="Заголовок примечания" title="Альтернативный способ для заголовка" description="Текст примечания" class="col-12 alert alert-info" heading="h1" close="true" />

heading - указывать уровень заголовка.
close - позволяет закрыть это примечание. В классе поля
libraries/src/Form/Field/NoteField.php описана логика вывода. И в принципе оно нам подходит для нашей задачи. Но оно будет выводить сообщение всегда, а нам нужно только тогда, когда плагин отключён. Поэтому берём и создаём свой класс поля, который мы унаследуем от
NoteField. Это значит, что у нас в руках будет весь инструментарий стандартного поля
Note + то, что мы сами добавим. В XML-манифест добавляем наше поле

<field type="systempluginstatus" name="systempluginstatus" addfieldprefix="Joomla\Module\Wtquicklinks\Site\Fields"/>

-

type - имя файла и класса,-
addfieldprefix - указываем namespace к нашему классу, может быть любой нам нужный-
name - нельзя полю без имени...Это означает, что Joomla будет использовать класс поля из файла
modules/mod_wt_quick_links/src/Fields/SystempluginstatusField.php.А в классе поля будет написано следующее:

<?php // namespace для атрибута addfieldprefix namespace Joomla\Module\Wtquicklinks\Site\Fields; // нельзя напрямую обращаться к этому файлу defined('_JEXEC') or die; // подключаем родительский класс для переопределения use Joomla\CMS\Form\Field\NoteField; use Joomla\CMS\Language\Text; use Joomla\CMS\Plugin\PluginHelper; // имя класса и имя файла точь-в-точь class SystempluginstatusField extends NoteField { protected $type = 'Systempluginstatus'; protected function getLabel() { // если плагин не включён if(PluginHelper::isEnabled('system','wtquicklinks')) { // меняем свойства родительского класса $this->class = 'alert alert-danger w-100'; $this->element['label'] = '⚠️ А-а-а-а!'; $this->element['description'] = 'Плагин не включён!!'; // и просто рендерим его с нашими свойствами return parent::getLabel(); } // А иначе всё хорошо, скрываем поле из виду. $this->parentclass = 'd-none'; return ''; } }

Просто и удобно. И людям приятно, что о них позаботились и рассказали почему что-то не работает. @webtolkru#joomla #php #webdev #разработка

0 Пользователей и 1 Гость просматривают эту тему.
  • 20 Ответов
  • 30741 Просмотров
*

jem777

  • Завсегдатай
  • 1666
  • 119 / 2
« Последнее редактирование: 18.10.2010, 05:10:57 от jem777 »
*

jem777

  • Завсегдатай
  • 1666
  • 119 / 2
Далее по отображению и интеграции... Мы будем выводить аватар юзера под приветствием. Он будет кликабельный и вести на профиль юзера. Если аватара нет, то выводим изображение по умолчанию.

В папке шаблона вашего сайта находим папку html (если нет, то создать). В этой папке создаем папку mod_login и копируем туда файл default.php из modules\mod_login\tmpl\default.php. Если такой файл уже есть, то работать прямо с ним. Это темплейт стандартного модуля входа Joomla.

Открываем файл default.php и идем на строку 11 находим:

Код
echo JText::sprintf( 'HINAME', $user->get('username') );

и после него вставляем:

Код
        <?php if($user->get('avatar')) {
  echo "<br /><br /><div><a href='";
  echo JURI::root();
  echo "index.php?option=com_user&view=user&task=edit'><img src='";
  echo $user->get('avatar');
  echo "' heigth=65 width=65/></a></div><br />";
  }
  else {
  echo "<br /><br /><div><a href='";
  echo JURI::root();
  echo "index.php?option=com_user&view=user&task=edit'><img src='images/no_avatar.png' heigth=65 width=65 /></a></div><br />";
  }
?>

Аватар должен отображаться под приветствием. Если он не загружен, отображается аватар по умолчанию. Клик по аватару ведет на страницу редактирования параметров юзера. Если у вас используется SEF, то можете вручную ввести ссылку на страницу юзера или вообще убрать ссылку.
« Последнее редактирование: 29.05.2010, 12:00:56 от jem777 »
*

jem777

  • Завсегдатай
  • 1666
  • 119 / 2
Далее по отображению и интеграции... делаем интеграцию с JComments

Ставим сам компонент, модуль отображения последних комментариев (если нужно) и главное плагин для отображения аватар.

После заходим в админку и:

Цитата: Цитата с сайта
В административной панели настроек компонента JComments выполните следующие действия:
На закладке «Общие» установите для параметра «Поддержка плагинов» значение «Да». Этот параметр отвечает за загрузку сторонних плагинов для компонента JComments, в том числе и плагина аватаров (если установлен).
На закладке «Права» нужным группам пользователей установите права на просмотр аватаров. Чтобы разрешить выбранной группе пользователей просматривать аватары необходимо установить галочку у параметра «Показывать Gravatar».
Сохранить настройки компонента.

Гостям и зарегистрированным юзерам сайта ставим разрешить просмотр аватаров.
Далее идем в папку плагинов и открываем plugins\jcomments\jcomments.avatar.php и plugins\jcomments\jcomments.avatar.xml

1. В файле jcomments.avatar.xml перед строкой:

Код
<option value="agora">Agora Forum</option>

вставляем:
 
Код
<option value="com_user">Com_User</option>

2. В файле jcomments.avatar.php после строки 358 вставляем:

Код
case 'com_user':
        if (count($users)) {
        $db->setQuery('SELECT id, avatar FROM #__users WHERE id in (' . implode(',', $users)  . ')');
        $avatars = $db->loadObjectList('id');
unset($users);
} else {
$avatars = array();
}

for ($i=0,$n=count($comments); $i < $n; $i++) {
$userid = (int) $comments[$i]->userid;

// profile link
$comments[$i]->profileLink = $userid ? JRoute::_('index.php?option=com_user&view=user&task=edit' . $userid) : '';

// avatar
        if (isset($avatars[$userid]) && $avatars[$userid]->avatar != '') {
$comments[$i]->avatar = plgJCommentsAvatarImg($mainframe->getCfg('live_site'). '/'. $avatars[$userid]->avatar);
} else {
$comments[$i]->avatar = '';
        }
}
unset($avatars);
break;

Все. Сразу идем в админку и в параметрах плагина JComments - Avatar Источник аватаров указываем на Com_User. В поле No Avatar выбираем Custom image и в Custom NoAvatar image вставляем ссылку на наш аватар по умолчанию - images/no_avatar.png
Если получилось, то в комментариях должны отображаться аватары юзеров.

Далее если поставили модуль вывода последних комментариев, то в админке в параметрах модуля JComments Latest найти Поддержка плагинов - Да и Показывать аватары - Да. Размер указываем там же. Все.
« Последнее редактирование: 29.05.2010, 12:15:49 от jem777 »
*

viroff

  • Осваиваюсь на форуме
  • 42
  • 0 / 0
  • потому что не все йогурты одинаково полезны...
респект. Штуку вы выложили интересную, мне хоть и не это непосредственно необходимо, но на умные мысли навело! за это +1.
щас копаю как раз загрузку файла.
« Последнее редактирование: 12.03.2010, 18:42:49 от viroff »
*

jem777

  • Завсегдатай
  • 1666
  • 119 / 2
С загрузкой файла надо бы поосторожнее. Я в принципе сам не очень уверен в безопасности вышеприведенного кода. Чревато, знаете ли. ;)
Просто хотелось бы, для уверенности, чтобы более опытные товарищи указали или проверили на ошибки, если они есть.  ::)

ps: аватар ярый ;D
*

viroff

  • Осваиваюсь на форуме
  • 42
  • 0 / 0
  • потому что не все йогурты одинаково полезны...
http://docs.joomla.org/Creating_a_file_uploader_in_your_component - вот тут можно посмотреть (но там про аплоад немного)
*

jem777

  • Завсегдатай
  • 1666
  • 119 / 2
Спасибо, любопытно.
*

jem777

  • Завсегдатай
  • 1666
  • 119 / 2
На здоровье! Отпишитесь как получится? Будет интересно посмотреть. ;)
*

jem777

  • Завсегдатай
  • 1666
  • 119 / 2
Кстати, если хочется загружать анимированные GIF без изменений, то в  function save() надо просто закомментировать эти строки:

Код
else if ($size_img[2]==1) $src_img = imagecreatefromgif($avatar);

Код
else if ($size_img[2]==1) imagegif($dest_img, $avatar); 


В комментариях отображение будет анимированным.
*

MMONSTERR

  • Захожу иногда
  • 59
  • 3 / 0
Очень легко решить проблемму с перезаписью аватара и удалением записи.
1. Надо сохранять в постоянное имя id_avatar.jpg
2. И также удалять (но с удалением еще подумать  ^-^ )
*

MMONSTERR

  • Захожу иногда
  • 59
  • 3 / 0
Можно я проматерюсь!

Но у вас в начале функция где загрузка файла, загрузка и обработка файла норм ... но вот запись в бд там полная Ж***

вот как примерно должно быть

Код
//Update user avatar
$id = $_POST["id"];
    if(!empty($_FILES["avatar"]))
{
[b]$db = JFactory::getDBO();[/b]
$query = "UPDATE #__users SET avatar = '62_avatar.jpg' WHERE id = $id";
echo $query;
$db->setQuery( $query );
[b]$db->query();[/b]
$rows = $db->loadObjectList();
$avatar = $rows[0]->avatar;

}
*

jem777

  • Завсегдатай
  • 1666
  • 119 / 2
С удалением записи в БД и его обновлением проблем у меня не было. Проблема была с самим файлом, который при определенных условиях (указано выше) не удаляется с диска. Просто я там не совсем смог реализовать корректно обработку формы. Ну это вообще как пример. Можете переделывать под себя как угодно. Если захотите поделиться с людьми своим решением - будет совсем хорошо.  8)
*

imcool

  • Новичок
  • 7
  • 0 / 0
как я понял из кода юзер присоединяет файл и после сохраняет.. то есть  без привью?! я прав?! а если я прав как сделать привью?! подмагните советом! аяксом не хочетсо, так как совсем не знаю...
*

jem777

  • Завсегдатай
  • 1666
  • 119 / 2
Как раз с превью. Он делает аватар по заданному размеру. GIF оставил без изменения для анимированных аватаров. Можно расскомментировать в исходнике и аватары будут обработаны и уменьшены, но анимации не будет.
*

lexx74

  • Захожу иногда
  • 158
  • 1 / 0
На локалке все работало замечательно, перенес на сервак и при загрузки любого файла формата JPG JPEG PNG пишет

Извините, но разрешена загрузка файлов только jpeg, GIF и PNG.

файлы 80*80 права на папку images/avatars 777

может еще какая нить папка нужна для записи или чтото еще?

Повторюсь на локале все прекрасно грузилось
*

jem777

  • Завсегдатай
  • 1666
  • 119 / 2
По первому вопросу это значит, что код вставляется после:
Код
<?php if($this->user->get('password')) : ?>
<tr>
<td>
<label for="password">
<?php echo JText::_( 'Password' ); ?>:
</label>
</td>
<td>
<input class="inputbox validate-password" type="password" id="password" name="password" value="" size="40" />
</td>
</tr>
<tr>
<td>
<label for="password2">
<?php echo JText::_( 'Verify Password' ); ?>:
</label>
</td>
<td>
<input class="inputbox validate-passverify" type="password" id="password2" name="password2" size="40" />
</td>
</tr>
<?php endif; ?>

По второму вопросу: используйте специализированные редакторы, которые умеют показывать номера строк. Например Notepad++. Запустив его, сразу увидите слева номера строк, по которым очень легко отыскать нужный участок кода.
*

mariczzz

  • Новичок
  • 2
  • 0 / 0
Небольшое добавление: иногда залитые на сервак аватары имеют права доступа что-то типа 0600 (то бишь файл физически присутствует, но посмотреть его в браузере низзя). Решается это вставкой команды:

Код
chmod ($avatar, 0644);

сразу после команды

Код
move_uploaded_file($file,$avatar);

в файле components\com_user\controller.php

А вообще автор молодец!
*

mariczzz

  • Новичок
  • 2
  • 0 / 0
Еще мои юзвери баг нашли - аватарки PNG отображаются криво (прозрачные пиксели становятся черными). Закоментировал вызов
Код
resizeimg($avatar, $width, $height);

в файле components\com_user\controller.php - все стало норм
ЗЫ. Не стал разбираться, но чисто из любопытства - а накой нужно изменять размеры аватарки?
*

LigthScribe

  • Новичок
  • 1
  • 0 / 0
Хочется еще добавить что в файле \com_user\views\user\tmpl\form.php
все обращения нужно escape.

вместо

 <?php if($this->user->get('avatar')) : ?>

нужно

 <?php if($this->escape($this->user->get('avatar'))) : ?>

Без escape опасно как-то получается
*

goga_pgasovav

  • Захожу иногда
  • 444
  • 6 / 0
  • Внимательный джумловод
Очень прошу помочь с решением проблемы!
Когда загружаешь с фронтенда аватар четко подогнанного размера (к примеру 80х80) прозрачное PNG изображение, то прозрачность заменяется на черный цвет.
Если увеличить значения $width = 80; и $height = 80; (в файле controller.php) хотябы на еденицу (т.е. 81 и 81 соответственно), то баг не проявляется.
Баг так же не проявляется если загружать прозрачную PNG большего или меньшего, нежели 80х80, размера!

P.S.: с прозрачными GIF-изображениями такого не наблюдается...

UPD!
Решение нашлось само собой  ^-^
Примерно в строке 157 (после «// Если размеры меньше, то масштабирования не нужно»)
необходимо заменить «<» на «<=»  следующим образом:

Было:
Код
if (($width_src<$width) && ($height_src<$height))

Стало:
Код
if (($width_src<=$width) && ($height_src<=$height))

и все будет в шоколаде ;)
« Последнее редактирование: 26.01.2012, 03:58:56 от goga_pgasovav »
*

igorpank

  • Новичок
  • 9
  • 0 / 0
Еще от себя добавлю) В файле controller.php, заменить строку
Код
echo 'Извините, но разрешена загрузка файлов только JPEG, GIF и PNG.';
exit;
на
Код
$msg = JText::_('Извините, но разрешена загрузка файлов только JPEG, GIF и PNG.');
$return = @$_SERVER['HTTP_REFERER'];
if (empty($return) || !JURI::isInternal($return)) {
$return = JURI::base();
}
$this->setRedirect($return, $msg, 'error');
return false;
}

и
Код
if ($file_size > 100*1024) die('Извините, объем файла не должен превышать 100 KB. Измените фото и попробуйте еще раз.');
на
Код
if ($file_size > 100*1024) {
$msg = JText::_('Извините, объем файла не должен превышать 100 KB. Измените фото и попробуйте еще раз.');
$return = @$_SERVER['HTTP_REFERER'];
if (empty($return) || !JURI::isInternal($return)) {
          $return = JURI::base();
                        }
$this->setRedirect($return, $msg, 'error');
                     return false;
}

тогда сообщение об ошибке будет виводится на страницу, а не делать редирект
в шаблоне должна бить выведена позиция

Код: php
<jdoc:include type="message" />
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Как и чем можно обращаться с запросами из Joomla к GraphQL?

Автор bmf1982

Ответов: 0
Просмотров: 851
Последний ответ 03.10.2019, 15:46:00
от bmf1982
Joomla как система авторизации

Автор kav

Ответов: 23
Просмотров: 2587
Последний ответ 29.04.2018, 11:10:30
от Aleks.Denezh
Нужна помощь в доработке модуля под Joomla 3

Автор kik84

Ответов: 5
Просмотров: 2579
Последний ответ 30.01.2018, 22:40:30
от Елeна
SP Features добавление дополнительного блока

Автор 12mv

Ответов: 5
Просмотров: 2836
Последний ответ 15.11.2015, 14:22:57
от Филипп Сорокин
Как отучить Joomla стартовать session для гостей?

Автор commeta

Ответов: 8
Просмотров: 3308
Последний ответ 20.08.2015, 14:06:38
от acyp