web-dev-qa-db-fra.com

Type de champ personnalisé avec attribut showon pour les options de la liste

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);
    }
}
1
Mike

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);
    }
}
1
Mike