Новости Joomla

Новый способ добавления и рендера полей в Joomla Form - метод renderControlFields() (Joomla 5.3+)

Новый способ добавления и рендера полей в Joomla Form - метод renderControlFields() (Joomla 5.3+)

Новый способ добавления и рендера полей в Joomla Form - метод renderControlFields() (Joomla 5.3+). При отображении форм компонента в админке раньше разработчикам нужно было описывать скрытые поля в лейаутах. И выглядело это так:

<?php     // Это файл в /layouts/components/com_component/your_layout.php?><input type="hidden" name="task" value=""><input type="hidden" name="return" value="<?php echo $input->getBase64('return'); ?>"><input type="hidden" name="forcedLanguage" value="<?php echo $input->get('forcedLanguage', '', 'cmd'); ?>"><?php echo HTMLHelper::_('form.token'); ?>
Начиная с Joomla 5.3 добавлен новый способ добавления таких полей (их называют control fields) - программно. И теперь это можно сделать просто в Controller / View.
// В Controller/View добавляем поля$this->form  ->addControlField('task', '')  ->addControlField('return', $input->getBase64('return', ''))  ->addControlField('forcedLanguage', $forcedLanguage);
А в layout'е просто используем метод
renderControlFields()
// В layout формыecho $this->form->renderControlFields();
Многие компоненты ядра уже используют этот подход. Соответствующий PR был принят в Joomla 5.3 осенью 2024г.Смотреть
Pull Request@joomlafeed#joomla #разработка #php

JoomGallery 4.1.0 - компонент галереи изображений для Joomla

JoomGallery 4.1.0 - компонент галереи изображений для Joomla

Новая итерация компонента продолжает развиваться, ведь с v.4.x компонент был переписан практически с нуля.

v.4.1.0. Что нового?

Редактирование метаданных изображений. Теперь метаданные можно не только читать, но и напрямую редактировать и записывать обратно в изображение JPG. Поддерживаются данные EXIF ​​и IPTC.

Полная совместимость с Joomla! 4.x, 5.x и 6.x. Компонент почистили от устаревших методов в коде.

Заметно ускорили загрузку больших галерей. Списки в админке, особенно для очень больших галерей ( >30 000 изображений), теперь загружаются значительно быстрее.

Несколько сеток lightGallery на одной странице. Будь то плагины контента или модули изображений: теперь вы можете отображать несколько галерей или категорий на одной странице без каких-либо ограничений.

Множество мелких исправлений ошибок и оптимизаций.

Сайт проекта

GitHub расширения

Скачать

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

4ort

  • Захожу иногда
  • 82
  • 0 / 0
« Последнее редактирование: 23.11.2011, 09:14:51 от 4ort »
*

SDKiller

  • Moderator
  • 2706
  • 329 / 5
  • ...ergo sum
Самое простое - добавить условие в шаблон.

Например для шаблона item.php :

найдите строчку

Код
<?php if($this->item->params->get('itemRating')): ?>

приведите к следующему виду

Код

<?php if($this->item->params->get('itemRating')  && !$this->user->guest): ?>
*

4ort

  • Захожу иногда
  • 82
  • 0 / 0
SDKiller, спасибо, что откликнулся, но если сделать так - звезды просто скрываются от незарегистрированных пользователей, а нужно что-бы они не могли менять рейтинг, но видели его.
*

SDKiller

  • Moderator
  • 2706
  • 329 / 5
  • ...ergo sum
Тогда есть варианты:

1. В том же шаблоне в блоке рейтинга для каждой звезды заменить

Код
rel="<?php echo $this->item->id; ?>"

на

Код
rel="<?php echo (!$this->user->guest)? $this->item->id : ''; ?>"

Тогда на клики незарегистрированных пользователей по звёздочке не будет никакой реакции

(Поэтому имеет смысл в шаблоне по аналогичному условию для гостей воткнуть постоянное сообщения типа
"Голосовать могут только зарегистрированные пользователи"  -например ниже или сбоку).



2. Вносить изменения в модель item - функция vote()
Тогда можно будет не трогать шаблон а проверку пользователя и формирования соответствующего сообщения для аякса сделать в модели.
« Последнее редактирование: 22.11.2011, 17:16:18 от SDKiller »
*

4ort

  • Захожу иногда
  • 82
  • 0 / 0
SDKiller, огромное спасибо! :)
Первый вариант - действительно не хватало комментария.
Но зато получилось модифицировать функцию vote() как мне нужно (в php ничего не понимаю, поэтому сделал, возможно, кривовато)

Было:
Код: php
function vote(){

$mainframe = &JFactory::getApplication();
JTable::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR.DS.'tables' );

//Get item
$item = & JTable::getInstance('K2Item', 'Table');
$item->load(JRequest::getInt('itemID'));

//Get category
$category = & JTable::getInstance('K2Category', 'Table');
$category->load($item->catid);

//Access check
$user = JFactory::getUser();
if ($item->access > $user->get('aid', 0) || $category->access > $user->get('aid', 0)) {
JError::raiseError( 403, JText::_("ALERTNOTAUTH") );
}

//Published check
if (!$item->published || $item->trash ) {
JError::raiseError( 404, JText::_("Item not found") );
}
if (!$category->published || $category->trash) {
JError::raiseError( 404, JText::_("Item not found") );
}


$rate = JRequest::getVar('user_rating', 0, '', 'int');

if ( $rate >= 1 && $rate <= 5) {
$db = & JFactory::getDBO();
$userIP =  $_SERVER['REMOTE_ADDR'];
$query = "SELECT * FROM #__k2_rating WHERE itemID =".(int)$item->id;
$db->setQuery($query);
$rating = $db->loadObject();

if (!$rating) {
$query = "INSERT INTO #__k2_rating ( itemID, lastip, rating_sum, rating_count ) VALUES ( ".(int)$item->id.", ".$db->Quote($userIP).", {$rate}, 1 )";
$db->setQuery($query);
$db->query();
echo JText::_('Thanks for rating!');

}

else {
if ($userIP != ($rating->lastip)) {
$query = "UPDATE #__k2_rating".
" SET rating_count = rating_count + 1, rating_sum = rating_sum + {$rate}, lastip = ".$db->Quote($userIP).
" WHERE itemID = {$item->id}";
$db->setQuery($query);
$db->query();
echo JText::_('Thanks for rating!');

}
else {
echo JText::_('You have already rated this item.');
}
}

}
$mainframe->close();
}

После изменения стало:
Код: php
     function vote(){

$mainframe = &JFactory::getApplication();
$user = JFactory::getUser();
if (!$user->guest){
JTable::addIncludePath(JPATH_COMPONENT_ADMINISTRATOR.DS.'tables' );

//Get item
$item = & JTable::getInstance('K2Item', 'Table');
$item->load(JRequest::getInt('itemID'));

//Get category
$category = & JTable::getInstance('K2Category', 'Table');
$category->load($item->catid);

//Access check
//$user = JFactory::getUser();
if ($item->access > $user->get('aid', 0) || $category->access > $user->get('aid', 0)) {
JError::raiseError( 403, JText::_("ALERTNOTAUTH") );
}

//Published check
if (!$item->published || $item->trash ) {
JError::raiseError( 404, JText::_("Item not found") );
}
if (!$category->published || $category->trash) {
JError::raiseError( 404, JText::_("Item not found") );
}


$rate = JRequest::getVar('user_rating', 0, '', 'int');

if ( $rate >= 1 && $rate <= 5) {
$db = & JFactory::getDBO();
$userIP =  $_SERVER['REMOTE_ADDR'];
$query = "SELECT * FROM #__k2_rating WHERE itemID =".(int)$item->id;
$db->setQuery($query);
$rating = $db->loadObject();

if (!$rating) {
$query = "INSERT INTO #__k2_rating ( itemID, lastip, rating_sum, rating_count ) VALUES ( ".(int)$item->id.", ".$db->Quote($userIP).", {$rate}, 1 )";
$db->setQuery($query);
$db->query();
echo JText::_('Thanks for rating!');

}

else {
if ($userIP != ($rating->lastip)) {
$query = "UPDATE #__k2_rating".
" SET rating_count = rating_count + 1, rating_sum = rating_sum + {$rate}, lastip = ".$db->Quote($userIP).
" WHERE itemID = {$item->id}";
$db->setQuery($query);
$db->query();
echo JText::_('Thanks for rating!');

}
else {
echo JText::_('You have already rated this item.');
}
}

}
}
else {
echo JText::_('Войдите, или зарегистрируйтесь, что-бы оценить.');
}
$mainframe->close();
    }
*

SDKiller

  • Moderator
  • 2706
  • 329 / 5
  • ...ergo sum
Да нормально.
Только было бы правильнее дополнить языковой файл, а не писать кириллицей в модели.
*

xxxLuffy

  • Осваиваюсь на форуме
  • 16
  • 0 / 0
Заменил функцию vote как написано выше и не чего не изменилось, гостем клацая на звёздочки просто не реагирует и не каких сообщений типа "Войдите, или зарегистрируйтесь, что-бы оценить." не выводит ...

_

Все дошло, что при варианте что оно не будет реагировать оно таки не реагирует и надо вернуть изначальный вариант чтобы оно реагировало на не зареганых)
теперь проблема с кракозябрами вместо нужного сообщения - "Войдите, или зарегистрируйтесь, что-бы оценить." но это я думаю уже исправить сам смогу)
« Последнее редактирование: 08.01.2012, 19:36:21 от xxxLuffy »
*

_ib_

  • Давно я тут
  • 673
  • 100 / 8
вывод сообщения о регистрации:
echo JText::_('JGLOBAL_YOU_MUST_LOGIN_FIRST');
Легальные шаблоны и дёшево!  + скидки до 50% для шаблонов клуба Joomlart, RocketTheme, Yootheme и Gavick.

при интересе пишите в личку или на мыло: "p" точка "d" собака gmx.de
*

name

  • Захожу иногда
  • 123
  • 1 / 0
По методу из 4 поста у меня просто выдается сообщение для не авторизованных пользователей, но для авторизованных стрелка просто по кругу вертится бесконечно
*

googlonator

  • Осваиваюсь на форуме
  • 24
  • 1 / 0
Не могу найти вообще таких строк у себя. Первую нашел, а вот где эту функцию vote взять не знаю. В item.php нету

Нашел. Я искал в папке шаблона /com_k2/template/default , а надо было в папке models/item.php =)

Нашел ошибку.( Теперь зарегистрированные пользователи не могут голосовать( Бесконечно крутиться загрузка.

Может кто знает как исправить?
« Последнее редактирование: 17.05.2015, 13:31:59 от googlonator »
*

googlonator

  • Осваиваюсь на форуме
  • 24
  • 1 / 0
Всё. Разобрался. В сообщении от 4ort где приведен готовый пример, что то приводит к ошибке. Не копируйте! Просто допишите самостоятельно строки в файл modules/item.php строки
Код
$user = JFactory::getUser();
if (!$user->guest){
как показано в примере выше от 4ort
И в конце добавьте одну закрывающуюся скобку и
Код
else {
echo JText::_('Войдите, или зарегистрируйтесь, чтобы оценить.');
}
И вуаля, всё работает на ура как с зарегестрированными пользователями так и с гостями =)
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Отдельные допполя видны только админу

Автор глюм

Ответов: 0
Просмотров: 1252
Последний ответ 22.08.2013, 14:15:14
от глюм