8章 Content Objects (cObject)

Chapter 8. Content Objects (cObject)

8.1. PHP-インフォメーション:

コンテンツオブジェクト(cObject)は最初はPHP-スクリプト”typo3/sysext/cms/tslib/content.php”によってコントロールされる。PHP-クラスは”tslib_cObj”と名づけられ、しばしばこれはオブジェクト($cObj)の変数名となる。

PHPの$cObjは配列、$this->dataを持ち、これは様々な種類のレコードを保有する。データタイプ”getText”参照。

このレコードは通常状況に応じたテーブルからのレコードで”ロード“される。メニューを作成する場合、実際のメニューアイテムからページ・レコードでロードされるか、コンテンツ・レンダリングに関するものであれば、それはコンテンツ・レコードとなる。

8.1. PHP-information:

The content objects (cObjects) are primarily controlled by the PHP-script "typo3/sysext/cms/tslib/content.php". The PHP-class is named "tslib_cObj" and often this is also the variable-name of the objects ($cObj)

The $cObj in PHP has an array, $this->data, which holds records of various kind. See data type "getText".

This record is normally "loaded" with the record from a table depending on the situation. Say if your creating a menu it's often loaded with the page-record of the actual menuitem or if it's about content-rendering it'll be the content-record.

重要な注記:

“cObjects”を取り扱う時、実際にコピーを作成することなくcObjectsを再利用するために、特別なシンタックスを使用することができる。これは、キャッシュされたテンプレートのサイズを最小化するという利点を持っている。しかし、一方で値をオーバーライドするという柔軟性を持っていない。

使い方について以下の例を参照:

#
# Temporary objects are defined:
#
lib.stdheader = COA
lib.stdheader {
  stdWrap.wrapAlign.field = header_position
  stdWrap.typolink.parameter.field = header_link
  stdWrap.fieldRequired = header
  1 = TEXT
  1.current = 1
  1.fontTag = {$content.wrap.header1}
  stdWrap.space = {$content.headerSpace}
}
#
# CType: header
#
tt_content.header = COA
tt_content.header {
  10 < lib.stdheader
  10.stdWrap.space >
  20 = TEXT
  20.field = subheader
  20.fontTag = {$content.wrap.subheader1}
}
#
# CType: bullet
#
tt_content.bullets = COA
tt_content.bullets {
  10 = < lib.stdheader
  20 < styles.content.bulletlist_gr
}

注釈:最初のlib.stdheaderが定義される。これはcObjectである(でなければならない)!(この場合COA)。

lib.stdheaderhは“<”演算子でtt_content.bullets.10にコピーされる。すなわちlib.stdheadernoの実際のコピーはparsetimeで作成されるということである。

しかし、これはtt_content.bullets.10にはあてはまらない。ここではlib.stdheaderは提示されるだけで、lib.stdheaderはruntimeでcObjectとして使用される。

lib.stdheaderが最初のケースでコピーされる理由は、cObject(“10.stdWrap.space>”)内部で”.stdWrap.space”をビットオフにする必要があるという事実である。ポインターのみが作成される第2の場合では、これは行われない。

IMPORTANT NOTE :

When dealing with "cObjects", you're allowed to use a special syntax in order to reuse cObjects without actually creating a copy. This has the advantage of minimizing the size of the cached template. But on the other hand it doesn't give you the flexibility of overriding values.

This example will show you how it works:

#
# Temporary objects are defined:
#
lib.stdheader = COA
lib.stdheader {
  stdWrap.wrapAlign.field = header_position
  stdWrap.typolink.parameter.field = header_link
  stdWrap.fieldRequired = header
  1 = TEXT
  1.current = 1
  1.fontTag = {$content.wrap.header1}
  stdWrap.space = {$content.headerSpace}
}
#
# CType: header
#
tt_content.header = COA
tt_content.header {
  10 < lib.stdheader
  10.stdWrap.space >
  20 = TEXT
  20.field = subheader
  20.fontTag = {$content.wrap.subheader1}
}
#
# CType: bullet
#
tt_content.bullets = COA
tt_content.bullets {
  10 = < lib.stdheader
  20 < styles.content.bulletlist_gr
}

Comment: First lib.stdheader is defined. This is (and must be) a cObject ! (in this case, COA).

Now lib.stdheader is copied to tt_content.header.10 with the "<" operator. This means that an actual copy of lib.stdheader is created at parsetime.

But this is not the case with tt_content.bullets.10. Here lib.stdheader is just pointed to and lib.stdheader will be used  as the cObject at runtime.

The reason why lib.stdheader was copied in the first case is the fact that it's needed to unset ".stdWrap.space" inside the cObject ("10.stdWrap.space >"). This could NOT be done in the second case where only a pointer is created.

注:

代わりにlib.stdheaderがtemp.stdheaderだった場合、ポインターは動作しない!これは、テンプレートがキャッシュに保存される前は未設定なので、ランタイム・リファレンスは”temp.”で何も見つけないという事実によるものである!

これは”temp.”と”styles.”に向かっていく(トップレベルオブジェクト定義を参照)

なんらかの方法で値をオーバーライドする:

TypoScriopt-styleの値(演算子やその他すべてを使用した)をオーバーライドできないが、リファレンスを持ったオブジェクトのプロパティはリファレンスのコンフィグでマージされる。

例:

page.10 = TEXT
page.10.value = kasper
page.10.case = upper
page.20 = < page.10
page.20.case = lower
page.20.value >
page.20.field = pages

NOTE:

If lib.stdheader was temp.stdheader instead, the pointer would not work! This is due to the fact that the runtime-reference would find nothing in "temp." as this is unset before the template is stored in cache!

This goes for "temp." and "styles." (see the toplevel object definition elsewhere)

Overriding values anyway:

Although you can not override values TypoScript-style (using the operators and all) the properties of the object which has the reference will be merged with the config of the reference.

Example:

page.10 = TEXT
page.10.value = kasper
page.10.case = upper
page.20 = < page.10
page.20.case = lower
page.20.value >
page.20.field = pages

結果は下記コンフィグである:

The result is this config:

これは、2つの配列が結合しただけなので、.valueはクリアされなかった(赤線)ということに留意:

Notice that .value was not cleared (the red line), because it's simply two arrays which are joined:

ゆえに、上記例の赤線は役に立たない。

So hence the red line in the above example is useless.