Lors de la création d'un attribut showon dans les options de liste, on peut le faire sous la forme XML depuis Joomla 3.9 comme ceci:
<field name="fieldx" type="list" default="0" label="MYFIELDX">
<option value="0">0</option>
<option value="1">1</option>
</field>
<field name="myfield" type="list" default="0" label="MYFIELD">
<option value="0">A</option>
<option value="1">B</option>
<option value="2" showon="fieldx:1">C</option>
<option value="3">D</option>
</field>
Je veux faire cela dans un petit type de champ personnalisé que j'utilise dans mon composant. La question est de savoir comment puis-je ajouter l'attribut showon aux options de manière dynamique? J'ai vérifié la demande de traction, il a été introduit par sans chance : https://github.com/joomla/joomla-cms/pull/18998
defined('JPATH_BASE') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Form\FormHelper;
FormHelper::loadFieldClass('list');
class JFormFieldObjecttypes extends JFormFieldList
{
protected $type = 'Objecttypes';
public function getOptions()
{
$options = array();
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('id AS value, title AS text');
$query->from('#__mytable');
$query->where('published = 1');
$query->order('ordering');
$db->setQuery($query);
$options = $db->loadObjectList();
foreach ($options as $option) {
$option->text = Text::_($option->text);
$option->showon = 'fieldx:1'; // stupid ofc
}
return array_merge(parent::getOptions(), $options);
}
}
C'est ce que j'ai finalement fait. Si quelqu'un connaît une solution plus propre, merci de me le faire savoir.
defined('JPATH_BASE') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Form\FormHelper;
FormHelper::loadFieldClass('list');
class JFormFieldObjecttypes extends JFormFieldList
{
protected $type = 'Objecttypes';
public function getOptions()
{
$options = array();
$db = Factory::getDbo();
$query = $db->getQuery(true);
$query->select('id AS value, title AS text');
$query->from('#__mytable');
$query->where('published = 1');
$query->order('ordering');
$db->setQuery($query);
$results = $db->loadObjectList();
$options = array();
foreach ($results as $result) {
// here you can do some logic that creates an array containing fieldx dependencies
$fieldx_logic = array(1,2); // just an example
$option = JHTML::_('select.option', $result->value, Text::_($result->text));
$attr = array('field' => 'jform[fieldx]', 'values' => implode(",", $fieldx_logic), 'sign' => '=', 'op' => '');
$option->optionattr = "data-showon='[" . json_encode($attr) . "]'";
$options[] = $option;
}
return array_merge(parent::getOptions(), $options);
}
}