com_ajaxを使用して別のモジュールをロードおよびアンロードする方法(アダプティブデザインの場合)


7

これは、モバイルデバイスのパフォーマンスを最適化するために、Joomla 3のデバイスまたはビューポートサイズに基づいてモジュールをどのように無効にできるかという質問のフォローアップです。

com_ajaxを使用してモジュールをロードおよびアンロードするにはどうすればよいですか?呼び出しは、純粋なjavascriptまたはjqueryのいずれかを使用して行うことができ、ビューポートサイズに基づいて行われます(このためにmediacheck.jsを使用しています:https : //github.com/sparkbox/mediaCheck)。

この答えがどこに行くかに応じて、この種の動的ロードを可能にするためにコンポーネントを[開発する]にすることもできます(ブレークポイントを選択し、ロード/アンロードするモジュールを選択します)。

正当化:レスポンシブ/アダプティブ(フレーバーを選択する)は今日では不可欠であり、モバイルの負荷サイズも小さくなっています(良好な受信エリアでは、ここではブラジルでは3Gの速度が遅くなります)。10〜15kのjQuery / Javascriptを使用して、20〜200kのモジュールのロードを回避できる場合(モジュールに画像を含めることができるため、かなり大きなサイズに達する可能性があります)、私はそれで十分です。画面の乱雑さを軽減することも、優れたモバイルデザインでは必須です。モジュールなしで設計しているため、これを「モバイルファースト」であると主張することもでき、画面サイズが許す限りロードします。


1
非常に良い質問です。自分で実際にやりたいことがあるが、現時点での最善の方法がわからない。それがすでに達成されているかどうかを確認するために何か調査をしましたか?
Lodder 2014

これが可能であることさえ知らなかった。今日に追いつくには多すぎる。良い質問。
Nestor Ledon 2014

回答:


5

com_ajaxは、モジュールのデータがサポートされている場合(JSONベース)にのみ実際に使用されますが、他の機能もあります。モジュールを「単に」ロードする最も簡単な方法は、新しいテンプレートファイルを作成することです。これは、テンプレートディレクトリに「module.php」のようなものを作成することで実行できます。次に、このようなものを内部で使用します。

<?php
$jinput = JFactory::getApplication()->input;
$module = $jinput->get('module_pos', 'default_value', 'get');
?>
<jdoc:include type="modules" name="<?php echo $module; ?>"/>

これにより、ページ内のモジュールのみが読み込まindex.php?tmpl=module&module_pos=fooれるはずです。ajaxリクエストのようにURLを使用することで、モジュールデータを「そのまま」取得できるはずです。これにより、module_posで指定された位置に割り当てられたすべてのモジュールがロードされます。

ただし、これにはjavascriptという1つの問題があります。モジュールは、JoomlaのAPIを介してヘッドタグにJavaScriptを追加します。これに対抗するには、head.tagにあるもの、現在のページにまだないものを見つけるためにmodule.phpファイルにさらに追加する必要があり、実際には必要なものを見つけて追加します。このプロセスはかなり困難ですが、これを行うモジュールがわかっている場合は、モジュールに応じてこれを自動的に行うためにajax呼び出しにさらに追加することができます。

これは、モジュールを「ロード」するのに役立ちます。ajax経由でロードした後、jqueryを使用してHTMLを必要なページに追加し、「アンロード」してDOMから削除します。

それはjQuery(ROOT_ELEMENT_OF_MODULE).remove();除去のために行うことができますjQuery(PARENT_ELEMENT_TO_INSERT_MODULE).html(MODULE_HTML);。もちろん、実行できるバリエーションがありますが、それは簡単な説明です。


ありがとう、それはうまく機能し、それは簡単な解決策です。この部分の実行方法についてもう少し詳しく説明してください。「これを実行しているモジュールがわかっている場合は、ajax呼び出しにさらに追加して、モジュールに応じてこれを自動的に実行できます」?実際、私はすべてのjsファイルを手動で含めています(追加するファイルはわかっています)
セバスチャンジケル2015年

あなたはのようなものを使用する必要がありjQuery('head').first().append('SCRIPT_TAG');、それはJSをロードする必要があります。jQuery(document).trigger('readty');オンロードを起動する必要がある場合もあるため、それはすべてでは機能しません(ただし、試すことはできます)。ただし、サイトのJSの量によって異なります。オンロードを2回トリガーすると問題が発生する可能性があり、それが機能するかどうかさえわかりません。
ジョーダンラムスタッド2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.