2つのタブにサブフォームを呼び出す基本的なxmlファイルがあります。タブ1およびタブ2と呼ばれます。このファイルの内容は以下のとおりです。
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>
これで、tab1にロードされるフォームにこのコンテンツがあります。
storymaker.xml
<?xml version="1.0" encoding="UTF-8"?>
<form>
<field name="characterselection" label="" type="characterselection"/>
</form>
タブ2のフォームはこれで構成されています。
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>
タブ1では、カスタムフィールドを使用しています。このカスタムフィールドは次のように作成されています。
<?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;
}
}
私は考えつくことができるすべてのものをすでに試しましたが、良くありません。だからここに私はあなたの助けを求めています。
A)tab2には、繰り返し可能なサブフォームを介して作成された名前のリストがあり、10個の名前または1000個の名前にすることができます。
B)tab1に、tab2で指定された名前から生成されたドロップダウンを表示したい別の繰り返し可能なサブフォームがあります。
C)次に、サブフォームに使用される通常のforeachを介して、これらの名前をフロントエンドに表示したいと思います。
$storymaker = $params->get('storymaker');
foreach ($storymaker as $sm) :
echo $sm->characterselection . ' ';
echo '<br><br>';
endforeach;
悲しいことに、私はAしか達成できませんでした。そのため、Bの助けが必要です。それがうまくいけば、Cは自動的に大丈夫だと思いますが、そうでなければ、それについても助けが必要かもしれません。
サブフォームについて、およびモジュール内のモジュールからのパラメーターを使用して、インターネットで見つけたすべてのものを試しました。上記のコードの左側にこの部分が表示されています(コメント)。
私は自分の問題に関連するすべてのファイルを用意する必要がありました。そうしないと、私が話していることを誰も理解できないと思います。しかし、長いテキストとコードの一部については申し訳ありません。
私はこれを少し違う方法で解決しました。
Bは、すべての入力を取得して選択ボックスに変換するこのコードを介して行われます。次に、ユーザーが選択を行うと、その選択が通常のテキストフォームフィールドにコピーされます。これは、Cの結果を取得するためにロードするフィールドです。ユーザーが何も選択していない場合、選択ボックスにWord character
が表示されます。
(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);
上記のコードは、storymaker.xmlが完全に異なるため、以前のコードと正確に連動しないことに注意してください
<?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>