Новости Joomla

Рендер пользовательского поля внутри другого пользовательского поля. Joomla 5.3

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

<?php $joomlaFieldContentPlugn->onContentPrepare('com_content.article', $fakeItem, $app->getParams());

Joomla постепенно переходит от простого указания аргументов для триггеров плагинов к собственным классам событий. Это позволяет не запоминать порядок передачи аргументов класса и использовать человекопонятные методы

$event->getContext(),
$event->getItem() и т.д. А то в одном месте в Joomla было
$article, в другом -
$item, в третьем ещё как-то... Порядку больше становится.

Сегодня обновил сайт клиентов до Joomla 5.3. В ней обновили контент-плагин fields и мой финт ушами с вызовом метода плагина отвалился потому, что я передавал в нём 3 аргумента, вместо одного. И для события

onContentPrepare это должен быть объект класса 
ContentPrepareEvent. Как меняется фрагмент кода из предыдущего поста:

<?php // мы находимся в файле макета поля use Joomla\CMS\Event\Content\ContentPrepareEvent; use Joomla\CMS\Factory; $app = Factory::getApplication(); $fakeItem = new \stdClass(); // Получаем id текущего материала из объекта Input $fakeItem->id = $app->getInput()->getInt('id'); // {field 29} - это шорт код вставки поля с id 29 - "ассортимент проекта" // к содержимому поля конкатенируем шорт-код для обработки $fakeItem->text = $field->value . '{field 29}'; // Получаем объект плагина $joomlaFieldContentPlugn = $app->bootPLugin('fields', 'content'); // вызываем метод обработки напрямую // вместо 3-х аргументов теперь указываем один // это объект класса ContentPrepareEvent $joomlaFieldContentPlugn->onContentPrepare(new ContentPrepareEvent('onContentPrepare', [ 'context' => 'com_content.article', 'subject' => $fakeItem, 'params' => $app->getParams(), 'page' => 0, ])); // выводим оба поля echo $fakeItem->text;

@webtolkru 

Вышел релиз Joomla 5.3.0

Вышел релиз Joomla 5.3.0

Проект Joomla с радостью объявляет о выходе Joomla 5.3 — последней минорной версии в серии Joomla 5.

Этот релиз сосредоточен на продуманных улучшениях, которые совершенствуют работу с CMS. От лучшей организации файлов и журналирования задач до расширенной обработки электронной почты и улучшенной доступности — Joomla 5.3 помогает администраторам и разработчикам работать более эффективно, сохраняя ваш сайт современным, безопасным и готовым к будущему.

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

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
В одном поле основной таблицы надо хранить несколько ссылок на другую (второстепенную) таблицу, хочу сделать это посредством типа поля checkboxes: наименования option берутся из второстепенной таблицы, хранимые значения в поле основной таблицы - id выбранных option из второстепенной таблицы.
В общем, что-то аналогичное полю категории с атрибутом multiple: указание в поле нескольких значений, являющимися записями в другой таблице.

Как такое реализовать можно?
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
Похоже, я опять вопрос задал через назад...
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
В xml-списке полей (models/forms/) объявил поле как <field name="cblist" type="checkboxes" label="LIST">, как мне его в модели(?) теперь заполнить значениями и таблицы бд?
*

SmokerMan

  • Гуру
  • 5291
  • 720 / 26
В xml-списке полей (models/forms/) объявил поле как <field name="cblist" type="checkboxes" label="LIST">, как мне его в модели(?) теперь заполнить значениями и таблицы бд?
в модели можно использовать метод loadFormData, если модель наследуется от JModelForm
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
Да, JModelForm, но loadFormData возвращает значения из текущей записи связанной таблицы, а список option надо заполнить значениями из другой таблицы, и уже каждый option будет чекед/унчекед согласно значению связанного со списком поля, возвращаемого loadFormData, имхо, option должны быть заполнены до вызова loadFormData, или я опять ничего не понимаю?
*

SmokerMan

  • Гуру
  • 5291
  • 720 / 26
Код
   protected function loadFormData()
    {
        $data = $this->getItem();
        
        $data->cblist = array(1,2,3); // тут делается нужный запрос

        return $data;
    }

или как вариант создать свой тип поля и в нем делать уже запрос
« Последнее редактирование: 23.12.2014, 16:04:20 от SmokerMan »
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
Код: php
    $db = $this->getDbo();
    $query = $db->getQuery(true);
    $query->select('id, name')->from('#__classif');
    $data->cblist = $db->setQuery($query)->loadObjectList();
Полю присваивается массив значений, список option остается пуст
*

SmokerMan

  • Гуру
  • 5291
  • 720 / 26
Полю присваивается массив значений, список option остается пуст
а с чего оно будет не пустым, если эти значения для типа checkboxes должны задаваться в XML
тут же происходит просто подстановка выбранных значений для конкретной записи

Опять же, вопрос не понятен что должно и куда подставятся.
Если нужно сделать свой select, то создается свой тип поля и в нем делается что нужно
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
так задача: список оптионс сформировать динамически, из значений таблицы бд
*

SmokerMan

  • Гуру
  • 5291
  • 720 / 26
так ответ:
Если нужно сделать свой select, то создается свой тип поля и в нем делается что нужно
https://docs.joomla.org/Creating_a_custom_form_field_type
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
Сделал свое поле:
Спойлер
[свернуть]

В атрибут src записываем строкой вида "таблица.ключ.метка": соответственно имя таблицы без префикса, из которой тянутся записи. имя поля, из которого формируются value чекбоксов, имя поля для лэйбла. Например: src="categories.id.title", каждый оптионс будет в виде чекбокса с value=id, рядом будет метка с выводом title.

Отмеченные оптионс хранятся в checkedOptions поля (как и в стандартном checkboxes).
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
Теперь вопрос: как в loadFormData записать в checkedOptions значение из текущей записи, возвращаемой getItems, и прочитать обратно из checkedOptions в поле записи.
Здесь http://ссылка вырезана, так как домен распространяет вирусы/standartnye-tipy-polej/checkboxes немного есть, но не догоню чего-то, как применить это.
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
Код: php
   $db = $this->getDbo();
    $query = $db->getQuery(true);
    $query->select('id, name')->from('#__classif');
    $data->cblist = $db->setQuery($query)->loadObjectList();
Полю присваивается массив значений, список option остается пуст
Присваивается массив объектов а не значений! Вы уверенны что у вас правильно потом поле понимает что ему надо брать?)
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
не уверен, пока оно вообще ничего не принимает и не отдлает
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
попробуйте просто
$data->cblist  = array(и тут списко существубщих значений);
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
И да сделать это не в protected function loadFormData()
а  в
Код: php
public function getItem($pk = null){
if ($item = parent::getItem($pk)){
$item->cblist  = array(...);
}
return $item;
}
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
$data->cblist = array(2,5);
ноль эффекта
*

SmokerMan

  • Гуру
  • 5291
  • 720 / 26
я лично ничего не понял что нужно сделать)

cblist - вообще куда нибудь записывается?
если записывается, то в своем поле можно получить выбранные значение через $this->value и не надо ни в какую модель лезть.
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
cblist - текстовое поле в таблице базы, содержит массив значений.
В админке этот массив нужно показать в виде списка чекбоксов (чекбокслист), в котором отмечены те чекбоксы, чьи значения входят в массив cblist.
Задача:
- при создании новой записи в админке, записать в массив cblist значения отмеченных (checked="true") чекбоксов из чекбокслиста;
- при открытии записи на редактирование в чекбокслисте отметить (checked="true") те чекбоксы, значения которых входит в массив cblist.

Чекбокслист имеет свойство checkedOptions, через которое доступно чтение/запись отмеченных в чекбокслисте чекбоксов в виде перечисленных через запятую без пробелов значений.

(от частого упоминания слова чекбокс у меня уже крыша едет)
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
XML:
Код: xml
<field
name="checkboxes"
type="checkboxes"
label="Опции"
description="Описание поля"
class="my-class">
<option value="1">Опция 1</option>
<option value="2">Опция 2</option>
<option value="3">Опция 3</option>
<option value="4">Опция 4</option>
</field>

шаблон:
Код: php
<div class="control-group">
<div class="control-label"><?php echo $this->form->getLabel( 'checkboxes' ); ?></div>
<div class="controls"><?php echo $this->form->getInput( 'checkboxes' ); ?></div>
</div>

Модель:
Код: php
public function getItem( $id = null )
{
if ( $item = parent::getItem( $id ) ) {
$item->checkboxes = array( 1, 3 );
}
return $item;
}

В итоге ставятся флажки на первый и третий чекбокс!
« Последнее редактирование: 23.12.2014, 19:49:38 от Istaan »
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
чекбокс, чекбокс, чекбокс, чекбокс, чекбокс, чекбокс, чекбокс, чекбокс, чекбокс
while(true){ echo 'checkbox';}
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
Пример.
В XML пишу:
Код: xml
<field name="categories" type="checkboxesdb" label="COM_CRMT_COUNTRIES_LIST" class="well well-small" src="categories.id.title"/>

Во вьюхе пишу:
Код: php
echo $this->form->getInput('categories');

На выходе получаю:
Спойлер
[свернуть]
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
А в модели что вы пишите?)
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
XML:
Код: xml
<field
name="checkboxes"
type="checkboxes"
label="Опции"
description="Описание поля"
class="my-class">
<option value="1">Опция 1</option>
<option value="2">Опция 2</option>
<option value="3">Опция 3</option>
<option value="4">Опция 4</option>
</field>
Одно маленькое уточнение: у меня оптионс тянуться из отдельной таблицы динамически (код поля выше в 10 посту)

В модели:
Код: php
public function getItem( $id = null )
{
if ( $item = parent::getItem( $id ) ) {
$item->categories= array(2,5);
}
return $item;
}
 
*

Aleks.Denezh

  • Живу я здесь
  • 3404
  • 428 / 4
Конечно у вас так не получится, у вас тип поля checkboxesdb это явно не стандартный джумловскией чекбокс ) По этому и не выйдет у вас так )
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
правильно, я сам его вот только создал, потому что в стандартный не получается динамически прописать оптионс
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
хотя публичные свойства у обоих полей идентичные (свой на базе оригинального делал)
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Путь к новому типу указали?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

AlekVolsk

  • Гуру
  • 6913
  • 415 / 4
хм.. где и как именно? файл вообще лежит там же. где и все поля J: \libraries\joomla\form\fields\
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
В XML, addfieldpath.

P.S. А, в libraries положили? Файл так и называется: checkboxesdb.php?
Не будь паразитом, сделай что-нибудь самостоятельно!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Опциональное поле в форме

Автор borro

Ответов: 21
Просмотров: 1876
Последний ответ 28.12.2020, 12:16:13
от platonische
Как написать сложное кастомное поле?

Автор Gover

Ответов: 1
Просмотров: 785
Последний ответ 11.07.2018, 00:14:34
от fsv
Если нужно добавить поле в subform repeatable своим ява скриптом - как сделать?

Автор Progreccor

Ответов: 7
Просмотров: 1016
Последний ответ 03.04.2018, 16:03:54
от Progreccor
Поле для прикрепления файлов в администраторе

Автор Joker_V

Ответов: 1
Просмотров: 1132
Последний ответ 09.04.2016, 21:17:02
от Joker_V
Добавляю поле Featured в компоненте

Автор platonische

Ответов: 6
Просмотров: 1306
Последний ответ 21.10.2015, 18:06:48
от Aleks.Denezh