Новости 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 Гость просматривают эту тему.
  • 9 Ответов
  • 2272 Просмотров
*

Chigolberi

  • Захожу иногда
  • 464
  • 12 / 0
Всем привет!

Чтобы добавлялась иконка сайта на главный экран смартфона, нужно указать ссылку на эту иконку:
Код
<link rel="apple-touch-icon-precomposed" href="/templates/protostar/apple-touch-icon-precomposed.png">
Подскажите как правильно добавить данный код ?

Если его просто добавить в index.php шаблона, то если я правильно понимаю, при обновлении Joomla он слетит.
*

AlexB

  • Завсегдатай
  • 1973
  • 54 / 2
*

Chigolberi

  • Захожу иногда
  • 464
  • 12 / 0
Смотря какой шаблон
Стандартный Protostar \templates\protostar\index.php
*

sivers

  • Живу я здесь
  • 2578
  • 357 / 0
В шаблоне можно вставить статично в секцию head либо командой:
Код
$this->addHeadLink('/templates/protostar/apple-touch-icon-precomposed.png', 'apple-touch-icon-precomposed');
В любом месте (например, в плагине):
Код
JFactory::getApplication()->getDocument()->addHeadLink('/templates/protostar/apple-touch-icon-precomposed.png', 'apple-touch-icon-precomposed');

Чтоб шаблон не затирался - клонируйте его и делайте изменение в копии.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

AlexB

  • Завсегдатай
  • 1973
  • 54 / 2
если протостар то только клонирование
или же перед каждым обновлением скачивать папку с шаблоном а потом заливать поверх
*

Chigolberi

  • Захожу иногда
  • 464
  • 12 / 0
В шаблоне можно вставить статично в секцию head либо командой:
Я правильно понимаю, в файл шаблона index.php
Код
<?php
/**
 * @package     Joomla.Site
 * @subpackage  Templates.protostar
 *
 * [member=126442]copyright[/member]   Copyright (C) 2005 - 2020 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/** @var JDocumentHtml $this */

$app  = JFactory::getApplication();
$user = JFactory::getUser();

// Output as HTML5
$this->setHtml5(true);

// Getting params from template
$params = $app->getTemplate(true)->params;

// Detecting Active Variables
$option   = $app->input->getCmd('option', '');
$view     = $app->input->getCmd('view', '');
$layout   = $app->input->getCmd('layout', '');
$task     = $app->input->getCmd('task', '');
$itemid   = $app->input->getCmd('Itemid', '');
$sitename = htmlspecialchars($app->get('sitename'), ENT_QUOTES, 'UTF-8');

if ($task === 'edit' || $layout === 'form')
{
$fullWidth = 1;
}
else
{
$fullWidth = 0;
}

// Add JavaScript Frameworks
JHtml::_('bootstrap.framework');

// Add template js
JHtml::_('script', 'template.js', array('version' => 'auto', 'relative' => true));

// Add html5 shiv
JHtml::_('script', 'jui/html5.js', array('version' => 'auto', 'relative' => true, 'conditional' => 'lt IE 9'));

// Add Stylesheets
JHtml::_('stylesheet', 'template.css', array('version' => 'auto', 'relative' => true));

// Use of Google Font
if ($this->params->get('googleFont'))
{
$font = $this->params->get('googleFontName');

// Handle fonts with selected weights and styles, e.g. Source+Sans+Condensed:400,400i
$fontStyle = str_replace('+', ' ', strstr($font, ':', true)?: $font);

JHtml::_('stylesheet', 'https://fonts.googleapis.com/css?family=' . $font);
$this->addStyleDeclaration("
h1, h2, h3, h4, h5, h6, .site-title {
font-family: '" . $fontStyle . "', sans-serif;
}");
}

// Template color
if ($this->params->get('templateColor'))
{
$this->addStyleDeclaration('
body.site {
border-top: 3px solid ' . $this->params->get('templateColor'). ';
background-color: ' . $this->params->get('templateBackgroundColor'). ';
}
a {
color: ' . $this->params->get('templateColor'). ';
}
.nav-list > .active > a,
.nav-list > .active > a:hover,
.dropdown-menu li > a:hover,
.dropdown-menu .active > a,
.dropdown-menu .active > a:hover,
.nav-pills > .active > a,
.nav-pills > .active > a:hover,
.btn-primary {
background: ' . $this->params->get('templateColor'). ';
}');
}

// Check for a custom CSS file
JHtml::_('stylesheet', 'user.css', array('version' => 'auto', 'relative' => true));
JHtml::_('stylesheet', 'jquery.fancybox.min.css', array('version' => 'auto', 'relative' => true));

// Check for a custom js file
JHtml::_('script', 'user.js', array('version' => 'auto', 'relative' => true));
JHtml::_('script', 'jquery.fancybox.min.js', array('version' => 'auto', 'relative' => true));

// Load optional RTL Bootstrap CSS
JHtml::_('bootstrap.loadCss', false, $this->direction);

// Adjusting content width
$position7ModuleCount = $this->countModules('position-7');
$position8ModuleCount = $this->countModules('position-8');

if ($position7ModuleCount && $position8ModuleCount)
{
$span = 'span6';
}
elseif ($position7ModuleCount && !$position8ModuleCount)
{
$span = 'span9';
}
elseif (!$position7ModuleCount && $position8ModuleCount)
{
$span = 'span9';
}
else
{
$span = 'span12';
}

// Logo file or site title param
if ($this->params->get('logoFile'))
{
$logo = '<img src="' . htmlspecialchars(JUri::root(). $this->params->get('logoFile'), ENT_QUOTES). '" alt="' . $sitename . '" />';
}
elseif ($this->params->get('sitetitle'))
{
$logo = '<span class="site-title" title="' . $sitename . '">' . htmlspecialchars($this->params->get('sitetitle'), ENT_COMPAT, 'UTF-8'). '</span>';
}
else
{
$logo = '<span class="site-title" title="' . $sitename . '">' . $sitename . '</span>';
}
?>
<!DOCTYPE html>
<html lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<jdoc:include type="head" />
</head>
<body class="site <?php echo $option
. ' view-' . $view
. ($layout ? ' layout-' . $layout : ' no-layout')
. ($task ? ' task-' . $task : ' no-task')
. ($itemid ? ' itemid-' . $itemid : '')
. ($params->get('fluidContainer')? ' fluid' : '')
. ($this->direction === 'rtl' ? ' rtl' : '');
?>">
<!-- Body -->
<div class="body" id="top">
<div class="container<?php echo ($params->get('fluidContainer')? '-fluid' : ''); ?>">
<!-- Header -->
<header class="header" role="banner">
<div class="header-inner clearfix">
<a class="brand pull-left" href="<?php echo $this->baseurl; ?>/">
<?php echo $logo; ?>
<?php if ($this->params->get('sitedescription')) : ?>
<?php echo '<div class="site-description">' . htmlspecialchars($this->params->get('sitedescription'), ENT_COMPAT, 'UTF-8'). '</div>'; ?>
<?php endif; ?>
</a>
<div class="header-search pull-right">
<jdoc:include type="modules" name="position-0" style="none" />
</div>
</div>
</header>
<?php if ($this->countModules('position-1')) : ?>
<nav class="navigation" role="navigation">
<div class="navbar pull-left">
<a class="btn btn-navbar collapsed" data-toggle="collapse" data-target=".nav-collapse">
<span class="element-invisible"><?php echo JTEXT::_('TPL_PROTOSTAR_TOGGLE_MENU'); ?></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</a>
</div>
<div class="nav-collapse">
<jdoc:include type="modules" name="position-1" style="none" />
</div>
</nav>
<?php endif; ?>
<jdoc:include type="modules" name="banner" style="xhtml" />
<div class="row-fluid">
<?php if ($position8ModuleCount) : ?>
<!-- Begin Sidebar -->
<div id="sidebar" class="span3">
<div class="sidebar-nav">
<jdoc:include type="modules" name="position-8" style="xhtml" />
</div>
</div>
<!-- End Sidebar -->
<?php endif; ?>
<main id="content" role="main" class="<?php echo $span; ?>">
<!-- Begin Content -->
<jdoc:include type="modules" name="position-3" style="xhtml" />
<jdoc:include type="message" />
<jdoc:include type="component" />
<div class="clearfix"></div>
<jdoc:include type="modules" name="position-2" style="none" />
<!-- End Content -->
</main>
<?php if ($position7ModuleCount) : ?>
<div id="aside" class="span3">
<!-- Begin Right Sidebar -->
<jdoc:include type="modules" name="position-7" style="well" />
<!-- End Right Sidebar -->
</div>
<?php endif; ?>
</div>
</div>
</div>
<!-- Footer -->
<footer class="footer" role="contentinfo">
<div class="container<?php echo ($params->get('fluidContainer')? '-fluid' : ''); ?>">
<hr />
<jdoc:include type="modules" name="footer" style="none" />
<p class="pull-right">
<a href="#top" id="back-top">
<?php echo JText::_('TPL_PROTOSTAR_BACKTOTOP'); ?>
</a>
</p>
<p>
&copy; <?php echo date('Y'); ?> <?php echo $sitename; ?>
</p>
</div>
</footer>
<jdoc:include type="modules" name="debug" style="none" />
</body>
</html>
вставляю следующим образом:
Код
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<jdoc:include type="head" />
<?php $this->addHeadLink('/templates/protostar/apple-touch-icon-precomposed.png', 'apple-touch-icon-precomposed'); ?>
</head>
Чтоб шаблон не затирался - клонируйте его и делайте изменение в копии.
Клонировать - это сделать копию в "Менеджер шаблонов" есть кнопка "Копировать шаблон" ?
У меня много правок сделано в переопределённых макетах данного шаблона, они тоже скопируються ?
*

AlexB

  • Завсегдатай
  • 1973
  • 54 / 2
У меня много правок сделано в переопределённых макетах данного шаблона, они тоже скопируються ?
так сделайте клон
и перелейте все папки из действующего протостара
*

Chigolberi

  • Захожу иногда
  • 464
  • 12 / 0
так сделайте клон
и перелейте все папки из действующего протостара
Сделал копию, абсолютно всё скопировалось, ни чего перезаливать не пришлось.
« Последнее редактирование: 02.07.2020, 10:00:15 от Chigolberi »
*

sivers

  • Живу я здесь
  • 2578
  • 357 / 0
Активным должен быть клон теперь.

вставляю следующим образом:

Здесь можно именно статично вставить:
Код
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="apple-touch-icon-precomposed" href="/templates/protostar/apple-touch-icon-precomposed.png">
<jdoc:include type="head" />
</head>
А если больше нравится вариант с командой $this->addHeadLink, то в любом месте индекса шаблона. Лучше сверху (чтоб меньше путаться) рядом с подключениями стилей и скриптов.
На связи в telegram @sivers
sivers @ inbox . ru
https://sivers.su/
*

Chigolberi

  • Захожу иногда
  • 464
  • 12 / 0
Активным должен быть клон теперь.
Назначил шаблон и макеты уже из клонированного шаблона
Здесь можно именно статично вставить:
Код
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="apple-touch-icon-precomposed" href="/templates/protostar/apple-touch-icon-precomposed.png">
<jdoc:include type="head" />
</head>
А если больше нравится вариант с командой $this->addHeadLink, то в любом месте индекса шаблона. Лучше сверху (чтоб меньше путаться) рядом с подключениями стилей и скриптов.
Спасибо!  *DRINK* , теперь всё предельно ясно.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться