web-dev-qa-db-ja.com

JFormサブフォームフィールドでカスタムレイアウトを使用する方法

一部のフォームをコンポーネントで再利用したい。サブフォームフィールドがその役割を果たします。ただし、サブフォームを表示するときに、いくつかのフィールドやフィールドグループを削除する必要があります。

JFormメソッドremoveGroup()およびremoveField()を使用しようとしましたが、サブフォームから削除されません。

新しいレイアウトが進むべき道だと思います。 layout='joomla.form.field.subform.default'の代わりに、フィールドでレイアウトを指定できます。
この作業をしますか?

もしそうなら、どうすればカスタムレイアウトを実装できますか?
例をいただければ幸いです。

5
nimble

サブフォーム(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>
2
nimble

サブフォームフィールドタイプ固有の回答を追加するために編集:

適切に見れば、独自のレイアウトをサブフォームフィールドタイプにアタッチするのは非常に簡単です。

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); ?>
  • 最初の引数は「layoutFolder.layoutName」です。
  • 2番目の引数は、レイアウトに渡すデータです(フォーム/フィールドを渡します)。
  • 3番目は、レイアウトフォルダー/ファイルを検索するために使用する基本パスです(この場合、コンポーネントの管理者インストールへのパス)。

レイアウトをレンダリングする場合は、それに似たものを追加する必要があります。

Joomlaのadministratorフォルダー内のcom_myComponentフォルダー(つまり、JPATH_COMPONENT_ADMINISTRATOR)の構造は次のとおりです。

-com_myComponent 
    - classes
    - controllers
    - layouts
        - dupebutton.php
        - anotherlayout.php

Joomlaのレイアウトヘルパーは、レンダリング時に指定したデータをレイアウトに渡します。レイアウトがレンダリングされると、$displayDataという事前に割り当てられた変数が含まれます。この変数をそのまま使用できますが、レイアウトファイルの上部にある<?phpタグにこの行を追加するのはJoomlaの慣習のようです。

$data = $displayData;

これで、必要なフォームフィールドを使用してレイアウトを構築することができます。その例も必要な場合はお知らせください。すでに知っているようです。

ちなみに、フォームのサブグループから選択することは実際には可能だと確信していますが、構文はあまり直感的ではなく、十分に文書化されていません。

あなたが望むものを達成するための複数の方法もあり、レイアウトを使用する代わりの方法があります。それでも、それはどれほど優れた解決策でもあるので、私はそれに固執します。

4
chrBrd