web-dev-qa-db-fra.com

utiliser les valeurs de champ Joomla Subform dans un champ personnalisé à partir du même module

J'ai le fichier XML de base où j'appelle les sous-formulaires en deux onglets. Appelé Tab 1 et Tab 2. Le contenu de ce fichier est ci-dessous.

mod_something.xml

<fieldset  name="tab1">
    <field name="storymaker" type="subform"
           formsource="/modules/mod_something/models/forms/storymaker.xml"
           min="1"
           max="9999999999"
           multiple="true"
           layout="joomla.form.field.subform.repeatable-table"
           groupByFieldset="false"
           buttons=""
           label="MOD_SOMETHING_-STORYMAKER-_LABEL"
           description="MOD_SOMETHING_-STORYMAKER-_DESC" />
        </fieldset>

        <fieldset  name="tab2">
    <field name="characters" type="subform"
           formsource="/modules/mod_something/models/forms/characters.xml"
           min="1"
           max="9999999999"
           multiple="true"
           layout="joomla.form.field.subform.repeatable-table"
           groupByFieldset="false"
           buttons=""
           label="MOD_SOMETHING_-CHARACTERS-_LABEL"
           description="MOD_SOMETHING_-CHARACTERS-_DESC" />
        </fieldset>

Maintenant, sous la forme qui est chargée dans l'onglet 1, j'ai ce contenu.

storymaker.xml

<?xml version="1.0" encoding="UTF-8"?>
<form>
  <field name="characterselection" label="" type="characterselection"/>
</form>

le formulaire de l'onglet 2 est composé de ceci:

caractères.xml

<?xml version="1.0" encoding="UTF-8"?>
<form>
  <field
    name="character_name"
    type="text"
    default=""
    label="MOD_SOMETHING_-CHARACTERNAME-_LABEL"
    description="MOD_SOMETHING_-CHARACTERNAME-_DESC"
    size="10"
  />
</form>

Dans l'onglet 1, j'utilise un champ personnalisé. Ce champ personnalisé est construit comme suit:

<?php

// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die('Restricted access');

jimport('joomla.form.formfield');
$document = JFactory::getDocument();
$jinput = JFactory::getApplication()->input;
$characters = $params->get('characters');
//$characters1 = $jinput->json->get('characters');
//$characters2 = $jinput->get('characters', null, null);
//$characters3 = $jinput->get->get('characters', NULL, NULL);
//$characters4 = $jinput->post->get('characters', NULL, NULL);
//$characters5 = $jinput->server->get('characters', NULL, NULL);
class JFormFieldCharacterSelection extends JFormField {

protected $type = 'characterselection';

public function getInput() {

  foreach ($characters as $character) {
    $character[] = $row->character_name;
  }
  // Merge any additional options in the XML definition.
  $options = array_merge(parent::getInput(), $character);
  return $options;
}
}

J'ai déjà essayé tout ce que je pouvais penser mais sans succès. Donc ici je demande votre aide.

qu'est-ce que je veux réaliser

A) Dans l'onglet 2, j'ai une liste de noms créée via un sous-formulaire répétable, de sorte qu'il puisse s'agir de 10 noms ou de 1000.

B) Dans tab1, j'ai un autre sous-formulaire reproductible dans lequel je veux afficher une liste déroulante générée à partir des noms donnés dans tab2.

C) Ensuite, je veux montrer ces noms sur le frontend via le foreach normal utilisé pour les sous-formulaires.

$storymaker = $params->get('storymaker');
foreach ($storymaker as $sm) :
  echo $sm->characterselection . ' ';
  echo '<br><br>';
endforeach;

qu'ai-je accompli jusqu'à présent

Malheureusement, je n'ai atteint que A. J'ai donc besoin d'aide avec B et je pense que si cela fonctionne, C fonctionne automatiquement, mais sinon, je pourrais aussi avoir besoin d'aide pour le faire.

qu'ai-je essayé jusqu'à présent

J'ai essayé tout ce que je pouvais trouver sur Internet concernant les sous-formulaires et les paramètres d'un module dans un module. Vous pouvez voir des parties de cette gauche dans le code ci-dessus (commenté).

désolé de ne pas pouvoir donner un code court et précis.

J'ai dû mettre en place tous les fichiers liés à mon problème, sinon je pense que personne ne serait capable de comprendre ce dont je parle. Mais désolé pour le texte long et les morceaux de code.

merci à tous pour aider.

2
purple11111

J'ai résolu le problème en le faisant un peu différent.

B se fait via ce code qui saisit toutes les entrées et les convertit dans une boîte de sélection. Ensuite, lorsque l'utilisateur effectue une sélection, il la copie dans un champ de texte normal. C’est le champ que vous chargez pour obtenir les résultats pour C. Lorsque l’utilisateur n’a rien sélectionné, il affiche Word character dans la zone de sélection.

        (function ($) {
          $(document).ready(function() {
            $(".selectArea").each(function(i) {
              $(this).addClass("selectBox" + (i+1));
            });
            var values = $("input[id^='jform_params__characters__characters'][id$='__character_name']").map( function(){return $(this).val(); }).get();
            var optionsPlaceholder = '###OPTIONS###';
            var optionPlaceholder = '###OPTION###';
            var select = '<select class="selectInput">' + optionsPlaceholder + '</select>';
            var option = '<option>' + optionPlaceholder + '</option>';
            var options = '';
            for (var i = 0; i < values.length; i++) {
                var currentOption = option.replace(optionPlaceholder, values[i]);
                options += currentOption;
            }
            var selectBox = select.replace(optionsPlaceholder, options);
            var $select = $(selectBox);
            $(".selectBox").html($select);
            $(".selectInput").each(function(i) {
              $(this).addClass("selectInput" + (i+1));
            });
            $("input[id^='jform_params__storymaker__storymaker'][id$='__characterselection_save']").each(function(i) {
              $(this).addClass("selectInputSave selectInputSave" + (i+1));
            });
          });

          $(document).on('change', '.selectInput', function() {
            var savevalue = (this.value);
            var selectClassRaw = $(this).attr("class").replace('selectInput selectInput', '');
            $('.selectInputSave' + selectClassRaw).val(savevalue);
          });

          $(document).ready(function() {
            $(".selectInputSave").each(function() {
              var storedValue = (this.value);
              var storedClassRaw = $(this).attr("class").replace('selectInputSave selectInputSave', '');
              if ((this.value).length > 0) {
                $('.selectInput' + storedClassRaw).val(storedValue);
              } else {
                $('.selectInput' + storedClassRaw).prepend('<option>Character</option>').val('Character');
              }
            });
            $('.selectInputSave').parents('.control-group').addClass('hiddenSaveInput');
          });
        })(jQuery);

Gardez à l'esprit que le code ci-dessus ne fonctionne pas exactement avec les codes précédents car storymaker.xml est complètement différent

  <?xml version="1.0" encoding="UTF-8"?>
  <form>
    <field name="mode"
      type="radio"
      default="story"
      label="MOD_SOMETHING_-MODE-_LABEL"
      description="MOD_SOMETHING_-MODE-_DESC"
      class="btn-group btn-group-yesno"
      >
      <option value="story">MOD_SOMETHING_-STORY-_OPTION</option>
      <option value="speech">MOD_SOMETHING_-SPEECH-_OPTION</option>
    </field>
    <field name="characterselectiongenerate" showon="mode:speech" label="MOD_SOMETHING_-CHARACTERSELECTION-_LABEL" description="MOD_SOMETHING_-CHARACTERSELECTION-_DESC" type="characterselectiongenerate"/>
    <field name="characterselection_save" type="text" default="" label="MOD_SOMETHING_-CHARACTERNAME-_LABEL" description="MOD_SOMETHING_-CHARACTERNAME-_DESC" size="10" />
  </form>
1
purple11111