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

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Доброго времени суток. Не давно я написал свой первый компонент (есесн по урокам из сети) для Joomla 3.0. Суть компонента проста - есть таблица в БД куда пишутся заказы пользователей на грузоперевозки.

В админке админ  может тот или иной заказ отредактировать или удалить или же создать новый. Компонент в принципе примитивен - работает с одной таблицей бд. Но не давно потребовалось сделать так - что бы при редактирования или создании новой записи в админке в поле ИМЯ было не просто текстовое поле -  а выпадающий список всех пользователей, которые зарегистрированы на сайте.

Вот теперь парюсь и не знаю как это реализовать - умом понимаю что для этого нужно прописать новое обращение к таблице users в модуле, нужно в контроллере написать код который будет обрабатывать данные для вьюхи и в XML rt с формой вывести список - но трабла в том, что из-за не совершенства знаний самого фреймворка Joomla не могу точно понять что и куда писать.

Подскажите плз как научить компонент тянуть данные из другой таблицы БД )
*

passer

  • Завсегдатай
  • 1013
  • 75 / 3
Код: php
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select($db->quoteName(array('id', 'username')));
$query->from($db->quoteName('#__users'));
$db->setQuery($query);
$users = $db->loadAssocList();
var_dump($users);
Имя таблицы и поля выборки написал отбалды.
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Код: php
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select($db->quoteName(array('id', 'username')));
$query->from($db->quoteName('#__users'));
$db->setQuery($query);
$users = $db->loadAssocList();
var_dump($users);
Имя таблицы и поля выборки написал отбалды.
Код: php
$db = JFactory::getDBO();
$query = $db->getQuery(true);
$query->select($db->quoteName(array('id', 'username')));
$query->from($db->quoteName('#__users'));
$db->setQuery($query);
$users = $db->loadAssocList();
var_dump($users);
Имя таблицы и поля выборки написал отбалды.

это у нас получается просто выведет список ид пользователей если я не ошибаюсь ?
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Неужели никто не знает ? Как мне привязать к xmk с формами результат выборки пользователей из бд в форме ?
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Создаете кастомный типа поля в котором на основе выборки имен пользователей и их ид как выше показали формируете HTML select. Прописывате в вашей xml-ке путь к папке с этим полем.
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Создаете кастомный типа поля в котором на основе выборки имен пользователей и их ид как выше показали формируете HTML select. Прописывате в вашей xml-ке путь к этому полю. Все просто.

 простите а можно чуть подробнее. У меня в XML ка с формами путь нигде не указан - список полей в форме edit.php выведен в цикле


Код
 <?php foreach($this->form->getFieldset() as $field): ?>
  <?php if (!$field->hidden): ?>
  <?php echo '<b>'.$field->label.'</b>'; ?>
  <?php endif; ?>
  <?php echo $field->input; ?>
  <?php endforeach; ?>

если я создам в XML rt форму, то мне получается нужно как то в форму передать данные - и вот как раз в этом моменте я, простите за выражение, туплю по жесткому (
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
простите но все равно не все пронял. Вот смотрите - исходя из доков  мне нужно сделать по сути мульти запрос к бд - что бы данные выбирались из таблицы заказами + таблицы с пользователями

делаю
было

Код
   $query->select($db->quoteName('b.username'));
$query->leftJoin(
    $db->quoteName('#__users', 'b')
    . ' ON '
    . $db->quoteName('b.id')
    . ' = ' . $db->quoteName('a.created_by')
);

стало
Код
$query->select('a.*');
$query->from($db->quoteName('zdj5e_zakaz', 'a'));
// Присоединяем #__users
$query->select($db->quoteName('b.username'));
$query->leftJoin(
    $db->quoteName('zdj5e_users', 'b')
    . ' ON '
    . $db->quoteName('b.id')
   
);

запрос сам по себе рабочий. Его я провожу в файле administration/components/com_mycomponent/models/fields/mycomponent.php

На сколько я понимаю именно этот файл выводит данные для формы редактирования или создания материала - но теперь вопрос как мне в XML отдать данные ? Где находится этот переходный момент ?  :( >:(
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
В xml-ке добавляете поле с  вашем типом, в котором выборка значений и генерация селектов. Добавляете также addfieldPath в xml-ке который будет указывать на папку с этим типом. По ссылке все подробно расписано, что где добавить в xml-ке и как создавать файлик с вашем типом поля, что вам непонятно то? Ну если вам так сложно напишите нужный вам селект прямо в вашем коде и не морочтесь с XML
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
английский не понятен :)
На сколько я понимаю вы советуете  путь создания нового класса для поля - но я то делаю через тот класс который уже есть, что бы минимизировать работу (и багов не создавать :) ).
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Это вообще нормальная практика, что вы имеете ввиду под багами я незнаю. Не знаете английского, погуглите тоже самое на русском, думаю что материалов на эту тему немало, расписывать все это на форуме не вижу смысла.
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
вы поймите что я новичек в создании компонентов для Joomla - я до сих пор к примеру не могу понять смысла от 2ух файлов в контроллере или в моделе по типу mycomponentS и mycomponenT - по этому сейчас для меня это весьма трудоемко

Неужели нельзя сделать все в одном запросе ? Ну то есть к примеру есть запрос к бд который выводит все о заказе - к ниму Joinom  крепим данные из пользователей и все отправляем сразу в форму  ?
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Выборка данных из нескольких таблиц вполне возможна, если использовать джоины и подзапросы в sql, только вот каким боком это относится к сабжу? Если вам надо просто вывести форму с данными, cделайте выборку и сформируйте HTML на основе этих данных. Это никак не относится ни к XML ни к Joomla
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
с одной стороны да - я так и думал сделать - сделать запрос - выбрать данные и вставить во вьюху с редактированием - н что делать если мы не создаем а редактируем запись ? То есть при создании нового заказа проблем нет - вывелись пустые формы и список пользователей, а при редактировании записи получится что выведится форма с заполненными полями + список пользователей, при чем выбран будет не тот пользователь который в заказе, а будет результат простой выборки - по этому я и хочу реализовать через XML - на сколько я понимаю именно благодаря такой реализации в Joomla без лишних усилий можно реализовать  добавление новых полей
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Совершенно необязательно использовать xml-ку для создания/редактирования форм во фронтенде. Напротив, это вобщем-то лишний функционал. Разница между формами для создания новой записи и редактирования записей только в значениях по умолчанию, которые можно задать по условию.
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
Хм, тогда простите но встречный вопрос - вот к примеру попробовал сделать таким образом - вывести и сгенерировать выпадающий список с пользователями в форме

Код
<form action="<?php echo JRoute::_('index.php?option=com_mycomponents&layout=edit&id='.(int) $this->item->id); ?>" method="post" name="adminForm" id="mycomponent-form" class="form-validate">
<div class=" fltlft">   
<fieldset class="adminform">
 
<!--Вывод данных из бд в форму + вкладки навигации в данном случае она одна-->
<ul class="nav nav-tabs">
<li class="active"><a href="#details" data-toggle="tab"><?php echo empty($this->item->id)? JText::_('COM_MYCOMPONENT_DETALIS') : JText::sprintf('COM_MYCOMPONENT_DETALIS', $this->item->id); ?></a></li>     
</ul>


 <?
$strSQL2 = "SELECT * FROM `zdj5e_users` Order by `id` ASC ";
$rs3 = mysql_query($strSQL2);
?>
<select name="name" >
<?
while($row = mysql_fetch_array($rs3)) { ?>
<option value="<? echo $row['name'] ?>"><? echo $row['name'] ?></option>
<?}?>
</select>




  <?php foreach($this->form->getFieldset() as $field): ?>
  <?php if (!$field->hidden): ?>
  <?php echo '<b>'.$field->label.'</b>'; ?>
  <?php endif; ?>
  <?php echo $field->input; ?>
  <?php endforeach; ?>
</fieldset>
</div>
 
 
 
<div>
  <input type="hidden" name="task" value="" />
  <?php echo JHtml::_('form.token'); ?>
</div>
</form>

при сохранении записи имя пользователя в бд не пишется
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
А потому что имя вашего селекта не совпадает с именем которая модель обрабатывает скорее всего посмотрите как называются другие поля в форме. Скорее всего что-то вроде name="jform[fieldname]"

Делайте форму на основе чего то одного, или даные из базы, или данные из XML. И не выполняйте запросы в виде, это дурной тон,  выполняйте их в модели или хелпере на крайняк.
« Последнее редактирование: 28.03.2015, 19:48:00 от zomby6888 »
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
пробовал и так

Код
<?
$strSQL2 = "SELECT * FROM `zdj5e_users` Order by `id` ASC ";
$rs3 = mysql_query($strSQL2);
?>
<select  name="jform[name]" id="jform_name"    >
<?
while($row = mysql_fetch_array($rs3)) { ?>
<option value="<? echo $row['name'] ?>"><? echo $row['name'] ?></option>
<?}?>
</select>

все равно не пишет - хотя имя такое же как и если бы я через XML  вывел бы поле name  >:( >:( >:(
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
А в таблице у вас есть поле с именем name? Проанализируйте какие данные принимает контроллер, какие данные он передает в модель при сохранении.
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
В таблице ячейка есть - с этим все норм. Но как мне промониторить работ модели ? (уж простите - совсем запутлся)
*

zomby6888

  • Завсегдатай
  • 1473
  • 171 / 3
Если у вас есть IDE, делайте точки останова и анализируйте переменные, раз уж вы разработкой занимаетесь, без этого вы особо не продвинетсь. Если вы упрямо пишите в блокнотике то делайте echo, print_r, var_dumb и отслеживайте цепочки вызовов методов. Когда в конец за...сь ставьте себе IDE :-)
интернет-блог: http://websiteprog.ru
*

voron121

  • Захожу иногда
  • 220
  • 1 / 0
  • Метод тыка и мата помогает в кодинге
А ведь все как всегда просто оказалось - и не стоит прописывать лишние запросы или ковырять поля - все элементарно.
В XML файле с формами можно прописать, как оказалось, запрос в бд с нужными данными. При этом запрос выведет нужный список с возможностью сохранения и редактирования. Вот пример того как сделал я


Код: xml
<field name="name"
  type="sql"
  default="10"
  label="Name"
  query="SELECT name FROM zdj5e_users"
  key_field="name"
  />

результат - в поле Имя есть выпадающий список с нужными параметрами  ^-^ ^-^ ^-^ ^-^ ^-^
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

SP Page Builder + JShortcodes, красивый список

Автор kunsaid

Ответов: 0
Просмотров: 516
Последний ответ 07.04.2025, 11:21:06
от kunsaid
Как вывести на страницу в виде картинок как фотогалерею из widgetkit?

Автор chechelnitskiy

Ответов: 0
Просмотров: 1207
Последний ответ 08.05.2024, 13:31:09
от chechelnitskiy
Zoo. Как в тизере под заголовком вывести обрезанную статью?

Автор lournrose

Ответов: 0
Просмотров: 933
Последний ответ 04.12.2021, 19:00:43
от lournrose
Обновить значения в таблице

Автор semen1707

Ответов: 0
Просмотров: 570
Последний ответ 12.04.2021, 18:46:13
от semen1707
Проблема с временем pm/am в компоненте sp soccer (шаблон shaper soccer)

Автор Mira

Ответов: 7
Просмотров: 1413
Последний ответ 21.04.2019, 13:52:42
от Mira