私は質問を回避していました:「アクション内でinlineScripを取得する方法を知っている場合はお知らせください。」、かなりの解決策を得て、ここに投稿することにしました:
- すべてのインライン スクリプトをグループ化するために他の場所で呼び出される小さなクラスを作成し、layout.phtml テンプレートによってレンダリングされるように適切にフォーマットします。
- 条件付き挿入ポイントを定義して、最終ページに完全なスクリプトを挿入します
(オリジナルのタイプミスのため、コード 04-05-2016 を差し替えます)
<?php
// Filename: /module/MyTools/src/MyTools/Library/Js2ls.php
namespace MyTools\Library;
abstract class Js2l
{
protected static $inLineJs;
protected static $inLineVars;
public static function addSetting($settingkey, $settingvalue)
{
if(!self::isSettingThere($settingkey)){
self::$inLineVars[$settingkey] = $settingvalue;
}
}
public static function addScript($script, $scriptkey=NULL)
{
if(!$scriptkey){
if(!self::$inLineJs){
self::$inLineJs = array();
self::$inLineJs[] = $script;
}elseif(!(in_array($script, self::$inLineJs))){
self::$inLineJs[] = $script;
}
}elseif(!isset(self::$inLineJs[$scriptkey])){
self::$inLineJs[$scriptkey] = $script;
}
}
protected static function appendItemToSetting($current, $item)
{
if($item == $current){ return $current; }
if(is_array($current)){
if(!in_array($item, $current)){
$current[] = $item;
}
return $current;
}else{
return [$current, $item];
}
}
public static function extendSetting($settingkey, $settingvalue)
{
$current = self::getSetting($settingkey);
if($current){
$new = self::appendItemToSetting($current, $settingvalue);
if( $new !== $current){
self::$inLineVars[$settingkey] = $new;
}
}else{
self::addSetting($settingkey, $settingvalue);
}
}
public static function getSetting($settingkey){
if(self::$inLineVars){
$sale = isset(self::$inLineVars[$settingkey]) ? self::$inLineVars[$settingkey] : NULL;
return $sale;
}else{
return NULL;
}
}
public static function getScripts(){
return self::$inLineJs;
}
public static function getSettings(){
return self::$inLineVars;
}
public static function iskeyedArray($array)
{
$out = FALSE;
$keys = array_keys($array);
foreach ($keys as $key) {
if(!is_numeric($key)){
$out = TRUE;
break;
}
}
return $out;
}
protected static function renderInLineJs()
{
return (self::$inLineJs) ? implode("\n", self::$inLineJs) : '';
}
protected static function renderInLineVars($js)
{
$out = '';
if(is_array($js)){
$items = [];
foreach ($js as $key => $value) {
$items[] = '"'.$key .'": '.self::renderJsItem($value);
}
$out .= implode(', ', $items);
}
return $out;
}
protected static function renderJsItem($item)
{
if(is_scalar($item)){
return (is_numeric($item)) ? ''.$item : '"'.$item.'"';
}elseif(is_array($item)){
if(self::iskeyedArray($item)){
return '{'. self::renderInLineVars($item).'}';
}else{
return (count($item)>0) ? '["'.implode('", "', $item).'"]' : '[ ]';
}
}else{
return '[ ]';
}
}
protected static function isSettingThere($settingkey)
{
return ( isset(self::$inLineVars[$settingkey]) ) ? TRUE : FALSE;
}
public static function ToString()
{
$prefix = "\n".'jQuery.extend(MyTools.settings, {';
$suffix = '});'."\n";
$settings = self::renderInLineVars(self::$inLineVars);
$jsSettings = ($settings) ? $prefix.$settings.$suffix: '';
$jsMethods = self::renderInLineJs();
return ($jsMethods) ? $jsSettings."\n".$jsMethods : $jsSettings;
}
}
?>
</code>
Whit this class defined you can add, elsewhere, global variables to be used by your scripts to a global variable using the code:
<code>
<?php
// you are elsewhere in your php code. Write
use MyTools\Library\Js2l
Js2l::addSetting($settingkey, $settingvalue);
// or
Js2l::extendSetting($variablename, $value);
// $settingvalue and $value can be scalar o array values
Js2l::addScript($yourJavaScript, $akeyToAvoidDuplicates);
?>
</code>
The class knows how to format the code so you can call it to be injected in the template
<code>
<?php
// Filename: /module/Application/view/application/layout/layout.phtml
?>
<?php
// place this call before the scripts block
use MyTools\Library\Js2l
$mysript = Js2l::ToString();
if ($mysript){
echo $this->inlineScript()->appendScript($myscript);
}
</code>
これで、インライン スクリプトをオンデマンドで挿入するための便利なクラスができました。