it-swarm.com.de

Verwenden Sie Joomla Subform-Feldwerte in benutzerdefinierten Feldern aus demselben Modul

Ich habe die grundlegende XML-Datei, in der ich Unterformulare in zwei Registerkarten aufrufe. Bezeichnet als Tab 1 und Tab 2. Der Inhalt dieser Datei ist unten.

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>

Jetzt in der Form, die in tab1 geladen wird, habe ich diesen Inhalt.

storymaker.xml

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

das Formular in Tab 2 besteht aus:

characters.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>

In Tab 1 verwende ich ein benutzerdefiniertes Feld, das folgendermaßen aufgebaut ist:

<?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;
}
}

Ich habe schon alles ausprobiert, was ich mir vorstellen konnte, aber nichts Gutes. Hier bitte ich um Ihre Hilfe.

was möchte ich erreichen?

A) In tab2 habe ich eine Liste von Namen, die über ein wiederholbares Unterformular erstellt wurden, so dass es 10 Namen oder 1000 Namen sein können.

B) In tab1 habe ich ein weiteres wiederholbares Unterformular, in dem ich ein Dropdown-Menü anzeigen möchte, das aus den in tab2 angegebenen Namen erstellt wurde.

C) Dann möchte ich diese Namen auf dem Frontend über das normale foreach anzeigen, das für die Unterformulare verwendet wird.

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

was habe ich bisher erreicht?

Leider habe ich nur A erreicht. Also brauche ich Hilfe bei B und ich denke, wenn das klappt, geht C automatisch in Ordnung, aber wenn nicht, brauche ich vielleicht auch Hilfe dabei.

was habe ich bisher versucht

Ich habe alles ausprobiert, was ich im Internet über Unterformulare und die Verwendung von Parametern aus einem Modul innerhalb eines Moduls finden konnte. Sie können Teile davon im obigen Code sehen (kommentiert).

entschuldigung, dass Sie keinen kurzen, genau definierten Code angeben können.

Ich musste alle Dateien zusammenstellen, die mit meinem Problem zusammenhängen, da ich sonst glaube, dass niemand verstehen kann, wovon ich spreche. Entschuldigung für den langen Text und die Codestücke.

vielen Dank an alle für die Hilfe.

2
purple11111

Ich habe das gelöst, indem ich es ein bisschen anders gemacht habe.

B wird über diesen Code ausgeführt, der alle Eingaben erfasst und in eine Auswahlbox konvertiert. Wenn der Benutzer dann eine Auswahl trifft, kopiert er diese Auswahl in ein normales Textformularfeld. Dies ist das Feld, das Sie laden, um die Ergebnisse für C zu erhalten. Wenn der Benutzer nichts ausgewählt hat, wird das Wort character im Auswahlfeld angezeigt.

        (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);

Beachten Sie, dass der obige Code nicht genau mit den vorherigen Codes zusammenarbeitet, da storymaker.xml völlig anders ist

  <?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