2016-09-29 5 views
0

データエクステンションでデータオブジェクトを拡張すると、データオブジェクトに余分な機能を追加できます。例えば、私は在庫保存機能を持つモジュールから拡張されたItemを持っています。 Itemがいくつかの他のモジュールから拡張されたフォームを取得したとしましょう。データエクステンション/モジュールコンテンツでテンプレートを拡張する - SilverStripe 3.4

在庫保管機能を拡張した後、私はフロントエンドに商品の在庫状況を表示したいと思います。たとえば、緑色/赤色の点があります。項目の概要ページの詳細ページ(ItemPage.ss)とインクルード(Item.ss)のテンプレート内でこのドットのマークアップを取得するにはどうすればいいですか?はテンプレート全体を上書きしません。基本クラスの関数を拡張する方法と同じように、この部分を追加するだけです。

答えて

0

テンプレートを部分的に変更することはできません。テンプレートを別のテンプレートに置き換えることはできます。したがって、これを覚えておくと、多くの論理的なインクルードを持つモジュラーアーキテクチャを維持する必要があります。

既存のコンテンツを拡張するもう1つの方法は、DOMとjavascriptを使用することです。しかし、副作用について考えるべきです。たとえば、余分なテキストコンテンツを追加すると、クローラによって表示されず、SEOに影響します。しかし、追加の色付きのドットを追加するなどの装飾的な機能強化のためには、この方法が有効です。

+0

私はそれがデフォルトでは可能ではないと思っていました。ドットは単純な例に過ぎませんでした。もちろん、さらに複雑なデータを追加することもあります。 JSは良い選択ではありません。おそらく私はこれを達成するためのカスタム関数について考える必要があります。 –

1

これは、元のテンプレートに余分なマークアップを追加する方法です。特定のデータオブジェクトの拡張機能

public function updateExtraTemplateHTML($htmlBlocks) { 
    $viewer = new SSViewer(__CLASS__); 
    $html = $viewer->process($this->owner); 
    $htmlBlocks['bottom'][] = $html; 

    $topHtml = HTMLText::create(); 
    $topHtml->setValue(123); 
    $htmlBlocks['top'][] = $topHtml; 

    return $htmlBlocks; 
    } 

オリジナルテンプレートの内部データオブジェクトまたはグローバルデータオブジェクトの拡張

public function ExtraTemplateHTML($position) { 
    $html = null; 

    foreach($this->owner->extend('updateExtraTemplateHTML') as $positionBlocks) { 
     if(isset($positionBlocks[$position])) { 
     foreach($positionBlocks[$position] as $htmlBlock) { 
      $html .= $htmlBlock->getValue(); 
     } 
     } 
    } 

    return $html; 
    } 

インサイド

$ExtraTemplateHTML(top) 
... 
... 
$ExtraTemplateHTML(bottom) 

拡張テンプレート

追加するコンテンツを含む拡張機能用の新しいテンプレートを作成するだけです。

+0

既存のテンプレートを上書きするのではなく、実際に拡張性をサポートするように元のテンプレートを変更しています。このアプローチは、 'silverstirpe/widgets'、' sheadawson/silverstripe-blocks'、 'nobrainerweb/silverstripe-content-blocks'パッケージで既に使われています。 –

+0

私の質問に書かれているように、テンプレートを上書きするのは私の目標ではありませんでした。モジュールをありがとう、おそらく彼らのアプローチは私より優れています。 –

関連する問題