一部のフォームをコンポーネントで再利用したい。サブフォームフィールドがその役割を果たします。ただし、サブフォームを表示するときに、いくつかのフィールドやフィールドグループを削除する必要があります。
JForm
メソッドremoveGroup()
およびremoveField()
を使用しようとしましたが、サブフォームから削除されません。
新しいレイアウトが進むべき道だと思います。 layout='joomla.form.field.subform.default'
の代わりに、フィールドでレイアウトを指定できます。
この作業をしますか?
もしそうなら、どうすればカスタムレイアウトを実装できますか?
例をいただければ幸いです。
サブフォーム(Joomla!3.6以降)を別の「マスター」フォーム内に配置し、カスタムレイアウトを使用するには:
1)マスターJForm XMLファイルでは、サブフォームフィールドタイプを使用します。
<field name= "fieldname"
description= "Field name description"
type= "subform"
label= "Field Label"
required= "true"
formsource= "/administrator/components/com_mycomponent/models/forms/myform.xml"
layout="myfolder.mylayoutfile"
/>
formsourceは、レンダリングされるJForm XMLサブフォームへのパスです。
layoutは、カスタムレイアウトファイルへのドット表記パスです。コンポーネントのディレクトリ構造に「レイアウト」フォルダが必要です。したがって、com_mycomponent/layoutsになります。レイアウトフォルダーの下に、他のフォルダーを作成できます(必要な場合)。上記の例では、「myfolder」は「layouts」の下のフォルダーであり、「mylayoutfile」はそのフォルダー内のカスタムPHPレイアウトファイルです。ドット表記では「layouts」を指定しないでくださいパスとファイル名に.phpを追加しないでください。
2)これはレイアウトの例ですPHPファイルは目的に合わせて変更できます。
<?php
defined('_JEXEC') or die;
extract($displayData);
$form = $forms[0];
?>
<div class="subform-wrapper">
<?php foreach($form->getGroup('') as $field): ?>
<?php echo $field->renderField(); ?>
<?php endforeach; ?>
</div>
サブフォームフィールドタイプ固有の回答を追加するために編集:
適切に見れば、独自のレイアウトをサブフォームフィールドタイプにアタッチするのは非常に簡単です。
XMLファイルと同じ親コンポーネントフォルダー(サイトまたは管理者)にlayouts
フォルダーを作成し、そこにレイアウトを配置します。
-com_myComponent
- controllers
- layouts
- mylayout.php
- models
- forms
XMLのサブフォームフィールドにlayout="mylayout"
を追加すれば完了です。
簡単にはなれない!
また、レイアウトファイル名はデフォルトのものと同じでもかまいませんが、競合がある場合は常に読み込まれます。したがって、たとえば、default.php
というサブフォームレイアウトがある場合でも、default.php
に名前を付けると、問題なく機能します。
回答を事前編集:
これは、私のレイアウトを含める方法の例です。
<?php echo JLayoutHelper::render('layouts.dupebutton', $dupeData, JPATH_COMPONENT_ADMINISTRATOR); ?>
レイアウトをレンダリングする場合は、それに似たものを追加する必要があります。
Joomlaのadministrator
フォルダー内のcom_myComponent
フォルダー(つまり、JPATH_COMPONENT_ADMINISTRATOR
)の構造は次のとおりです。
-com_myComponent
- classes
- controllers
- layouts
- dupebutton.php
- anotherlayout.php
Joomlaのレイアウトヘルパーは、レンダリング時に指定したデータをレイアウトに渡します。レイアウトがレンダリングされると、$displayData
という事前に割り当てられた変数が含まれます。この変数をそのまま使用できますが、レイアウトファイルの上部にある<?php
タグにこの行を追加するのはJoomlaの慣習のようです。
$data = $displayData;
これで、必要なフォームフィールドを使用してレイアウトを構築することができます。その例も必要な場合はお知らせください。すでに知っているようです。
ちなみに、フォームのサブグループから選択することは実際には可能だと確信していますが、構文はあまり直感的ではなく、十分に文書化されていません。
あなたが望むものを達成するための複数の方法もあり、レイアウトを使用する代わりの方法があります。それでも、それはどれほど優れた解決策でもあるので、私はそれに固執します。