*
* @package Magic3 Framework
* @author 平田直毅(Naoki Hirata) <naoki@aplo.co.jp>
- * @copyright Copyright 2006-2016 Magic3 Project.
+ * @copyright Copyright 2006-2018 Magic3 Project.
* @license http://www.gnu.org/copyleft/gpl.html GPL License
* @version SVN: $Id$
* @link http://www.magic3.org
private $systemHandleMode; // システム制御遷移モード(1=サイト非公開時)
private $isPageEditable; // フロント画面ページ編集可能モード
private $isTransparentMode; // 画面透過モード
+ private $isPersonalMode; // 機能アクセスパーソナルモード
private $isEditMode; // フロント画面編集モード
private $isLayout; // 画面レイアウト中かどうか
private $isPageTopUrl; // ページトップ(サブページ内のトップ位置)のURLかどうか
private $headDescription; // HTMLヘッダ「description」に出力する文字列
private $headKeywords; // HTMLヘッダ「keywords」に出力する文字列
private $headOthers; // HTMLヘッダに出力するタグ文字列
+ private $adminHeadOthers; // HTMLヘッダに出力するタグ文字列(管理画面用)
private $lastHeadTitle; // 最後にヘッダ部titleにセットした文字列
private $lastHeadDescription; // 最後にヘッダ部descriptionにセットした文字列
private $lastHeadKeywords; // 最後にヘッダ部keywordsにセットした文字列
+ private $headFirstTag; // HTMLヘッダに最初に出力するタグ文字列
private $headCss = array(); // HTMLヘッダにCSS出力する文字列
private $headScript = array(); // HTMLヘッダにJavascript出力する文字列
private $headPreMobileScript = array(); // HTMLヘッダにJavascript出力する文字列(jQueryMobile用挿入スクリプト)
private $lastHeadCss; // 最後に設定したHTMLヘッダにCSS出力する文字列
private $lastHeadScript; // 最後に設定したHTMLヘッダにJavascript出力する文字列
private $lastHeadString; // 最後に設定したHTMLヘッダに出力する任意文字列
+ private $headSubTitle = array(); // ヘッダタグサブタイトル
+ private $headSubTitleUrl = array(); // ヘッダサブタイトルのリンク先
+ private $headCanonicalUrl; // カノニカル属性URL
private $initScript = ''; // ウィンドウ初期化時に実行されるスクリプト
private $outputByHtml = true; // HTMLフォーマットで出力するかどうか
+ private $outputByStandardHead; // HTML文書の標準のヘッダタグを出力するかどうか
private $outputHead; // HTMLヘッダ出力を行ったかどうか
private $outputTheme; // jQueryUIテーマ出力を行ったかどうか
private $outputAjaxResponseBody; // AJAX用のレスポンスボディデータかどうか
private $isAbort; // ページ作成処理を中断するかどうか
private $isWidgetAbort; // 各ウィジェット処理を中断するかどうか
private $isRedirect; // リダイレクトするかどうか
+ private $isSystemPage; // システム制御ページを表示するかどうか
private $libFiles; // javascript追加用ライブラリ
private $pageDefRev = 234; // 画面定義のリビジョン番号
- private $headSubTitle = array(); // ヘッダタグサブタイトル
- private $headSubTitleUrl = array(); // ヘッダサブタイトルのリンク先
private $pageInfo; // すべてのページ情報
private $currentPageInfo; // 現在のページのページ情報
private $configWidgetInfo; // ウィジェット設定画面のウィジェットの情報
private $urlParamOrder; // URLパラメータの並び順
private $wysiwygEditor; // 管理画面用WYSIWYGエディター
private $optionTemplateId; // 追加設定するテンプレートID
+ private $optionSubTemplateId; // 追加設定するサブテンプレートID
private $isContentGooglemaps; // コンテンツにGoogleマップが含むかどうか
private $useGooglemaps; // Googleマップを使用するかどうか
private $useBootstrap; // Bootstrapを使用するかどうか
private $ckeditorTemplateType; // CKEditor用のテンプレートタイプ
private $adminSubNavbarDef = array(); // 管理画面用のサブメニューバーの定義
private $adminBreadcrumbDef = array(); // 管理画面用パンくずリスト定義
+ private $adminBreadcrumbDefHelp = array(); // 管理画面用パンくずリストヘルプ定義
const CONFIG_KEY_HEAD_TITLE_FORMAT = 'head_title_format'; // ヘッダ作成用フォーマット
const ADMIN_WIDGET_ID = 'admin_main'; // 管理用ウィジェットのウィジェットID
//const CONTENT_TYPE_WIKI = 'wiki'; // ページのコンテンツタイプ(Wiki)
const WIDGET_ID_TITLE_TAG_END = '}}'; // 遅延実行用タグ(タイトル埋め込み用)
const WIDGET_ID_SEPARATOR = ',';
const HEAD_TAGS = '{{HEAD_TAGS}}'; // HTMLヘッダ出力用タグ
- const MENUBAR_TAGS = '{{MENUBAR_TAGS}}'; // メニューバー出力用タグ
+ const MENUBAR_TAGS = '{{MENUBAR_TAGS}}'; // メニューバー出力用タグ
const MENUBAR_SCRIPT_TAGS = '{{MENUBAR_SCRIPT_TAGS}}'; // メニューバー出力用スクリプトタグ
const WIDGET_ICON_IMG_SIZE = 32; // ウィジェットアイコンサイズ
- const WIDGET_OUTER_CLASS = 'm3_widget_outer'; // ウィジェット外枠クラスクラス
+ const WIDGET_INVISIBLE_CLASS = 'm3invisible'; // 非表示ウィジェットクラス
+ const WIDGET_LOGIN_STATUS_CLASS = 'm3loginstatus'; // ログイン状態連動クラス
+ const WIDGET_OUTER_CLASS = 'm3_widget_outer'; // ウィジェット外枠クラス
const WIDGET_OUTER_CLASS_HEAD_POSITION = 'm3_pos_'; // ウィジェットの外枠クラス用ヘッダ(ポジション表示用)
const WIDGET_OUTER_CLASS_WIDGET_TAG = 'm3_'; // ウィジェットの外枠クラス用ヘッダ(ポジション表示用)
- const WIDGET_INNER_CLASS = 'm3_widget_inner'; // ウィジェットの内側クラス
+// const WIDGET_INNER_CLASS = 'm3_widget_inner'; // ウィジェットの内側クラス
const POSITION_TAG_HEAD = 'm3pos_'; // ポジションの識別用タグIDヘッダ
const WIDGET_TAG_HEAD = 'm3widget_'; // ウィジェットの識別用タグIDヘッダ
// const WIDGET_TAG_HEAD_SHORT = 'm3_'; // ウィジェットの識別用タグIDヘッダ
const CF_GOOGLE_MAPS_KEY = 'google_maps_key'; // Googleマップ利用キー
const CF_CONFIG_WINDOW_OPEN_TYPE = 'config_window_open_type'; // ウィジェット設定画面のウィンドウ表示タイプ(0=別ウィンドウ、1=タブ)
const CF_JQUERY_VERSION = 'jquery_version'; // jQueryバージョン
+ const CF_EXTERNAL_JQUERY = 'external_jquery'; // システム外部のjQueryを使用するかどうか
const CF_WYSIWYG_EDITOR = 'wysiwyg_editor'; // 管理画面用WYSIWYGエディター
const CF_ADMIN_JQUERY_VERSION = 'admin_jquery_version'; // 管理画面用jQueryバージョン
const CF_USE_JQUERY = 'use_jquery'; // jQueryを常に使用するかどうか
const PREV_ICON_FILE = '/images/system/prev48.png'; // ウィンドウ「前へ」アイコン
const NEXT_ICON_FILE = '/images/system/next48.png'; // ウィンドウ「次へ」アイコン
const DEFAULT_READMORE_TITLE = 'もっと読む'; // もっと読むボタンのデフォルトタイトル
- const POS_HEAD_NAV_MENU = '<i class="glyphicon glyphicon-th" rel="m3help" title="ナビゲーションメニュー" data-placement="auto"></i> '; // 特殊ポジションブロック(ナビゲーションメニュー)
- const WIDGET_MARK_MAIN = '<i class="glyphicon glyphicon-tower" rel="m3help" title="メイン型" data-placement="auto"></i> '; // ウィジェットの機能マーク(メイン型ウィジェット)
+ const POS_HEAD_NAV_MENU = '<i class="glyphicon glyphicon-th" rel="m3help" title="ナビゲーションメニュー" data-placement="auto"></i> '; // 特殊ポジションブロック(ナビゲーションメニュー型)
+ const POS_HEAD_MAIN = '<i class="glyphicon glyphicon-stop" rel="m3help" title="メイン型" data-placement="auto"></i> '; // 特殊ポジションブロック(メイン型)
+ const WIDGET_MARK_MAIN = '<i class="glyphicon glyphicon-stop" rel="m3help" title="メイン型" data-placement="auto"></i> '; // ウィジェットの機能マーク(メイン型ウィジェット)
const WIDGET_MARK_NAVMENU = '<i class="glyphicon glyphicon-th" rel="m3help" title="ナビゲーションメニュー" data-placement="auto"></i> '; // ウィジェットの機能マーク(ナビゲーションメニュー)
const WIDGET_FUNCTION_MARK_BOOTSTRAP = ' <span class="label label-warning" rel="m3help" title="Bootstrap型テンプレート対応" data-placement="auto">B</span>'; // ウィジェット機能マーク(Boostrap型テンプレート
+ const WIDGET_FUNCTION_MARK_WORDPRESS = ' <span class="label label-warning" rel="m3help" title="WordPress型テンプレート対応" data-placement="auto">W</span>'; // ウィジェット機能マーク(WordPress型テンプレート
const WIDGET_STYLE_NAVMENU = '_navmenu'; // ウィジェットの表示スタイル(ナビゲーションメニュー)
-
+ const WIDGET_STYLE_WORDPRESS = '_wordpress'; // ウィジェットの表示スタイル(WordPressテンプレート用出力)
+ const WIDGET_STYLE_WORDPRESS_NOTITLE = '_wordpress_notitle'; // ウィジェットの表示スタイル(WordPressテンプレート(タイトルなし)用出力)
+
// アドオンオブジェクト用
const CONTENT_OBJ_ID = 'contentlib'; // 汎用コンテンツオブジェクトID
const BLOG_OBJ_ID = 'bloglib'; // ブログオブジェクトID
const IWIDTET_CMD_CALC = 'calc'; // 計算
// Magic3用スクリプト
- const M3_ADMIN_SCRIPT_FILENAME = 'm3admin1.8.6.js'; // 管理機能用スクリプト(FCKEditor2.6.6、CKEditor4.0.1対応)
- const M3_ADMIN_WIDGET_SCRIPT_FILENAME = 'm3admin_widget2.0.9.js'; // 管理機能(ウィジェット操作)用スクリプト(Magic3 v1.15.0以降)
+ const M3_ADMIN_SCRIPT_FILENAME = 'm3admin2.0.2.js'; // 管理機能用スクリプト(FCKEditor2.6.6、CKEditor4.0.1対応)
+ const M3_ADMIN_WIDGET_SCRIPT_FILENAME = 'm3admin_widget2.0.10.js'; // 管理機能(ウィジェット操作)用スクリプト(Magic3 v1.15.0以降)
const M3_ADMIN_WIDGET_CSS_FILE = '/m3/widget.css'; // 管理機能(ウィジェット操作)用CSSファイル
- const M3_STD_SCRIPT_FILENAME = 'm3std1.5.1.js'; // 一般、管理機能共通スクリプト
-// const M3_PLUS_SCRIPT_FILENAME = 'm3plus1.6.2.js'; // フロント画面追加用スクリプト(FCKEditor2.6.6対応、CKEditor4.0.1対応)
- const M3_OPTION_SCRIPT_FILENAME = 'm3opt1.2.0.js'; // AJAXを含んだオプションライブラリファイル(jQuery必須)
+ const M3_STD_SCRIPT_FILENAME = 'm3std1.5.2.js'; // 一般、管理機能共通スクリプト
+ const M3_OPTION_SCRIPT_FILENAME = 'm3opt1.2.1.js'; // AJAXを含んだオプションライブラリファイル(jQuery必須)
const M3_ADMIN_CSS_FILE = 'm3/admin.css'; // 管理機能用のCSS
const M3_EDIT_CSS_FILE = 'm3/edit.css'; // フロント画面編集用のCSS
const M3_DEFAULT_CSS_FILE = 'm3/default.css'; // フロント画面共通のデフォルトCSS
// デフォルトのWYSIWYGエディターを取得
$this->wysiwygEditor = $gSystemManager->getSystemConfig(self::CF_WYSIWYG_EDITOR); // 管理画面用WYSIWYGエディター
- // ##### jQueryバージョン設定 #####
+ // ##### Javascriptライブラリのバージョン設定 #####
+ // jQueryバージョン設定
// アクセスする画面に応じてjQueryのバージョンを設定
if ($gEnvManager->isAdminDirAccess()){ // 管理画面へのアクセスのとき
$value = $gSystemManager->getSystemConfig(self::CF_ADMIN_JQUERY_VERSION);// 管理画面用jQueryバージョン
- if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET && strStartsWith($widgetId, 'm/')){// 携帯用アクセスポイント用の管理画面の場合はWYSIWYGエディターはFCKEditorに固定
- $this->wysiwygEditor = ScriptLibInfo::LIB_FCKEDITOR; // FCKEditorに固定
- }
-
// 管理画面にBOOTSTRAPを使用するかどうか(初期値)
$this->useBootstrap = self::USE_BOOTSTRAP_ADMIN;
+
+ // CKEditorのバージョン設定
+ // 小画面デバイス最適化の場合は最新バージョンを使用
+ if ($gEnvManager->isSmallDeviceAdmin()) ScriptLibInfo::setCkeditorVer(1/*最新*/);
} else {
$value = $gSystemManager->getSystemConfig(self::CF_JQUERY_VERSION);// jQueryバージョン
}
M3_REQUEST_PARAM_FROM => 18, // メッセージの送信元ウィジェットID
M3_REQUEST_PARAM_VIEW_STYLE => 19, // 表示スタイル
M3_REQUEST_PARAM_FORWARD => 20, // 画面遷移用パラメータ
- M3_REQUEST_PARAM_ADMIN_KEY => 21, // 管理者一時キー
M3_REQUEST_PARAM_OPEN_BY => 22, // ウィンドウの開き方
M3_REQUEST_PARAM_SHOW_HEADER => 23, // ヘッダ部表示制御
M3_REQUEST_PARAM_SHOW_FOOTER => 24, // フッタ部表示制御
}
}
/**
- * HTMLヘッダに出力するタグ文字列を取得
+ * HTMLヘッダに出力するタグ文字列を追加(管理画面用)
*
- * @return string $str 出力文字列
+ * @param string $str 出力文字列
+ * @return なし
*/
-/* function getHeadOthers()
+ function addAdminHeadOthers($str)
{
- return $this->headOthers;
- }*/
+ if (is_string($str) && !empty($str)){
+ // 追加されていない場合のみ追加
+ $pos = strpos($this->adminHeadOthers, $str);
+ if ($pos === false) $this->adminHeadOthers .= $str;
+ }
+ }
/**
* HTMLヘッダ「title」のサブタイトル出力する文字列を設定
*
- * @param string $str 出力文字列
- * @param string $url リンク先
+ * @param string $str 出力文字列
+ * @param string $url リンク先
+ * @param bool $isDefault デフォルト値かどうか
+ * @return なし
*/
- function setHeadSubTitle($str, $url='')
+ function setHeadSubTitle($str = '', $url = '', $isDefault = false)
{
- if (is_string($str) && !empty($str)){
- $this->headSubTitle[] = $str;
- $this->headSubTitleUrl[] = $url;
- $this->lastHeadTitle = $str; // 最後に設定した値を退避
+ // ##### ページのサブタイトルはデフォルトでページのMETAタイトルを使用し、メインウィジェット側で上書きする #####
+
+ static $isUpdated = false; // デフォルト値が更新されているかどうか
+
+ if (!is_string($str) || empty($str)) return;
+
+ // デフォルト値の場合はデータを初期化
+ if ($isDefault){
+ $this->headSubTitle = array();
+ $this->headSubTitleUrl = array();
+ $this->lastHeadTitle = '';
+ $isUpdated = false;
+ } else { // デフォルトでない場合はデータを追加
+ if (!$isUpdated){ // デフォルト値が更新されていない場合は以前のデータを削除
+ $this->headSubTitle = array();
+ $this->headSubTitleUrl = array();
+ $this->lastHeadTitle = '';
+ $isUpdated = true; // デフォルト値は更新された
+ }
}
+ // タイトル追加
+ $this->headSubTitle[] = $str;
+ $this->headSubTitleUrl[] = $url;
+ $this->lastHeadTitle = $str; // 最後に設定した値を退避
}
/**
* HTMLヘッダ「title」のサブタイトル出力する文字列を取得
}
}
/**
- * 外部出力で出力するCSSの文字列を設定
+ * 外部出力で出力するCSSの文字列を設定(ウィジェット共通設定からの設定値)
*
* @param string $css 追加するCSS内容
* @return なし
}
}
/**
+ * HTMLヘッダに最初に出力するタグ文字列を設定
+ *
+ * @param string $str 追加するタグ文字列
+ * @return なし
+ */
+ function setHeadFirstTag($str)
+ {
+ if (!empty($str)) $this->headFirstTag = $str;
+ }
+ /**
+ * ヘッダ部に出力するカノニカル属性URLを設定
+ *
+ * @param string $url URL
+ * @return なし
+ */
+ function setCanonicalUrl($url)
+ {
+ if (!empty($url)) $this->headCanonicalUrl = $url; // カノニカル属性URL
+ }
+ /**
* RSSチャンネル部に出力するデータを設定
*
* @param array $rssData RSSチャンネル部データ
*
* @return bool true=編集モードオン、false=編集モードオフ
*/
- function idEditMode()
+ function isEditMode()
{
return $this->isEditMode;
}
/**
+ * 機能アクセスパーソナルモードを設定
+ *
+ * @return なし
+ */
+ function setPersonalMode()
+ {
+ $this->isPersonalMode = true;
+ }
+ /**
+ * 機能アクセスパーソナルモードを取得
+ *
+ * @return bool true=パーソナルモードオン、false=パーソナルモードオフ
+ */
+ function isPersonalMode()
+ {
+ return $this->isPersonalMode;
+ }
+ /**
* 出力フォーマットがHTMLであるかを設定
*
* @param bool $isHtml HTMLフォーマットかどうか
/**
* 追加設定するテンプレートIDを返す
*
- * @return string テンプレートID
+ * @return array テンプレートID,サブテンプレートIDの配列
*/
function getOptionTemplateId()
{
case M3_VIEW_TYPE_CONTENT: // ページのコンテンツタイプ
// コンテンツ単位のテンプレート設定
$contentLibObj = $this->gInstance->getObject(self::CONTENT_OBJ_ID);
- if (isset($contentLibObj)) $this->optionTemplateId = $contentLibObj->getTemplate();
+ if (isset($contentLibObj)) list($this->optionTemplateId, $this->optionSubTemplateId) = $contentLibObj->getOptionTemplate();
break;
case M3_VIEW_TYPE_BLOG: // ページがブログタイプのとき
if ($pageId == $this->gEnv->getDefaultPageId()){ // PCサイトのとき
// ブログライブラリオブジェクトからテンプレートを取得
$blogLibObj = $this->gInstance->getObject(self::BLOG_OBJ_ID);
- if (isset($blogLibObj)) $this->optionTemplateId = $blogLibObj->getOptionTemplate();
+ if (isset($blogLibObj)) list($this->optionTemplateId, $this->optionSubTemplateId) = $blogLibObj->getOptionTemplate();
}
break;
}
- return $this->optionTemplateId;
+ return array($this->optionTemplateId, $this->optionSubTemplateId);
}
/**
* 使用した非共通ウィジェットの数を取得
function getMainContentTypes()
{
// 「value」値のみ取得
- return array_map(create_function('$a', 'return $a["value"];'), $this->mainContentTypeInfo);
+ //return array_map(create_function('$a', 'return $a["value"];'), $this->mainContentTypeInfo);
+ $types = array_map(function($a){ return $a["value"]; }, $this->mainContentTypeInfo);
+ return $types;
}
/**
* フロント画面で使用するサブコンテンツタイプを取得
function getSubContentTypes()
{
// 「value」値のみ取得
- return array_map(create_function('$a', 'return $a["value"];'), $this->subContentTypeInfo);
+// return array_map(create_function('$a', 'return $a["value"];'), $this->subContentTypeInfo);
+ $types = array_map(function($a){ return $a["value"]; }, $this->subContentTypeInfo);
+ return $types;
}
/**
* フロント画面で使用する主要機能タイプ情報を取得
function getMainFeatureTypes()
{
// 「value」値のみ取得
- return array_map(create_function('$a', 'return $a["value"];'), $this->mainFeatureTypeInfo);
+// return array_map(create_function('$a', 'return $a["value"];'), $this->mainFeatureTypeInfo);
+ $types = array_map(function($a){ return $a["value"]; }, $this->mainFeatureTypeInfo);
+ return $types;
}
/**
* 管理画面用パンくずリスト定義を設定
*
* @param array $def パンくずリスト定義
+ * @param array $help ヘルプ(title,bodyの連想配列)
* @return なし
*/
- function setAdminBreadcrumbDef($def)
+ function setAdminBreadcrumbDef($def, $help = array())
{
$this->adminBreadcrumbDef = $def;
+ if (!empty($help)) $this->adminBreadcrumbDefHelp = $help; // 管理画面用パンくずリストヘルプ定義
}
/**
* 管理画面用パンくずリスト定義を取得
*
- * @return array パンくずリスト定義
+ * @param array $help ヘルプ(title,bodyの連想配列)
+ * @return array パンくずリスト定義
*/
- function getAdminBreadcrumbDef()
+ function getAdminBreadcrumbDef(&$help)
{
+ // パラメータ数を取得
+ $argNum = func_num_args();
+
+ // ヘルプ取得用パラメータが存在する場合は定義を設定
+ if ($argNum > 0) $help = $this->adminBreadcrumbDefHelp;
+
return $this->adminBreadcrumbDef;
}
/**
global $gAccessManager;
global $gSystemManager;
global $gDispManager;
+ global $gOpeLogManager;
// 実行コマンドを取得
$cmd = $request->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND);
}
} else {
// 管理者キーがあればGETまたはPOST値のセッションIDを使用する
- if ($gEnvManager->isAdminDirAccess()){
- if ($gAccessManager->isValidAdminKey()) session_id($gRequestManager->trimValueOf(session_name()));
- }
+// if ($gEnvManager->isAdminDirAccess()){
+// if ($gAccessManager->isValidAdminKey()) session_id($gRequestManager->trimValueOf(session_name()));
+// }
}
// 最終HTML(ページ全体で使用するHTML)の出力
$gAccessManager->setOldSessionId(session_id()); // 古いセッションIDを保存
session_regenerate_id(true);
}
-
+
// セッションからユーザ情報を取得
$userInfo = $gRequestManager->getSessionValueWithSerialize(M3_SESSION_USER_INFO);
+ if (!$gAccessManager->checkSessionSecurity($userInfo)) return; // セキュリティ問題ありの場合はここで終了
+ // ##### ここで終了した場合はページサブIDが未設定のためページ不正のエラーが発生しアクセスエラー画面が表示される #####
+
+ // ##### POST時のリファラーチェック #####
+ // WooCommerceのAJAX処理が通らないのでチェックしない?
+/* if ($gRequestManager->isPostMethod() && !$this->_checkReferer()){
+ $errMsg = '不正なPOSTデータ(リファラー異常)を検出しました。アクセス元IP: ' . $gAccessManager->getClientIp();
+ $msgDetail = 'アクセスをブロックしました。account=' . $userInfo->account . ', userid=' . $userInfo->userId;
+ $gOpeLogManager->writeUserError(__METHOD__, $errMsg, 2210, $msgDetail);
+ return;
+ }*/
+
+ // その他セッション情報取得
+ $gRequestManager->_doSessionOpenEventCallback();
+
+ // ユーザ情報をロード
$gInstanceManager->setUserInfo($userInfo);
// ##### 自動ログイン #####
// デバッグモードの表示
if (M3_SYSTEM_DEBUG) echo 'Debug mode<br />';
+ // ##### ユーザアクセスモードの設定 #####
+ if (!empty($userInfo) && $userInfo->isPersonal()) $this->setPersonalMode(); // パーソナルモードをオン
+/* if (($userInfo->userType == UserInfo::USER_TYPE_MANAGER && $userInfo->userOptType == UserInfo::USER_OPT_TYPE_PAGE_MANAGER)|| // ページ運用者の場合
+ $userInfo->userType < UserInfo::USER_TYPE_MANAGER){ // システム運用者よりも権限が低い場合
+
+ // パーソナルモードをオン
+ $this->setPersonalMode();
+ }*/
+
+ // ##### ページIDの修正 #####
+ // ポジション表示の場合はページID、ページサブIDを再設定。再設定はシステム管理者のみ可能。
+ if (($cmd == M3_REQUEST_CMD_SHOW_POSITION || // 管理画面(ウィジェットなしポジション表示)のとき
+ $cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET) && // 管理画面(ウィジェット付きポジション表示)のとき
+// $gEnvManager->isSystemAdmin()){
+ $gEnvManager->isSystemManageUser()){ // システム運用可能の場合(2018/8/5変更)
+
+ $pageId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_ID);
+ if (empty($pageId)) $pageId = $this->gEnv->getDefaultPageId(); // 値がないときはデフォルトのページIDを設定
+ $this->gEnv->setCurrentPageId($pageId);
+ $subId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_SUB_ID);
+ if (!empty($subId)) $this->gEnv->setCurrentPageSubId($subId);
+ }
+
// ##### サブページIDの設定 #####
if ($gEnvManager->isAdminDirAccess() && // 管理画面へのアクセスのとき
($cmd == M3_REQUEST_CMD_LOGIN || $cmd == M3_REQUEST_CMD_LOGOUT)){ // ログイン、ログアウト場合は管理画面のページサブIDを指定
$subId = $gEnvManager->getAdminDefaultPageSubId(); // 管理画面用のデフォルトページサブID
- } else {
- $subId = $request->trimValueOf(M3_REQUEST_PARAM_PAGE_SUB_ID);// ページサブIDを取得
+ } else {
+ if (empty($subId)) $subId = $request->trimValueOf(M3_REQUEST_PARAM_PAGE_SUB_ID);// ページサブIDを取得
+
if (empty($subId)){ // サブページIDが設定されていないとき
// URLパラメータからコンテンツ形式を取得し、ページを選択
$params = $gRequestManager->getQueryArray();
if ($paramCount == 0){
$this->isPageTopUrl = true; // ページトップ(サブページ内のトップ位置)のURLかどうか
- if ($gEnvManager->isAdminDirAccess() && $gEnvManager->isSystemAdmin() && empty($task)){
- // ダッシュボード機能は、パラメータなし、管理者ディレクトリ、システム管理者の条件で使用可能
+ //if ($gEnvManager->isAdminDirAccess() && $gEnvManager->isSystemAdmin() && empty($task)){
+ if ($gEnvManager->isAdminDirAccess() && $gEnvManager->isSystemManageUser() && empty($task)){
+ // ダッシュボード機能は、パラメータなし、管理者ディレクトリ、システム運用者の条件で使用可能(2018/8/5変更)
// POST値にタスクがある場合はダッシュボードとしない
$subId = $this->db->getSubPageIdWithContent(M3_VIEW_TYPE_DASHBOARD, $gEnvManager->getCurrentPageId());// ページサブIDを取得
}
switch ($firstKey){
case M3_REQUEST_PARAM_CONTENT_ID: // コンテンツIDのとき
case M3_REQUEST_PARAM_CONTENT_ID_SHORT:
+ // ### 値をチェックし不正文字がある場合はエラー画面へ遷移 ###
+ $checkStatus = $this->_checkFirstValueRedirect($firstValue);
+ if (!$checkStatus) return; // エラーの場合は終了
+
// ローカルメニューのURLからページを特定。ページが特定できないときはページ属性で取得。
$url = $gEnvManager->getMacroPath($gEnvManager->getCurrentRequestUri());
$ret = $this->db->getSubPageIdByMenuItemUrl($url, $gEnvManager->getCurrentPageId(), M3_VIEW_TYPE_CONTENT, $rows);
break;
case M3_REQUEST_PARAM_PRODUCT_ID: // 製品IDのとき
case M3_REQUEST_PARAM_PRODUCT_ID_SHORT:
+ // ### 値をチェックし不正文字がある場合はエラー画面へ遷移 ###
+ $checkStatus = $this->_checkFirstValueRedirect($firstValue);
+ if (!$checkStatus) return; // エラーの場合は終了
+
$subId = $this->db->getSubPageIdWithContent(M3_VIEW_TYPE_PRODUCT, $gEnvManager->getCurrentPageId());// ページサブIDを取得
$this->contentType = M3_VIEW_TYPE_PRODUCT; // ページのコンテンツタイプ
case M3_REQUEST_PARAM_BBS_ID_SHORT:
case M3_REQUEST_PARAM_BBS_THREAD_ID:
case M3_REQUEST_PARAM_BBS_THREAD_ID_SHORT:
+ // ### 値をチェックし不正文字がある場合はエラー画面へ遷移 ###
+ $checkStatus = $this->_checkFirstValueRedirect($firstValue);
+ if (!$checkStatus) return; // エラーの場合は終了
+
$subId = $this->db->getSubPageIdWithContent(M3_VIEW_TYPE_BBS, $gEnvManager->getCurrentPageId());// ページサブIDを取得
$this->contentType = M3_VIEW_TYPE_BBS; // ページのコンテンツタイプ
break;
case M3_REQUEST_PARAM_EVENT_ID: // イベント記事のとき
case M3_REQUEST_PARAM_EVENT_ID_SHORT:
+ // ### 値をチェックし不正文字がある場合はエラー画面へ遷移 ###
+ $checkStatus = $this->_checkFirstValueRedirect($firstValue);
+ if (!$checkStatus) return; // エラーの場合は終了
+
$subId = $this->db->getSubPageIdWithContent(M3_VIEW_TYPE_EVENT, $gEnvManager->getCurrentPageId());// ページサブIDを取得
$this->contentType = M3_VIEW_TYPE_EVENT; // ページのコンテンツタイプ
break;
case M3_REQUEST_PARAM_PHOTO_ID: // フォトギャラリー写真のとき
case M3_REQUEST_PARAM_PHOTO_ID_SHORT:
+ // ### 値をチェックし不正文字がある場合はエラー画面へ遷移 ###
+ $checkStatus = $this->_checkFirstValueRedirect($firstValue);
+ if (!$checkStatus) return; // エラーの場合は終了
+
$subId = $this->db->getSubPageIdWithContent(M3_VIEW_TYPE_PHOTO, $gEnvManager->getCurrentPageId());// ページサブIDを取得
$this->contentType = M3_VIEW_TYPE_PHOTO; // ページのコンテンツタイプ
case M3_REQUEST_PARAM_BLOG_ID_SHORT:
case M3_REQUEST_PARAM_BLOG_ENTRY_ID:
case M3_REQUEST_PARAM_BLOG_ENTRY_ID_SHORT:
+ // ### 値をチェックし不正文字がある場合はエラー画面へ遷移 ###
+ $checkStatus = $this->_checkFirstValueRedirect($firstValue);
+ if (!$checkStatus) return; // エラーの場合は終了
+
$subId = $this->db->getSubPageIdWithContent(M3_VIEW_TYPE_BLOG, $gEnvManager->getCurrentPageId());// ページサブIDを取得
$this->contentType = M3_VIEW_TYPE_BLOG; // ページのコンテンツタイプ
break;
case M3_REQUEST_PARAM_ROOM_ID: // ユーザ作成コンテンツのとき
case M3_REQUEST_PARAM_ROOM_ID_SHORT:
+ // ### 値をチェックし不正文字がある場合はエラー画面へ遷移 ###
+ $checkStatus = $this->_checkFirstValueRedirect($firstValue);
+ if (!$checkStatus) return; // エラーの場合は終了
+
$subId = $this->db->getSubPageIdWithContent(M3_VIEW_TYPE_USER, $gEnvManager->getCurrentPageId());// ページサブIDを取得
$this->contentType = M3_VIEW_TYPE_USER; // ページのコンテンツタイプ
}
}
$gEnvManager->setCurrentPageSubId($subId);// サブページIDを設定
-
+
// SSL通信機能がオンの場合は、アクセスされたURLのSSLをチェックし不正の場合は正しいURLにリダイレクト
// 設定に間違いがある場合、管理画面にアクセスできなくなるので、フロント画面のみ制御
// if ($gEnvManager->getUseSsl() || $gEnvManager->getUseSslAdmin()){
// 管理画面用ライブラリを追加
if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET){ // ウィジェット詳細設定画面のとき
+ //if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || $cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE){ // ウィジェット設定画面またはテンプレート設定画面のとき
$this->addAdminScript('', ScriptLibInfo::getWysiwygEditorLibId()); // WYSIWYGエディターを追加
// Googleマップライブラリの読み込み
// $this->addScript('', ScriptLibInfo::LIB_JQUERY_RESPONSIVETABLE);// 管理画面作成用
$this->addScript('', ScriptLibInfo::getWysiwygEditorLibId()); // WYSIWYGエディターを追加
- // $this->addScriptFile(self::M3_PLUS_SCRIPT_FILENAME); // フロント画面追加用スクリプト追加(PLUSライブラリを追加する場合はFCKEditorも使用可能にする)
$this->addScriptFile(self::M3_ADMIN_SCRIPT_FILENAME); // 管理スクリプトライブラリ追加
$this->addScriptFile(self::M3_OPTION_SCRIPT_FILENAME); // Magic3のオプションライブラリ追加
$this->addScript('', ScriptLibInfo::LIB_JQUERY_HOVERINTENT);// HELP用スクリプト追加
if (!empty($row)){
// ショートURLで取得できない場合は、ページコンテンツタイプを取得
if (empty($this->contentType)) $this->contentType = $row['pn_content_type'];
-
+
// 現在のページ情報を設定
$this->currentPageInfo = $row; // 現在のページのページ情報
}
-
- // テンプレートの情報を取得
+
if ($cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){ // 管理画面(ウィジェット付きポジション表示)のとき
- $defPageId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_ID);
+/* $defPageId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_ID);
$defPageSubId = $request->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_SUB_ID);
- $ret = $this->db->getPageDefOnPage($defPageId, $defPageSubId, $rows);
+
+ // デフォルトのページ情報を取得
+ $row = $this->getPageInfo($defPageId, $defPageSubId);
+ if (!empty($row)){
+ // ショートURLで取得できない場合は、ページコンテンツタイプを取得
+ if (empty($this->contentType)) $this->contentType = $row['pn_content_type'];
+
+ // 現在のページ情報を設定
+ $this->currentPageInfo = $row; // 現在のページのページ情報
+ }*/
+
+ // テンプレートの情報を取得
+ // $ret = $this->db->getPageDefOnPage($defPageId, $defPageSubId, $rows);
+ $ret = $this->db->getPageDefOnPage($gEnvManager->getCurrentPageId(), $gEnvManager->getCurrentPageSubId(), $rows);
if ($ret){
for ($i = 0; $i < count($rows); $i++){
$position = $rows[$i]['pd_position_id'];
if ($openBy == 'tabs') $this->isTransparentMode = true; // 画面透過モード
}
/**
+ * URLの最初のパラメータが不正文字の場合はエラー画面へリダイレクト
+ *
+ * @param string $value URLの最初のパラメータ値
+ * @return bool true=正常、false=異常
+ */
+ function _checkFirstValueRedirect($value)
+ {
+ global $gEnvManager;
+ global $gOpeLogManager;
+
+ // 半角英小文字大文字、数字、アンダーバー、ハイフン、カンマのみ使用可能。
+ if (preg_match("/[^0-9a-zA-Z-_,]/", $value)){
+ $errMessage = 'URLパラメータの不正。';
+ $gOpeLogManager->writeUserAccess(__METHOD__, '不正なアクセスを検出しました。' . $errMessage, 2200, 'アクセスをブロックしました。URL: ' . $gEnvManager->getCurrentRequestUri());
+
+ // $this->redirect('?' . M3_REQUEST_PARAM_PAGE_SUB_ID . '=_accessdeny');
+ // システム制御ページへ遷移
+ $this->isSystemPage = true;
+ return false;
+ } else {
+ return true;
+ }
+ }
+ /**
* 言語に依存する情報を取り込む
*
* @return なし
$keyword = $this->currentPageInfo['pn_meta_keywords']; // ページキーワード
$headOthers = $this->currentPageInfo['pn_head_others']; // ヘッダその他タグ
- if (!empty($title)) $this->setHeadSubTitle($title);
+ if (!empty($title)) $this->setHeadSubTitle($title, '', true); // デフォルト値として設定
if (!empty($desc)) $this->setHeadDescription($desc);
if (!empty($keyword)) $this->setHeadKeywords($keyword);
if (!empty($headOthers)) $this->setHeadOthers($headOthers);
$keyword = $row['pn_meta_keywords']; // ページキーワード
$headOthers = $row['pn_head_others']; // ヘッダその他タグ
- if (!empty($title)) $this->setHeadSubTitle($title);
+ if (!empty($title)) $this->setHeadSubTitle($title, '', true); // デフォルト値として設定
if (!empty($desc)) $this->setHeadDescription($desc);
if (!empty($keyword)) $this->setHeadKeywords($keyword);
if (!empty($headOthers)) $this->setHeadOthers($headOthers);
$userInfo = $gInstanceManager->getUserInfo();
$gRequestManager->setSessionValueWithSerialize(M3_SESSION_USER_INFO, $userInfo);
+ // その他セッション情報保存
+ $gRequestManager->_doSessionCloseEventCallback();
+
// 画面設定保存
$gDispManager->save();
// 更新日時
header('Last-Modified: ' . gmdate('D, d M Y H:i:s') . ' GMT');
+ // 文字コード設定
+ header('Content-Type: text/html; charset=UTF-8'); // 2018/4/19 Firefoxで文字化けが起きる場合があるので追加
+
// Ajax用JSON型データをHTTPヘッダに格納
$gInstanceManager->getAjaxManager()->header();
}
$userInfo = $gInstanceManager->getUserInfo();
$gRequestManager->setSessionValueWithSerialize(M3_SESSION_USER_INFO, $userInfo);
+ // その他セッション情報保存
+ $gRequestManager->_doSessionCloseEventCallback();
+
$this->isAbort = true; // ページ作成処理を中断するかどうか
}
/**
* Joomla!v1.5タグを読み込んでウィジェット実行
*
* @param string $srcBuf バッファデータ
- * @param int $templateVer テンプレートバージョン(0=デフォルト(Joomla!v1.0)、-1=携帯用、1=Joomla!v1.5、2=Joomla!v2.5)
+ * @param int $templateVer テンプレートバージョン(99=レイアウト用テンプレート、0=デフォルト(Joomla!v1.0)、-1=携帯用、1=Joomla!v1.5、2=Joomla!v2.5)
* @return string 変換後文字列
*/
function launchWidgetByJoomlaTag($srcBuf, $templateVer)
ob_clean();
$this->getHeader();
$contents = ob_get_contents();
- } else if (strcasecmp($type, 'modules') == 0 ||
- strcasecmp($type, 'module') == 0){ // ポジションタグの場合
+ } else if (strcasecmp($type, 'modules') == 0 || strcasecmp($type, 'module') == 0 || // 一般ウィジェット用配置ブロックの場合
+ strcasecmp($type, 'navmenu') == 0){ // ナビゲーションメニューウィジェット用配置ブロックの場合
$name = ''; // ポジション名
$posType = ''; // ポジションのタイプ
$style = ''; // 表示スタイル
$name = $value;
$attr['name'] = $value;
}
- $value = $paramArray['type']; // ポジションのタイプ
+ $value = $paramArray['type']; // 配置ブロックのタイプを属性に格納。テンプレート内での参照用。
if (isset($value)){
$posType = $value;
$attr['type'] = $value;
if (!empty($name)){ // ポジション名が取得できたとき
// Joomla!では、テンプレートの「jdoc:include」タグの属性styleが空のときは「none」で処理される
// Joomla!デフォルトで設定可能なのは「none,table,horz,xhtml,rounded,outline」
-/* if (empty($style)){
- if (strStartsWith($name, 'user') || // ナビゲーションメニュー位置の場合
- strcasecmp($name, 'position-1') == 0){ // Joomla!v2.5テンプレート対応
- $style = self::WIDGET_STYLE_NAVMENU; // デフォルトはナビゲーション型
- } else {
- $style = 'none';
- }
- }*/
-// if (strStartsWith($name, 'user') || // ナビゲーションメニュー位置の場合
- if (strcasecmp($name, 'user3') == 0 || // ナビゲーションメニュー位置の場合
- strcasecmp($name, 'position-1') == 0 || // Joomla!v2.5テンプレート対応
- strcasecmp($posType, 'hmenu') == 0){ // Joomla!v3テンプレート対応
+ // 配置ブロックがナビゲーション型に固定されていない場合はテンプレートの種類によってナビゲーションかどうかを判断
+ if (strcasecmp($type, 'navmenu') == 0){ // メニューウィジェット用配置ブロックの場合
$style = self::WIDGET_STYLE_NAVMENU; // デフォルトはナビゲーション型
- } else if (empty($style)){
- $style = 'none';
+ $attr['type'] = $type; // テンプレート内での参照用
+ } else {
+ switch ($templateVer){
+ case 0: // デフォルトテンプレート(Joomla!v1.0)
+ case 1: // Joomla!v1.5
+ case 2: // Joomla!v2.5
+ case 10: // Bootstrap v3.0
+ default:
+ if (strcasecmp($name, 'user3') == 0 || // ナビゲーションメニュー位置の場合
+ strcasecmp($name, 'position-1') == 0 || // Joomla!v2.5テンプレート対応
+ strcasecmp($posType, 'hmenu') == 0){ // Joomla!v3テンプレート対応
+ $style = self::WIDGET_STYLE_NAVMENU; // デフォルトはナビゲーション型
+ }
+ break;
+ case 99: // レイアウト用テンプレート
+ global $gRequestManager;
+ static $templateType; // レイアウト用テンプレートタイプを一度だけ取得
+ static $templateGenerator;
+
+ if (!isset($templateType)){
+ $templateType = 99;
+
+ // レイアウト用テンプレートの場合は対象とするテンプレートの情報を取得して判断する
+ $pageId = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_ID);
+ $pageSubId = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_SUB_ID);
+
+ // ページ用個別に設定されたテンプレートがある場合は取得
+ $curTemplate = '';
+ $line = $this->getPageInfo($pageId, $pageSubId);
+ if (!empty($line)) $curTemplate = $line['pn_template_id'];
+
+ // 取得できなければデフォルトを取得
+ if (empty($curTemplate)){
+ if ($pageId == $this->gEnv->getDefaultPageId()){ // 通常サイトのとき
+ $curTemplate = $this->gSystem->defaultTemplateId();
+ } else if ($pageId == $this->gEnv->getDefaultSmartphonePageId()){ // スマートフォン用サイトのとき
+ $curTemplate = $this->gSystem->defaultSmartphoneTemplateId(); // スマートフォン用デフォルトテンプレート
+ }
+ }
+
+ // テンプレートのタイプを取得
+ $ret = $this->db->getTemplate($curTemplate, $row);
+ if ($ret){
+ $templateType = $row['tm_type'];
+ $templateGenerator = $row['tm_generator'];
+ }
+ }
+
+ if ($templateType != 99){
+ // Themlerテンプレート場合は配置ポジション名が「hmenu」をナビゲーション型とする
+ if ($templateGenerator == 'themler'){
+ if (strcasecmp($name, 'hmenu') == 0){ // Joomla!v3テンプレート対応
+ $style = self::WIDGET_STYLE_NAVMENU; // デフォルトはナビゲーション型
+ }
+ } else {
+ if (strcasecmp($name, 'user3') == 0 || // ナビゲーションメニュー位置の場合
+ strcasecmp($name, 'position-1') == 0){ // Joomla!v2.5テンプレート対応
+ $style = self::WIDGET_STYLE_NAVMENU; // デフォルトはナビゲーション型
+ }
+ }
+ }
+ break;
+ }
}
+ if (empty($style)) $style = 'none';
+
// ウィジェットの出力を取得
$contents = $this->getContents($name, $style, $templateVer, $attr);
}
*/
function lateLaunchWidget($request, $srcBuf)
{
+ static $render; // HTML生成オブジェクト
global $gEnvManager;
global $gErrorManager;
global $gDesignManager;
// ウィジェットヘッダ(Joomla!1.0用)を出力のタイプを取得
$widgetHeaderType = $this->getTemplateWidgetHeaderType();
-
+
+ // テンプレートタイプ取得
+ $templateVer = $gEnvManager->getCurrentTemplateType();
+
// 遅延実行ウィジェットをインデックス順にソート
asort($this->lateLaunchWidgetList, SORT_NUMERIC);
$srcContents = ob_get_contents();
ob_end_clean();
+ // ### テンプレート側のウィジェット生成処理使える場合はウィジェットの出力と入れ替える ###
+ // ### 先のrequire($widgetIndexFile)で必要なデータは作成されている ###
+ if ($templateVer >= 1 && $templateVer < 100){ // Joomla!v1.5,v2.5テンプレートのとき
+ $widgetType = $pageDefRec['wd_type']; // ウィジェットタイプ
+ if ($widgetType == 'breadcrumb'){ // パンくずリスト
+ // 描画オブジェクト作成
+ if (!isset($render)) $render = new JRender();
+
+ $templateContents = $render->getBreadcrumbContents('', '', '', array(), array(), $pageDefRec, $templateVer); // テンプレートバージョンのみ必要
+ if (!empty($templateContents)) $srcContents = $templateContents;
+ }
+ }
+
// ウィジェットの出力を取得
$tag = self::WIDGET_ID_TAG_START . $widgetId . self::WIDGET_ID_SEPARATOR . $maxNo . self::WIDGET_ID_TAG_END;
$destBuf = str_replace($tag, $srcContents, $destBuf);
// ##### ヘッダ部分の置換 #####
if ($this->outputHead){ // HTMLヘッダ出力を行っているとき
+ $replaceStr = '';
+
+ // HTMLヘッダに最初に出力するタグ文字列がある場合は追加
+ if (!empty($this->headFirstTag)) $replaceStr .= $this->headFirstTag;
+
+ // METAタグcharset等のHTML文書の標準のヘッダタグを出力
+ if ($this->outputByStandardHead) $replaceStr .= $this->getStandardHead();
+
// タグ変換用文字列の取得
- $replaceStr = $this->getHeaderOutput();
+ $replaceStr .= $this->getHeaderOutput();
// HTMLヘッダのデータ埋め込み
$destBuf = str_replace(self::HEAD_TAGS, $replaceStr, $destBuf);
return $destBuf;
}
/**
+ * ヘッダ部マクロ変換を有効にする
+ *
+ * @return なし
+ */
+ function enableReplaceHead()
+ {
+ $this->outputHead = true;
+ }
+ /**
* ウィジェット検索モードの場合のページサブIDの設定
*
* @param RequestManager $request HTTPリクエスト処理クラス
* startWidget(),endWidget()は、以下のコマンドを処理する
* ・M3_REQUEST_CMD_SHOW_WIDGET(ウィジェットの単体表示)
* ・M3_REQUEST_CMD_CONFIG_WIDGET(ウィジェット設定画面)
+ * ・M3_REQUEST_CMD_CONFIG_TEMPLATE(テンプレート設定画面)
* ・M3_REQUEST_CMD_DO_WIDGET(ウィジェット単体実行)
* Widgetの出力方法は、以下のパターンがある
* ・HTMLヘッダ付加 - Widget単体で画面出力するためにHTMLヘッダを付加するパターン
$openBy = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_OPEN_BY); // ウィンドウオープンタイプ
$task = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_OPERATION_TASK);
-// $isHtml5 = false; // HTML5で出力するかどうか
$tempVer = $gEnvManager->getCurrentTemplateType(); // テンプレートタイプを取得(0=デフォルト(Joomla!v1.0),1=Joomla!v1.5,2=Joomla!v2.5)
if (intval($tempVer) >= 2) $this->isHtml5 = true; // HTML5で出力するかどうか
// HTMLのヘッダ部(headタグ内)出力
$this->getHeader();
- // 現在のウィジェットを取得
- $widgetId = $gEnvManager->getCurrentWidgetId(); // カレントのウィジェットID
+ // ##### 作成対象がウィジェットの場合とテンプレートの場合に分ける #####
+ if ($cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE){ // テンプレート設定画面の場合
+ $templateId = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_TEMPLATE_ID);// テンプレートID
+ } else {
+ // 現在のウィジェットを取得
+ $widgetId = $gEnvManager->getCurrentWidgetId(); // カレントのウィジェットID
+ }
// URLを作成
if ($gEnvManager->getUseSslAdmin()){
// ##### テンプレートのCSSの読み込み #####
// テンプレートは管理用テンプレートに固定されている
- if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || // ウィジェット設定のとき
+ //if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || // ウィジェット設定のとき
+ if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || $cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE || // ウィジェット設定画面またはテンプレート設定画面のとき
($cmd == M3_REQUEST_CMD_DO_WIDGET && !empty($openBy) && $gEnvManager->isContentEditableUser())){ // ウィジェット単体実行でウィンドウを持つ場合の追加スクリプト
$curTemplateUrl = $templatesUrl . '/' . $gEnvManager->getCurrentTemplateId();
if ($this->isHtml5){
}
// ##### スクリプト用出力用タグを埋め込む #####
// ウィジェット設定画面用メニューバーの作成
- if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || ($cmd == M3_REQUEST_CMD_DO_WIDGET && $this->isEditMode)){ // ウィジェット設定画面またはフロント画面編集モードのとき
+ if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || $cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE || // ウィジェット設定画面またはテンプレート設定画面のとき
+ ($cmd == M3_REQUEST_CMD_DO_WIDGET && $this->isEditMode)){ // ウィジェット設定画面またはフロント画面編集モードのとき
echo self::MENUBAR_SCRIPT_TAGS; // メニューバー出力用タグ
}
+ // ##### 作成対象がウィジェットの場合とテンプレートの場合に分ける #####
// ウィジェットのタイトルを設定
- $title = $row['wd_name'];
- if (empty($title)) $title = $row['wd_id'];
- $gEnvManager->setCurrentWidgetTitle($title);
- echo '<title>' . self::WIDGET_TITLE_START . htmlspecialchars($title) . self::WIDGET_TITLE_END . '</title>' . M3_NL;
+ if ($cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE){ // テンプレート設定画面の場合
+ $title = self::WIDGET_TITLE_START . 'テンプレート' . self::WIDGET_TITLE_END . ' ' . $templateId;
+ $gEnvManager->setCurrentWidgetTitle($title);
+ echo '<title>' . htmlspecialchars($title) . '</title>' . M3_NL;
+ } else {
+ $title = $row['wd_name'];
+ if (empty($title)) $title = $row['wd_id'];
+ $gEnvManager->setCurrentWidgetTitle($title);
+ echo '<title>' . self::WIDGET_TITLE_START . htmlspecialchars($title) . self::WIDGET_TITLE_END . '</title>' . M3_NL;
+ }
echo '</head>' . M3_NL;
+
// タブでウィンドウを開く場合は背景を透過モードにする
if ($this->isTransparentMode){
echo '<body style="background-color:transparent;">' . M3_NL;
echo '<body>' . M3_NL;
}
// ウィジェット設定画面用メニューバーの作成
- if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || ($cmd == M3_REQUEST_CMD_DO_WIDGET && $this->isEditMode)){ // ウィジェット設定画面またはフロント画面編集モードのとき
+ if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || $cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE || // ウィジェット設定画面またはテンプレート設定画面のとき
+ ($cmd == M3_REQUEST_CMD_DO_WIDGET && $this->isEditMode)){ // ウィジェット設定画面またはフロント画面編集モードのとき
// ウィジェット情報を設定
$desc = $row['wd_description']; // 説明
$gEnvManager->setCurrentWidgetParams('desc', $desc);
// 別ウィンドウで表示のときは、「閉じる」ボタンを表示
if ($cmd == M3_REQUEST_CMD_SHOW_WIDGET || // ウィジェットの単体表示のとき
- $cmd == M3_REQUEST_CMD_CONFIG_WIDGET || // ウィジェット詳細設定画面のとき
+ $cmd == M3_REQUEST_CMD_CONFIG_WIDGET || $cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE || // ウィジェット設定画面またはテンプレート設定画面のとき
($cmd == M3_REQUEST_CMD_DO_WIDGET && $this->isEditMode)){ // ウィジェット単体実行でフロント画面編集モードのとき
// if ($this->isEditMode){// フロント画面編集モードのとき
'" alt="' . $titleStr . '" title="' . $titleStr . '" rel="m3help" /></a></div>' . M3_NL;
// }
}
-// echo '<div class="row">' . M3_NL;
echo '<!-- Widget Start -->' . M3_NL;
}
/**
* startWidget(),endWidget()は、以下のコマンドを処理する
* ・M3_REQUEST_CMD_SHOW_WIDGET(ウィジェットの単体表示)
* ・M3_REQUEST_CMD_CONFIG_WIDGET(ウィジェット設定画面)
+ * ・M3_REQUEST_CMD_CONFIG_TEMPLATE(テンプレート設定画面)
* ・M3_REQUEST_CMD_DO_WIDGET(ウィジェット単体実行)
*
* @param string $cmd 起動コマンド
// ##### 初期処理 #####
$replaceStr .= '$(function(){' . M3_NL;
// トップ位置修正
- if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || ($cmd == M3_REQUEST_CMD_DO_WIDGET && $this->isEditMode)){ // ウィジェット設定画面またはフロント画面編集モードのとき
+ if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || $cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE || // ウィジェット設定画面またはテンプレート設定画面のとき
+ ($cmd == M3_REQUEST_CMD_DO_WIDGET && $this->isEditMode)){ // フロント画面編集モードのとき
if (!empty($this->adminSubNavbarDef) || !empty($this->adminBreadcrumbDef)){
$menubarHeight = $gDesignManager->getSubMenubarHeight();
$replaceStr .= str_repeat(M3_INDENT_SPACE, 1) . '$("nav.secondlevel").css("margin-top", "0");' . M3_NL;
$destContent = str_replace(self::MENUBAR_SCRIPT_TAGS, $replaceStr, $destContent);
echo $destContent;// 変換したコンテンツを出力
-// echo '</div>' . M3_NL; // row
echo '<!-- Widget End -->' . M3_NL;
- // ##### ウィジェットからの指定による処理 #####
-/* if ($this->updateParentWindow){ // 親ウィンドウ再描画のとき
- echo '<script type="text/javascript">' . M3_NL;
- echo '//<![CDATA[' . M3_NL;
- echo '$(function(){' . M3_NL;
- if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET){ // ウィジェット詳細設定画面のとき
- echo str_repeat(M3_INDENT_SPACE, 1) . 'm3UpdateParentWindowByConfig(' . $this->updateDefSerial . ');' . M3_NL;// 更新する項目のページ定義シリアル番号
- } else if ($cmd == M3_REQUEST_CMD_DO_WIDGET){ // ウィジェット単体実行のとき
- echo str_repeat(M3_INDENT_SPACE, 1) . 'm3UpdateParentWindow();' . M3_NL;
- }
- echo '});' . M3_NL;
- echo '//]]>' . M3_NL;
- echo '</script>' . M3_NL;
- }*/
-
// Bootstrap用のタグ出力
if ($this->useBootstrap) echo '</div>' . M3_NL;
$docTypeStr = '<!DOCTYPE html PUBLIC "-//J-PHONE//DTD XHTML Basic 1.0 Plus//EN" "xhtml-basic10-plus.dtd">';
}
}
- if ($gEnvManager->getIsMobileSite()){ // 携帯用サイトへのアクセスの場合
- echo '<?xml version="1.0" encoding="' . $gEnvManager->getMobileCharset() . '" ?>' . M3_NL;
- } else {
- echo '<?xml version="1.0" encoding="' . M3_HTML_CHARSET . '" ?>' . M3_NL;
- }
+ echo '<?xml version="1.0" encoding="' . M3_HTML_CHARSET . '" ?>' . M3_NL;
if (empty($docTypeStr)) $docTypeStr = '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">';
echo $docTypeStr . M3_NL;
}
*/
function getHeader()
{
+ // ヘッダタグ変換の設定
+ $this->outputHead = true; // HTMLヘッダ出力を行ったかどうか
+ $this->outputByStandardHead = true; // HTML文書の標準のヘッダタグを出力するか
+
+ // ##### Magic3システムで必要なヘッダ出力用のタグを埋め込む #####
+ echo self::HEAD_TAGS; // HTMLヘッダの埋め込みデータ
+ }
+ /**
+ * HTML文書の標準のヘッダタグを出力
+ *
+ * @return string 標準ヘッダ文字列
+ */
+ function getStandardHead()
+ {
global $gEnvManager;
global $gRequestManager;
-
- $this->outputHead = true; // HTMLヘッダ出力を行ったかどうか
+
+ $headStr = ''; // ヘッダ文字列;
// 実行コマンドを取得
$cmd = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND);
- // ######### 携帯用サイトの場合は別にヘッダを作成する #########
- if ($gEnvManager->getIsMobileSite()){
- // キャラクターセット
- echo '<meta http-equiv="Content-Type" content="application/xhtml+xml; charset=' . $gEnvManager->getMobileCharset() . '" />' . M3_NL;
-
- // キャッシュを保存させない
- echo '<meta http-equiv="Pragma" content="no-cache" />' . M3_NL;
- echo '<meta http-equiv="Cache-Control" content="no-cache" />' . M3_NL;
- echo '<meta http-equiv="Expires" content="-1" />' . M3_NL;
+ if ($gEnvManager->getIsSmartphoneSite()){ // スマートフォン用サイトのときはHTML5で設定
+ $this->isHtml5 = true;
+ } else {
+ $tempVer = $gEnvManager->getCurrentTemplateType(); // テンプレートタイプを取得(0=デフォルト(Joomla!v1.0),1=Joomla!v1.5,2=Joomla!v2.5)
+ if (intval($tempVer) >= 2) $this->isHtml5 = true;
+ }
- // サイト構築エンジン
- echo '<meta name="generator" content="' . M3_SYSTEM_NAME . ' ver.' . M3_SYSTEM_VERSION . ' - ' . M3_SYSTEM_DESCRIPTION . '" />' . M3_NL;
- } else { // PC用サイト、管理用サイト、スマートフォン用サイトのとき
-// $isHtml5 = false; // HTML5で出力するかどうか
- if ($gEnvManager->getIsSmartphoneSite()){ // スマートフォン用サイトのときはHTML5で設定
- $this->isHtml5 = true;
- } else {
- $tempVer = $gEnvManager->getCurrentTemplateType(); // テンプレートタイプを取得(0=デフォルト(Joomla!v1.0),1=Joomla!v1.5,2=Joomla!v2.5)
- if (intval($tempVer) >= 2) $this->isHtml5 = true;
- }
-
- // ********** メタタグの設定 **********
-
- // キャラクターセット
- //if ($gEnvManager->getIsSmartphoneSite()){ // スマートフォン用サイトのときはHTML5で設定
- if ($this->isHtml5){
- //echo '<meta http-equiv="content-type" content="text/html; charset=' . M3_HTML_CHARSET .'" />' . M3_NL;
- echo '<meta charset="' . M3_HTML_CHARSET . '">' . M3_NL;
- } else {
- echo '<meta http-equiv="content-script-type" content="text/javascript" />' . M3_NL;
- echo '<meta http-equiv="content-style-type" content="text/css" />' . M3_NL;
- echo '<meta http-equiv="content-type" content="application/xhtml+xml; charset=' . M3_HTML_CHARSET .'" />' . M3_NL;
- }
+ // キャラクターセット
+ if ($this->isHtml5){
+ $headStr .= '<meta charset="' . M3_HTML_CHARSET . '">' . M3_NL;
+ } else {
+ $headStr .= '<meta http-equiv="content-script-type" content="text/javascript" />' . M3_NL;
+ $headStr .= '<meta http-equiv="content-style-type" content="text/css" />' . M3_NL;
+ $headStr .= '<meta http-equiv="content-type" content="application/xhtml+xml; charset=' . M3_HTML_CHARSET .'" />' . M3_NL;
+ }
+ if ($gEnvManager->isAdminDirAccess()){ // 管理画面へのアクセスのとき
+ // Bootstrapで必要なMETAタグを追加
+ $headStr .= '<meta name="viewport" content="width=device-width, initial-scale=1">' . M3_NL;
+ }
- // 基準ディレクトリの指定
- if ($cmd == M3_REQUEST_CMD_SHOW_POSITION || // 表示位置を表示するとき
- $cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){ // 表示位置を表示するとき(ウィジェット付き)
-
- if ($gEnvManager->getUseSslAdmin()){
- $rootUrl = $gEnvManager->getSslRootUrl();
- } else {
- $rootUrl = $gEnvManager->getRootUrl();
- }
- echo '<base href="' . $rootUrl . '/" />' . M3_NL;
+ // 基準ディレクトリの指定
+ if ($cmd == M3_REQUEST_CMD_SHOW_POSITION || // 表示位置を表示するとき
+ $cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){ // 表示位置を表示するとき(ウィジェット付き)
+
+ if ($gEnvManager->getUseSslAdmin()){
+ $rootUrl = $gEnvManager->getSslRootUrl();
+ } else {
+ $rootUrl = $gEnvManager->getRootUrl();
}
+ $headStr .= '<base href="' . $rootUrl . '/" />' . M3_NL;
}
- echo self::HEAD_TAGS; // HTMLヘッダの埋め込みデータ
+ return $headStr;
}
/**
* HTMLヘッダ出力文字列の取得
$this->addAdminScript('', ScriptLibInfo::LIB_BOOTSTRAP); // 管理画面でBootstrapを使用するかどうか
if ($cmd != M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){ // 管理画面(ウィジェット付きポジション表示)以外のとき
$this->addAdminScript('', ScriptLibInfo::LIB_BOOTSTRAP_ADMIN); // Bootstrap管理画面オプション
+ } else {
+ // テンプレートタイプが管理画面のBootstrapバージョン(v3.0)と異なる場合はBootstrapを使用しない場合の管理機能用スクリプトを読み込む
+ $templateType = $gEnvManager->getCurrentTemplateType();
+ if ($templateType != 10) $this->addAdminScript('', ScriptLibInfo::LIB_NOBOOTSTRAP); // Bootstrapを使用しない場合の管理機能用スクリプト
}
} else { // ログインしていない場合(ログイン画面等)
$this->addPermittedAdminScript(ScriptLibInfo::LIB_BOOTSTRAP);
}
} else { // フロント画面へのアクセスの場合
// ### Bootstrapのjsとcssはテンプレート側で読み込む ###
-// $this->addScript('', ScriptLibInfo::LIB_BOOTSTRAP); // Bootstrapライブラリ
- if ($cmd == M3_REQUEST_CMD_LOGIN || $cmd == M3_REQUEST_CMD_LOGOUT || $cmd == M3_REQUEST_CMD_PREVIEW || // ログイン、ログアウト場合
+ // ### フロントからプレビューコマンドでログイン画面を表示させるパターンがあるので注意 ###
+// if ($cmd == M3_REQUEST_CMD_LOGIN || $cmd == M3_REQUEST_CMD_LOGOUT || $cmd == M3_REQUEST_CMD_PREVIEW || // ログイン、ログアウト場合
+ if ($cmd == M3_REQUEST_CMD_LOGIN || $cmd == M3_REQUEST_CMD_LOGOUT || ($cmd == M3_REQUEST_CMD_PREVIEW && !$gEnvManager->isCurrentUserLogined()) || // ログイン、ログアウト場合
($cmd == M3_REQUEST_CMD_DO_WIDGET && !empty($openBy) && $gEnvManager->isContentEditableUser())){ // ウィジェット単体実行でウィンドウを持つ場合の追加スクリプト
+
$this->addScript('', ScriptLibInfo::LIB_BOOTSTRAP_ADMIN); // Bootstrap管理画面オプション
+ } else {
+ if ($gEnvManager->isSystemManageUser() || // システム運用権限がある場合
+ $gEnvManager->isContentEditableUser()){ // 投稿ユーザの場合
+ // テンプレートタイプが管理画面のBootstrapバージョン(v3.0)と異なる場合はBootstrapを使用しない場合の管理機能用スクリプトを読み込む
+ $templateType = $gEnvManager->getCurrentTemplateType();
+ if ($templateType != 10) $this->addScript('', ScriptLibInfo::LIB_NOBOOTSTRAP); // Bootstrapを使用しない場合の管理機能用スクリプト
+ }
}
}
} else {
$titleCount = count($this->headSubTitle);
if ($titleCount > 0) $title = $this->headSubTitle[$titleCount -1]; // サブタイトルが設定されている場合は変更
$replaceStr .= '<title>' . htmlspecialchars($title) . '</title>' . M3_NL;
+
+ // その他HTMLヘッダに出力するタグ文字列
+ if (!empty($this->adminHeadOthers)){
+ // マクロを変換
+ $this->adminHeadOthers = $gInstanceManager->getTextConvManager()->convContentMacro($this->adminHeadOthers, false/*改行コードをbrタグに変換しない*/, array(), true/*変換後の値はHTMLエスケープ処理する*/);
+ $replaceStr .= $this->adminHeadOthers . M3_NL;
+ }
} else { // 管理画面以外の画面へのアクセスの場合
// 画面タイトル
$titleItemCount = 0; // タイトル項目数
// サイト構築エンジン
$replaceStr .= '<meta name="generator" content="' . M3_SYSTEM_NAME . ' ver.' . M3_SYSTEM_VERSION . ' - ' . M3_SYSTEM_DESCRIPTION . '" />' . M3_NL;
- // Faviconの読み込み
+ // カノニカル属性、Faviconの読み込み
$templateId = $gEnvManager->getCurrentTemplateId();
if ($gEnvManager->isAdminDirAccess()){ // 管理画面へのアクセスのとき
// テンプレートのFaviconがない場合はシステムのデフォルトのFaviconを使用
}
}
} else {
+ // カノニカル属性
+ if (!empty($this->headCanonicalUrl)) $replaceStr .= '<link rel="canonical" href="' . convertUrlToHtmlEntity($this->headCanonicalUrl) .'" />' . M3_NL; // カノニカル属性URL
+
+ // Favicon
$faviconPath = $gEnvManager->getTemplatesPath() . '/' . $templateId . self::DEFAULT_FAVICON_FILE;
if (file_exists($faviconPath)){ // ファイルが存在しているとき
$faviconFile = $templatesUrl . '/' . $templateId . self::DEFAULT_FAVICON_FILE;
// Googleマップライブラリの読み込み
if ($this->useGooglemaps && $this->isContentGooglemaps) $this->addScriptFile(ScriptLibInfo::getScript(ScriptLibInfo::LIB_GOOGLEMAPS)); // コンテンツにGoogleマップが含むかどうか
+ $useExternalJquery = $gSystemManager->getSystemConfig(self::CF_EXTERNAL_JQUERY); // システム外部のjQueryを使用するかどうか
+
$count = count($this->defaultScriptFiles);
for ($i = 0; $i < $count; $i++){
$defaultScriptFile = $this->defaultScriptFiles[$i];
+
+ // 外部のjQueryを使用する場合はSCRIPTタグを出力しない
+ if ($defaultScriptFile == $this->selectedJQueryFilename && $useExternalJquery) continue;
// ##### jQueryMobileスクリプトを追加する場合は直前に初期化スクリプトを追加 #####
if ($defaultScriptFile == $this->selectedJQueryMobileFilename){
$replaceStr .= '<script type="text/javascript" src="' . convertUrlToHtmlEntity($scriptURL) . '"></script>' . M3_NL;
}
- if ($cmd == M3_REQUEST_CMD_LOGIN || $cmd == M3_REQUEST_CMD_LOGOUT || $cmd == M3_REQUEST_CMD_PREVIEW){ // ログイン、ログアウト場合
+ // ### フロントからプレビューコマンドでログイン画面を表示させるパターンがあるので注意 ###
+// if ($cmd == M3_REQUEST_CMD_LOGIN || $cmd == M3_REQUEST_CMD_LOGOUT || $cmd == M3_REQUEST_CMD_PREVIEW){ // ログイン、ログアウト場合
+ if ($cmd == M3_REQUEST_CMD_LOGIN || $cmd == M3_REQUEST_CMD_LOGOUT || ($cmd == M3_REQUEST_CMD_PREVIEW && !$gEnvManager->isCurrentUserLogined())){ // ログイン、ログアウト場合
// 管理権限なしで管理ディレクトリアクセスで必要なスクリプトを読み込む
$count = count($this->defaultAdminDirScriptFiles);
for ($i = 0; $i < $count; $i++){
}
}
}
+
+ // ***** [WordPressテンプレート] jQueryの読み込み後、ヘッダ部に出力するテンプレート用のJavascriptがあれば読み込む *****
+ $headData = $this->gEnv->getWpHeadScriptsData();
+ if (!empty($headData)) $replaceStr .= $headData;
}
// ##### ウィジェットごとのJavaScript読み込み #####
// スクリプトがあるウィジェットを取得
// Googleマップライブラリの読み込み
if ($this->useGooglemaps){
$replaceStr .= 'var M3_USE_GOOGLEMAPS = true;' . M3_NL;
+
+ // CKEditor拡張プラグイン用の定義
+ $googleMapsKey = $this->gSystem->getSystemConfig(self::CF_GOOGLE_MAPS_KEY); // Googleマップ利用キー
+ if (!empty($googleMapsKey)) $replaceStr .= 'var M3_GOOGLEMAPS_KEY="' . $googleMapsKey . '";' . M3_NL; // システムルートURL
} else {
$replaceStr .= 'var M3_USE_GOOGLEMAPS = false;' . M3_NL;
}
+ // 起動がパーソナルモードかどうか
+ if ($this->isPersonalMode){
+ $replaceStr .= 'var M3_PERSONAL_MODE = true;' . M3_NL;
+ } else {
+ $replaceStr .= 'var M3_PERSONAL_MODE = false;' . M3_NL;
+ }
+ // 管理画面の小画面デバイス最適化を行うかどうか
+ if ($gEnvManager->isSmallDeviceAdmin()){
+ $replaceStr .= 'var M3_SMALL_DEVICE_OPTIMIZE = true;' . M3_NL;
+ } else {
+ $replaceStr .= 'var M3_SMALL_DEVICE_OPTIMIZE = false;' . M3_NL;
+ }
+
// ウィジェット詳細設定画面専用のJavaScriptグローバル変数
if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET){
+ //if ($cmd == M3_REQUEST_CMD_CONFIG_WIDGET || $cmd == M3_REQUEST_CMD_CONFIG_TEMPLATE){ // ウィジェット設定画面またはテンプレート設定画面のとき
// ##### CKEditor用の設定 #####
$replaceStr .= 'var M3_CONFIG_WIDGET_DEVICE_TYPE = ' . $this->configWidgetInfo['wd_device_type'] . ';' . M3_NL; // ウィジェット設定画面のウィジェットの端末タイプ
if (!empty($this->ckeditorCssFiles)){
// 編集エリア用のCSSファイルを追加
$this->ckeditorCssFiles[] = $scriptsUrl . '/' . self::M3_CKEDITOR_CSS_FILE;
+ //array_unshift($this->ckeditorCssFiles, $scriptsUrl . '/' . self::M3_CKEDITOR_CSS_FILE);
- $fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $this->ckeditorCssFiles));
+ //$fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $this->ckeditorCssFiles));
+ $fileList = implode(', ', array_map(function($a){ return "'" . $a . "'"; }, $this->ckeditorCssFiles));
$replaceStr .= 'var M3_CONFIG_WIDGET_CKEDITOR_CSS_FILES = [ ' . $fileList . ' ];' . M3_NL;
}
// CKEditor用(レイアウト)のCSSファイル
$cssFiles = array();
- $cssFiles[] = $scriptsUrl . '/' . ScriptLibInfo::BOOTSTRAP_CSS; // BootstrapのCSSを追加
+ $cssFiles[] = $scriptsUrl . '/' . ScriptLibInfo::BOOTSTRAP_ADMIN_CSS; // BootstrapのCSSを追加
$cssFiles[] = $scriptsUrl . '/' . self::M3_CKEDITOR_CSS_FILE;
- $fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $cssFiles));
+// $fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $cssFiles));
+ $fileList = implode(', ', array_map(function($a){ return "'" . $a . "'"; }, $cssFiles));
$replaceStr .= 'var M3_CONFIG_WIDGET_CKEDITOR_LAYOUT_CSS_FILES = [ ' . $fileList . ' ];' . M3_NL;
// CKEditor用のテンプレートタイプ
if (isset($this->ckeditorTemplateType)){
$replaceStr .= 'var M3_CONFIG_WIDGET_CKEDITOR_TEMPLATE_TYPE = ' . $this->ckeditorTemplateType . ';' . M3_NL;
}
+ } else if ($cmd == M3_REQUEST_CMD_SHOW_POSITION){ // ポジション表示
+ $replaceStr .= 'var M3_POSITION_DATA = "' . implode(',', $this->defPositions) . '";' . M3_NL; // 管理画面画面の端末タイプ(主にテスト用に使用)
+ $replaceStr .= 'var M3_CONFIG_WIDGET_DEVICE_TYPE = 0;' . M3_NL; // 管理画面画面の端末タイプ(主にテスト用に使用)
} else if ($cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){ // ウィジェット付きポジション表示
// その他のポジションデータを取得
$positionData = $this->getRestPositionData();
$replaceStr .= 'var M3_FILEBROWSER_WIDTH_RATIO = ' . self::FILEBROWSER_WIDTH_RATIO . ';' . M3_NL; // ファイルブラウザ幅比率
$replaceStr .= 'var M3_FILEBROWSER_HEIGHT_RATIO = ' . self::FILEBROWSER_HEIGHT_RATIO . ';' . M3_NL; // ファイルブラウザ高さ比率
+ // Googleマップライブラリの読み込み
+ if ($this->useGooglemaps){
+ $replaceStr .= 'var M3_USE_GOOGLEMAPS = true;' . M3_NL;
+
+ // CKEditor拡張プラグイン用の定義
+ $googleMapsKey = $this->gSystem->getSystemConfig(self::CF_GOOGLE_MAPS_KEY); // Googleマップ利用キー
+ if (!empty($googleMapsKey)) $replaceStr .= 'var M3_GOOGLEMAPS_KEY="' . $googleMapsKey . '";' . M3_NL; // システムルートURL
+ } else {
+ $replaceStr .= 'var M3_USE_GOOGLEMAPS = false;' . M3_NL;
+ }
+
+ // 起動がパーソナルモードかどうか
+ if ($this->isPersonalMode){
+ $replaceStr .= 'var M3_PERSONAL_MODE = true;' . M3_NL;
+ } else {
+ $replaceStr .= 'var M3_PERSONAL_MODE = false;' . M3_NL;
+ }
+
// テンプレートタイプ
$templateType = $gEnvManager->getCurrentTemplateType();
if (isset($templateType)) $replaceStr .= 'var M3_TEMPLATE_TYPE = ' . $templateType . ';' . M3_NL;
// Googleマップライブラリの読み込み
if ($this->useGooglemaps){
$replaceStr .= 'var M3_USE_GOOGLEMAPS = true;' . M3_NL;
+
+ // CKEditor拡張プラグイン用の定義
+ $googleMapsKey = $this->gSystem->getSystemConfig(self::CF_GOOGLE_MAPS_KEY); // Googleマップ利用キー
+ if (!empty($googleMapsKey)) $replaceStr .= 'var M3_GOOGLEMAPS_KEY="' . $googleMapsKey . '";' . M3_NL; // システムルートURL
} else {
$replaceStr .= 'var M3_USE_GOOGLEMAPS = false;' . M3_NL;
}
+ // 起動がパーソナルモードかどうか(常にパーソナルモード)
+ $replaceStr .= 'var M3_PERSONAL_MODE = true;' . M3_NL;
+
+ // 管理画面の小画面デバイス最適化を行うかどうか
+ if ($gEnvManager->isSmallDeviceAdmin()){
+ $replaceStr .= 'var M3_SMALL_DEVICE_OPTIMIZE = true;' . M3_NL;
+ } else {
+ $replaceStr .= 'var M3_SMALL_DEVICE_OPTIMIZE = false;' . M3_NL;
+ }
+
// ##### CKEditor用の設定 #####
// ウィジェット情報取得
$ret = $this->db->getWidgetInfo($widgetId, $this->configWidgetInfo);
if (!empty($this->ckeditorCssFiles)){
// 編集エリア用のCSSファイルを追加
$this->ckeditorCssFiles[] = $scriptsUrl . '/' . self::M3_CKEDITOR_CSS_FILE;
+ //array_unshift($this->ckeditorCssFiles, $scriptsUrl . '/' . self::M3_CKEDITOR_CSS_FILE);
- $fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $this->ckeditorCssFiles));
+// $fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $this->ckeditorCssFiles));
+ $fileList = implode(', ', array_map(function($a){ return "'" . $a . "'"; }, $this->ckeditorCssFiles));
$replaceStr .= 'var M3_CONFIG_WIDGET_CKEDITOR_CSS_FILES = [ ' . $fileList . ' ];' . M3_NL;
}
// CKEditor用(レイアウト)のCSSファイル
$cssFiles = array();
- $cssFiles[] = $scriptsUrl . '/' . ScriptLibInfo::BOOTSTRAP_CSS; // BootstrapのCSSを追加
+ $cssFiles[] = $scriptsUrl . '/' . ScriptLibInfo::BOOTSTRAP_ADMIN_CSS; // BootstrapのCSSを追加
$cssFiles[] = $scriptsUrl . '/' . self::M3_CKEDITOR_CSS_FILE;
- $fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $cssFiles));
+ // $fileList = implode(', ', array_map(create_function('$a','return "\'" . $a . "\'";'), $cssFiles));
+ $fileList = implode(', ', array_map(function($a){ return "'" . $a . "'"; }, $cssFiles));
$replaceStr .= 'var M3_CONFIG_WIDGET_CKEDITOR_LAYOUT_CSS_FILES = [ ' . $fileList . ' ];' . M3_NL;
// CKEditor用のテンプレートタイプ
$replaceStr .= '});' . M3_NL;
}
}
+ } else { // 権限なしの場合
+ if (!$gEnvManager->isAdminDirAccess()){ // フロント画面のとき
+ // テンプレートタイプを追加(ファイルローダ等で使用)
+ $templateType = $gEnvManager->getCurrentTemplateType();
+ if (isset($templateType)) $replaceStr .= 'var M3_TEMPLATE_TYPE = ' . $templateType . ';' . M3_NL;
+ }
}
// ##### パネルメニュー(フロント画面と管理画面の切り替え等)の表示 #####
$editTag .= '<i class="glyphicon glyphicon-ok-sign"></i></a></div>';
$menubarTag .= $editTag;
- $this->initScript .= str_repeat(M3_INDENT_SPACE, 1) . 'if (window.parent && window.parent.frames.length == 0){' . M3_NL;// インラインフレームでないときパネルメニューを表示
+ // $this->initScript .= str_repeat(M3_INDENT_SPACE, 1) . 'if (window.parent && window.parent.frames.length == 0){' . M3_NL;// インラインフレームでないときパネルメニューを表示
+ $this->initScript .= str_repeat(M3_INDENT_SPACE, 1) . 'if (window == window.parent){' . M3_NL;// インラインフレームでないときパネルメニューを表示(修正 2016/9/1)
$this->initScript .= str_repeat(M3_INDENT_SPACE, 2) . '$("body").prepend(\'' . $menubarTag . '\');' . M3_NL; // appendでうまく表示できないのでprependで表示
$this->initScript .= str_repeat(M3_INDENT_SPACE, 1) . '}' . M3_NL;
} else if ($this->isAccessPointWithAdminMenu){ // 通常画面は、管理メニューを使用するアクセスポイントの場合のみ表示
$menubarTag .= '</div>';
// $menubarTag .= '</div>';
- $this->initScript .= str_repeat(M3_INDENT_SPACE, 1) . 'if (window.parent && window.parent.frames.length == 0){' . M3_NL;// インラインフレームでないときパネルメニューを表示
+ // $this->initScript .= str_repeat(M3_INDENT_SPACE, 1) . 'if (window.parent && window.parent.frames.length == 0){' . M3_NL;// インラインフレームでないときパネルメニューを表示
+ $this->initScript .= str_repeat(M3_INDENT_SPACE, 1) . 'if (window == window.parent){' . M3_NL;// インラインフレームでないときパネルメニューを表示(修正 2016/9/1)
$this->initScript .= str_repeat(M3_INDENT_SPACE, 2) . '$("body").append(\'' . $menubarTag . '\');' . M3_NL;
//$this->initScript .= str_repeat(M3_INDENT_SPACE, 2) . '$("#m3slidemenubarpanel").m3SlideMenubar();' . M3_NL;
$this->initScript .= str_repeat(M3_INDENT_SPACE, 2) . '$(".m3panel_top").m3slidepanel({ "position": "top", "type": "push" });' . M3_NL;
$this->initScript .= str_repeat(M3_INDENT_SPACE, 3) . 'return menu;' . M3_NL;
$this->initScript .= str_repeat(M3_INDENT_SPACE, 2) . '}' . M3_NL;
$this->initScript .= M3_INDENT_SPACE . '});' . M3_NL;
+
+ // コンテンツの「非公開」表示
+ $this->initScript .= M3_INDENT_SPACE . '$(\'div.m3content_private\').each(function(){' . M3_NL;
+// $this->initScript .= str_repeat(M3_INDENT_SPACE, 2) . 'var pos = $(this).position();' . M3_NL;
+// $this->initScript .= str_repeat(M3_INDENT_SPACE, 2) . 'var top = pos.top;' . M3_NL;
+// $this->initScript .= str_repeat(M3_INDENT_SPACE, 2) . 'var left = pos.left;' . M3_NL;
+// $this->initScript .= str_repeat(M3_INDENT_SPACE, 2) . 'var width = $(this).css(\'width\');' . M3_NL;
+// $this->initScript .= str_repeat(M3_INDENT_SPACE, 2) . 'var height = $(this).css(\'height\');' . M3_NL;
+ $this->initScript .= str_repeat(M3_INDENT_SPACE, 2) . 'var html = \'<div class="m3content_overlay"><div><h2>非公開</h2></div></div>\';' . M3_NL;
+ $this->initScript .= str_repeat(M3_INDENT_SPACE, 2) . '$(this).prepend(html);' . M3_NL;
+ // $this->initScript .= str_repeat(M3_INDENT_SPACE, 2) . 'var overlayObj = $(this).children(\'.m3content_overlay div\');' . M3_NL;
+ // $this->initScript .= str_repeat(M3_INDENT_SPACE, 2) . 'overlayObj.css({ position:"absolute", top:top + "px", left:left + "px" }).show();' . M3_NL;
+ $this->initScript .= M3_INDENT_SPACE . '});' . M3_NL;
}
}
// ##### フロント画面のデフォルトのJavaスクリプト #####
*/
function getContents($position, $style = '', $templateVer = 0, $attr = array())
{
- static $render; // Joomla!v1.5テンプレート用
+ static $render; // HTML生成オブジェクト
global $gRequestManager;
global $gEnvManager;
// ウィジェットを実行
$count = count($this->pageDefRows);
- if ($templateVer == 0){ // echo出力のとき(Joomla!v1.0テンプレートの場合)
+ if ($templateVer == 0){ // ########## Joomla!v1.0テンプレートの場合 ##########
ob_start();// バッファ作成
// ウィジェットヘッダ(Joomla!1.0用)を出力するテンプレートかどうかチェック
if (empty($cacheData)){ // キャッシュデータがないとき
ob_clean();
- $ret = $this->pageDefLoop($position, $i, $this->pageDefRows[$i], $style, $titleTag, $widgetHeaderType);
+ $ret = $this->pageDefLoop($position, $i, $this->pageDefRows[$i], $style, $launchWidgetTag, $titleTag, $widgetHeaderType);
if (!$ret) break;
$widgetContent = ob_get_contents();
$widgetContent = $this->_addOptionContent($widgetContent, $pageDefParam);
// ウィジェットの内枠(コンテンツ外枠)を設定
- $widgetContent = '<div class="' . self::WIDGET_INNER_CLASS . '">' . $widgetContent . '</div>';
+ // $widgetContent = '<div class="' . self::WIDGET_INNER_CLASS . '">' . $widgetContent . '</div>';
// キャッシュデータを設定
$this->gCache->setWidgetCache($gRequestManager, $this->pageDefRows[$i], $widgetContent,
$widgetOuterClass .= ' ' . self::WIDGET_OUTER_CLASS_HEAD_POSITION . $position; // ポジションブロッククラス
$widgetContent = '<div class="' . $widgetOuterClass . '">' . $widgetContent . '</div>';
if ($this->isPageEditable){ // フロント画面ページ編集可能モードのとき
+ // ウィジェット表示タイプによる表示制御
+ $widgetStatusClass = '';// ウィジェットの状態表示クラス
+ $widgetStatusLabelOption = ''; // ウィジェット状態表示ラベル
+ $controlType = $this->pageDefRows[$i]['pd_view_control_type'];
+ $pageState = $this->pageDefRows[$i]['pd_view_page_state'];
+ if (!empty($controlType)){
+ switch ($controlType){
+ case 1: // ログイン時のみ表示
+ $widgetStatusClass .= ' ' . self::WIDGET_LOGIN_STATUS_CLASS;
+ $widgetStatusLabelOption .= ' data-bg-text="ログイン時のみ表示"';
+ break;
+ case 2: // 非ログイン時のみ表示
+ $widgetStatusClass .= ' ' . self::WIDGET_LOGIN_STATUS_CLASS;
+ $widgetStatusLabelOption .= ' data-bg-text="非ログイン時のみ表示"';
+ break;
+ default:
+ break;
+ }
+ }
+ if (!empty($pageState)){
+ switch ($pageState){
+ case 1: // トップ時のみ表示
+ if (!$this->isPageTopUrl){
+ $widgetStatusClass .= ' ' . self::WIDGET_INVISIBLE_CLASS; // ページトップ(サブページ内のトップ位置)でなければ非表示
+ $widgetStatusLabelOption .= ' data-bg-text="非表示中"';
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
$configId = $this->pageDefRows[$i]['pd_config_id']; // 定義ID
$serial = $this->pageDefRows[$i]['pd_serial']; // シリアル番号
$hasAdmin = '0'; // 管理画面があるかどうか
if (empty($this->pageDefRows[$i]['pd_sub_id'])) $shared = '1'; // 共通ウィジェットのとき
$m3Option = 'm3="widgetid:' . $widgetId . '; serial:' . $serial . '; configid:' . $configId . '; useconfig:' . $hasAdmin . '; shared:' . $shared . '"';
$widgetTag = self::WIDGET_TAG_HEAD . $position . '_' . $i; // ウィジェット識別用ユニークタグ
- $widgetContent = '<div id="' . $widgetTag . '" class="m3_widget" rel="#m3editwidget" ' . $m3Option . '>' . $widgetContent . '</div>';
+ $widgetContent = '<div id="' . $widgetTag . '" class="m3_widget' . $widgetStatusClass . '" rel="#m3editwidget" ' . $m3Option . $widgetStatusLabelOption . '>' . $widgetContent . '</div>';
} else {
$widgetTag = self::WIDGET_TAG_HEAD . $position . '_' . $i; // ウィジェット識別用ユニークタグ
$widgetContent = '<div id="' . $widgetTag . '">' . $widgetContent . '</div>';
ob_end_clean(); // バッファ破棄
if ($i < $count) return '';// 処理中断のときは終了
- } else { // Joomla!v1.5テンプレートの場合
- // テンプレート側で指定されたメニューの表示属性を設定
- $gEnvManager->setMenuAttr($attr);
-
- // ポジションタイプ
- $posType = '';
- if (!empty($attr['type'])) $posType = $attr['type'];
-
+ } else if ($templateVer == 100){ // ########## WordPressテンプレートの場合 ##########
+ ob_start();// バッファ作成
+
+ // ウィジェットヘッダ(Joomla!1.0用)を出力するテンプレートかどうかチェック
+ //$widgetHeaderType = $this->getTemplateWidgetHeaderType();
for ($i = 0; $i < $count; $i++){
$pageDefParam = $this->pageDefRows[$i]; // 画面定義パラメータ
$widgetId = $this->pageDefRows[$i]['wd_id'];
-
+
// ### 遅延実行ウィジェットはキャッシュしない ###
// キャッシュデータがあるときはキャッシュデータを使用
$cacheData = $this->gCache->getWidgetCache($request, $this->pageDefRows[$i], $metaTitle, $metaDesc, $metaKeyword);
-
+
if (empty($cacheData)){ // キャッシュデータがないとき
- // ウィジェットのタイトルを初期化
- $gEnvManager->setCurrentWidgetTitle('');
-
- // Joomla用のパラメータを初期化
- $gEnvManager->setCurrentWidgetJoomlaParam(array());
+ // WordPressウィジェット用のパラメータ設定
+ $gEnvManager->setWpWidgetClass(''); // ウィジェットクラス名初期化
- // ウィジェットの出力を取得
ob_clean();
- $ret = $this->pageDefLoop($position, $i, $this->pageDefRows[$i], $style, $titleTag, 0/*タイトル出力なし*/);
+ // $ret = $this->pageDefLoop($position, $i, $this->pageDefRows[$i], $style, $launchWidgetTag, $titleTag, $widgetHeaderType);
+ $ret = $this->pageDefLoop($position, $i, $this->pageDefRows[$i], $style, $launchWidgetTag, $titleTag, 0/*タイトル出力なし*/);
+ if (!$ret) break;
$widgetContent = ob_get_contents();
+ // WordPressウィジェット用のパラメータ設定
+ $widgetClassName = $gEnvManager->getWpWidgetClass(); // ウィジェットクラス名
+
$trimContent = trim($widgetContent);
if (!empty($trimContent)){ // 出力が空でない場合
- $isRendered = false; // Joomla!の描画処理を行ったかどうか
+
+ // オブジェクト作成
+ if (!isset($render)) $render = new WPRender(); // WordPress用HTML生成オブジェクト
+
+ // デフォルトのウィジェットタイトル取得
+ $defaultTitle = $gEnvManager->getCurrentWidgetTitle();
+
+ // Joomla用のパラメータを取得
+ //$joomlaParam = $gEnvManager->getCurrentWidgetJoomlaParam();
+
+ // 遅延ウィジェットのときはタイトルタグを埋め込む
+ if (!empty($titleTag)) $defaultTitle = $titleTag;
+
+ // タイトルが空でタイトル表示を行う場合は、デフォルトタイトルを使用
+ $title = $this->pageDefRows[$i]['pd_title'];
+ if ($this->pageDefRows[$i]['pd_title_visible']){ // タイトル表示のとき
+ if (empty($title)) $title = $defaultTitle;
+ } else {
+ $title = ''; // タイトルは非表示
+ }
+
+ // 強制的にタイトルを非表示にする場合はタイトルを修正
+ if (!empty($title) && $this->pageDefRows[$i]['wd_hide_title']){
+ if ($this->isPageEditable){ // フロント画面ページ編集可能モードのとき
+ $title = '[' . $title . ']';
+ } else {
+ $title = '';
+ }
+ }
+
+ // WordPress用パラメータ作成
+ $params = array(); // ウィジェットごとの属性
+ if (!empty($widgetClassName)) $params['moduleclass'] = $widgetClassName; // ウィジェットクラス名
+
+ // ウィジェット生成
+ $widgetTag = self::WIDGET_TAG_HEAD . $position . '_' . ($i + 1); // ウィジェット識別用ユニークタグ
+
+ if (strcmp($position, 'main') == 0){// メイン部のとき
+ $widgetContent = $render->getComponentContents($style, $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer, $widgetTag);
+ } else {
+ $widgetContent = $render->getModuleContents($style, $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer, $widgetTag);
+ }
+
+ // ウィジェット共通のコンテンツ処理
+ // $widgetContent = $this->_addOptionContent($widgetContent, $pageDefParam);
+
+ // ウィジェットの内枠(コンテンツ外枠)を設定
+ // $widgetContent = '<div class="' . self::WIDGET_INNER_CLASS . '">' . $widgetContent . '</div>';
+ }
+
+ // キャッシュデータを設定
+ $this->gCache->setWidgetCache($gRequestManager, $this->pageDefRows[$i], $widgetContent,
+ $this->lastHeadTitle, $this->lastHeadDescription, $this->lastHeadKeywords);
+
+ // ウィジェットの外枠タグを設定
+ // $widgetClassSuffix = $this->pageDefRows[$i]['pd_suffix']; // 追加CSSクラスサフィックス
+ // $widgetOuterClass = self::WIDGET_OUTER_CLASS . ' ' . self::WIDGET_OUTER_CLASS_WIDGET_TAG . str_replace('/', '_', $widgetId);// ウィジェットの外枠のクラス
+ // if (!empty($widgetClassSuffix)) $widgetOuterClass .= ' ' . $widgetOuterClass . '_' . $widgetClassSuffix; // 追加CSSクラス
+ // $widgetOuterClass .= ' ' . self::WIDGET_OUTER_CLASS_HEAD_POSITION . $position; // ポジションブロッククラス
+ // $widgetContent = '<div class="' . $widgetOuterClass . '">' . $widgetContent . '</div>';
+
+ if ($this->isPageEditable){ // フロント画面ページ編集可能モードのとき
+ // ウィジェット表示タイプによる表示制御
+ $widgetStatusClass = '';// ウィジェットの状態表示クラス
+ $widgetStatusLabelOption = ''; // ウィジェット状態表示ラベル
+ $controlType = $this->pageDefRows[$i]['pd_view_control_type'];
+ $pageState = $this->pageDefRows[$i]['pd_view_page_state'];
+ if (!empty($controlType)){
+ switch ($controlType){
+ case 1: // ログイン時のみ表示
+ $widgetStatusClass .= ' ' . self::WIDGET_LOGIN_STATUS_CLASS;
+ $widgetStatusLabelOption .= ' data-bg-text="ログイン時のみ表示"';
+ break;
+ case 2: // 非ログイン時のみ表示
+ $widgetStatusClass .= ' ' . self::WIDGET_LOGIN_STATUS_CLASS;
+ $widgetStatusLabelOption .= ' data-bg-text="非ログイン時のみ表示"';
+ break;
+ default:
+ break;
+ }
+ }
+ if (!empty($pageState)){
+ switch ($pageState){
+ case 1: // トップ時のみ表示
+ if (!$this->isPageTopUrl){
+ $widgetStatusClass .= ' ' . self::WIDGET_INVISIBLE_CLASS; // ページトップ(サブページ内のトップ位置)でなければ非表示
+ $widgetStatusLabelOption .= ' data-bg-text="非表示中"';
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
+ $configId = $this->pageDefRows[$i]['pd_config_id']; // 定義ID
+ $serial = $this->pageDefRows[$i]['pd_serial']; // シリアル番号
+ $hasAdmin = '0'; // 管理画面があるかどうか
+ if ($this->pageDefRows[$i]['wd_has_admin']) $hasAdmin = '1';
+ $shared = '0'; // 共通属性があるかどうか
+ if (empty($this->pageDefRows[$i]['pd_sub_id'])) $shared = '1'; // 共通ウィジェットのとき
+ $m3Option = 'm3="widgetid:' . $widgetId . '; serial:' . $serial . '; configid:' . $configId . '; useconfig:' . $hasAdmin . '; shared:' . $shared . '"';
+ $widgetTag = self::WIDGET_TAG_HEAD . $position . '_' . $i; // ウィジェット識別用ユニークタグ
+ $widgetContent = '<div id="' . $widgetTag . '" class="m3_widget' . $widgetStatusClass . '" rel="#m3editwidget" ' . $m3Option . $widgetStatusLabelOption . '>' . $widgetContent . '</div>';
+ } else {
+ // $widgetTag = self::WIDGET_TAG_HEAD . $position . '_' . $i; // ウィジェット識別用ユニークタグ
+ // $widgetContent = '<div id="' . $widgetTag . '">' . $widgetContent . '</div>';
+ }
+ } else { // キャッシュデータがあるとき
+ $widgetContent = $cacheData;
+
+ // HTMLのメタタグを設定
+ if (!empty($metaTitle)) $this->setHeadSubTitle($metaTitle);
+ if (!empty($metaDesc)) $this->setHeadDescription($metaDesc);
+ if (!empty($metaKeyword)) $this->setHeadKeywords($metaKeyword);
+ }
+ $contents .= $widgetContent;
+
+ // ##### 外部出力用のCSSがある場合は追加 #####
+ $exportCss = $this->pageDefRows[$i]['pd_css'];
+ if (!empty($exportCss)){
+ // ウィジェットのタグIDを変換
+ $widgetTag = self::WIDGET_TAG_HEAD . $position . '_' . $i; // ウィジェット識別用ユニークタグ
+ $exportCss = str_replace(M3_TAG_START . M3_TAG_MACRO_WIDGET_CSS_ID . M3_TAG_END, $widgetTag, $exportCss);
+ $this->addExportCss($exportCss);
+ }
+ }
+ ob_end_clean(); // バッファ破棄
+
+ if ($i < $count) return '';// 処理中断のときは終了
+ } else { // ########## Joomla!v1.5テンプレートの場合 ##########
+ // テンプレート側で指定されたメニューの表示属性を設定
+ $gEnvManager->setMenuAttr($attr);
+
+ // ポジションタイプ
+ $posType = '';
+ if (!empty($attr['type'])) $posType = $attr['type'];
+
+ for ($i = 0; $i < $count; $i++){
+ $pageDefParam = $this->pageDefRows[$i]; // 画面定義パラメータ
+ $widgetId = $this->pageDefRows[$i]['wd_id'];
+
+ // ### 遅延実行ウィジェットはキャッシュしない ###
+ // キャッシュデータがあるときはキャッシュデータを使用
+ $cacheData = $this->gCache->getWidgetCache($request, $this->pageDefRows[$i], $metaTitle, $metaDesc, $metaKeyword);
+
+ if (empty($cacheData)){ // キャッシュデータがないとき
+ // ウィジェットのタイトルを初期化
+ $gEnvManager->setCurrentWidgetTitle('');
+
+ // Joomla用のパラメータを初期化
+ $gEnvManager->setCurrentWidgetJoomlaParam(array());
+
+ // ウィジェットの出力を取得
+ ob_clean();
+ $ret = $this->pageDefLoop($position, $i, $this->pageDefRows[$i], $style, $launchWidgetTag, $titleTag, 0/*タイトル出力なし*/);
+ $widgetContent = ob_get_contents();
+
+ $trimContent = trim($widgetContent);
+ if (!empty($trimContent)){ // 出力が空でない場合
+ $isRendered = false; // Joomla!の描画処理を行ったかどうか
if (!empty($this->pageDefRows[$i]['pd_use_render'])){ // Joomla!の描画処理を使用する場合
// Joomla!ウィジェットの出力に埋め込む
if (strcasecmp($style, 'none') != 0){
$title = ''; // タイトルは非表示
}
+ // 強制的にタイトルを非表示にする場合はタイトルを修正
+ if (!empty($title) && $this->pageDefRows[$i]['wd_hide_title']){
+ if ($this->isPageEditable){ // フロント画面ページ編集可能モードのとき
+ $title = '[' . $title . ']';
+ } else {
+ $title = '';
+ }
+ }
+
// Joomla用パラメータ作成
$params = array(); // ウィジェットごとの属性
$widgetType = $this->pageDefRows[$i]['wd_type']; // ウィジェットタイプ
if (!empty($joomlaClass)) $params['moduleclass_sfx'] = $joomlaClass;
if (isset($joomlaParam['moduleclass_sfx'])) $params['moduleclass_sfx'] = $joomlaParam['moduleclass_sfx'];// ウィジェットでjoomla用パラメータの設定があるとき
- if (strcmp($position, 'main') == 0){// メイン部のとき
+ if ($style == self::WIDGET_STYLE_NAVMENU){ // ナビゲーションバーメニューはメニュータイプのウィジェットのみ実行
+ $moduleContent = '';
+
+ // ウィジェットタイプがメニューのときはナビゲーションメニューを生成
+ if ($widgetType == 'menu') $moduleContent = $render->getNavMenuContents($style, $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer);
+
+ // ナビゲーションバータイプで作成できないときはデフォルトの出力を取得
+ if (empty($moduleContent)) $moduleContent = $render->getModuleContents('xhtml', $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer);
+ $widgetContent = $moduleContent;
+ } else {
+ // ウィジェットタイプに応じた処理を実行
+ if ($widgetType == 'breadcrumb'){ // パンくずリスト
+ $moduleContent = '';
+
+ if (empty($launchWidgetTag)){ // 遅延実行の場合はここでパンくずリストを作成しないで遅延実行時に行う
+ $moduleContent = $render->getBreadcrumbContents($style, $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer);
+ } else {
+ $moduleContent = $launchWidgetTag; // 遅延実行ウィジェットのタグのみ取得
+ }
+
+ // パンくずリストで作成できないときはデフォルトの出力を取得
+ if (empty($moduleContent)) $moduleContent = $render->getModuleContents('xhtml', $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer);
+ $widgetContent = $moduleContent;
+ } else {
+ if (strcmp($position, 'main') == 0){// メイン部のとき
+ // ウィジェットの内枠(コンテンツ外枠)を設定
+ // ウィジェットの内枠はレンダーで設定
+ //$widgetContent = '<div class="' . self::WIDGET_INNER_CLASS . '">' . $widgetContent . '</div>';
+ $widgetContent = $render->getComponentContents($style, $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer);
+ } else { // その他の位置のとき
+ // ウィジェットの内枠(コンテンツ外枠)を設定
+ // ウィジェットの内枠はレンダーで設定
+ //$widgetContent = '<div class="' . self::WIDGET_INNER_CLASS . '">' . $widgetContent . '</div>';
+
+ $widgetContent = $render->getModuleContents($style, $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer);
+ }
+ }
+ }
+/* if (strcmp($position, 'main') == 0){// メイン部のとき
// ウィジェットの内枠(コンテンツ外枠)を設定
// ウィジェットの内枠はレンダーで設定
//$widgetContent = '<div class="' . self::WIDGET_INNER_CLASS . '">' . $widgetContent . '</div>';
//$widgetContent = '<div class="' . self::WIDGET_INNER_CLASS . '">' . $widgetContent . '</div>';
$widgetContent = $render->getModuleContents($style, $widgetContent, $title, $attr, $params, $pageDefParam, $templateVer);
- }
+ }*/
$isRendered = true; // Joomla!の描画処理を行ったかどうか
}
}
$widgetContent = $this->_addOptionContent($widgetContent, $pageDefParam);
// ウィジェットの内枠(コンテンツ外枠)を設定
- $widgetContent = '<div class="' . self::WIDGET_INNER_CLASS . '">' . $widgetContent . '</div>';
+ // $widgetContent = '<div class="' . self::WIDGET_INNER_CLASS . '">' . $widgetContent . '</div>';
}
}
if (!$ret) return ''; // 処理中断のときは終了
$widgetOuterClass .= ' ' . self::WIDGET_OUTER_CLASS_HEAD_POSITION . $position; // ポジションブロッククラス
$widgetContent = '<div class="' . $widgetOuterClass . '">' . $widgetContent . '</div>';
if ($this->isPageEditable){ // フロント画面ページ編集可能モードのとき
+ // ウィジェット表示タイプによる表示制御
+ $widgetStatusClass = '';// ウィジェットの状態表示クラス
+ $widgetStatusLabelOption = ''; // ウィジェット状態表示ラベル
+ $controlType = $this->pageDefRows[$i]['pd_view_control_type'];
+ $pageState = $this->pageDefRows[$i]['pd_view_page_state'];
+ if (!empty($controlType)){
+ switch ($controlType){
+ case 1: // ログイン時のみ表示
+ $widgetStatusClass .= ' ' . self::WIDGET_LOGIN_STATUS_CLASS;
+ $widgetStatusLabelOption .= ' data-bg-text="ログイン時のみ表示"';
+ break;
+ case 2: // 非ログイン時のみ表示
+ $widgetStatusClass .= ' ' . self::WIDGET_LOGIN_STATUS_CLASS;
+ $widgetStatusLabelOption .= ' data-bg-text="非ログイン時のみ表示"';
+ break;
+ default:
+ break;
+ }
+ }
+ if (!empty($pageState)){
+ switch ($pageState){
+ case 1: // トップ時のみ表示
+ if (!$this->isPageTopUrl){
+ $widgetStatusClass .= ' ' . self::WIDGET_INVISIBLE_CLASS; // ページトップ(サブページ内のトップ位置)でなければ非表示
+ $widgetStatusLabelOption .= ' data-bg-text="非表示中"';
+ }
+ break;
+ default:
+ break;
+ }
+ }
+
//$editInfo = 'widgetid:' . $this->pageDefRows[$i]['wd_id'];
$configId = $this->pageDefRows[$i]['pd_config_id']; // 定義ID
$serial = $this->pageDefRows[$i]['pd_serial']; // シリアル番号
if (empty($this->pageDefRows[$i]['pd_sub_id'])) $shared = '1'; // 共通ウィジェットのとき
$m3Option = 'm3="widgetid:' . $widgetId . '; serial:' . $serial . '; configid:' . $configId . '; useconfig:' . $hasAdmin . '; shared:' . $shared . '"';
$widgetTag = self::WIDGET_TAG_HEAD . $position . '_' . $i; // ウィジェット識別用ユニークタグ
- $widgetContent = '<div id="' . $widgetTag . '" class="m3_widget" rel="#m3editwidget" ' . $m3Option . '>' . $widgetContent . '</div>';
+ $widgetContent = '<div id="' . $widgetTag . '" class="m3_widget' . $widgetStatusClass . '" rel="#m3editwidget" ' . $m3Option . $widgetStatusLabelOption . '>' . $widgetContent . '</div>';
} else {
$widgetTag = self::WIDGET_TAG_HEAD . $position . '_' . $i; // ウィジェット識別用ユニークタグ
$widgetContent = '<div id="' . $widgetTag . '">' . $widgetContent . '</div>';
$contents .= '<div style="background-color:#eee;margin:2px;padding:10px;border:3px solid #f00;color:#700;">ポジション名: ';
$contents .= '<b>' . $position . '</b>';
$contents .= '</div>';
+
+ // ポジションを保存
+ if (!in_array($position, $this->defPositions)) $this->defPositions[] = $position; // テンプレート上のポジション
break;
case 2: // ポジション表示(ウィジェット付き)
$rev = '555'; // データのリビジョン番号
$posHead = '';
// ナビゲーション型のポジションの場合はアイコン付加
//if (strcasecmp($position, 'user3') == 0 || strcasecmp($position, 'position-1') == 0) $posHead = self::POS_HEAD_NAV_MENU; // 特殊ポジションブロックのアイコン付加
- if ($style == self::WIDGET_STYLE_NAVMENU) $posHead = self::POS_HEAD_NAV_MENU; // 特殊ポジションブロックのアイコン付加
+ if ($style == self::WIDGET_STYLE_NAVMENU){
+ $posHead = self::POS_HEAD_NAV_MENU; // 特殊ポジションブロックのアイコン付加(ナビゲーションメニュー型)
+ } else if (strcasecmp($position, 'main') == 0){
+ $posHead = self::POS_HEAD_MAIN; // 特殊ポジションブロックのアイコン付加(メイン型)
+ }
$contents .= '<div id="' . $viewPosId . '" class="m3_widgetpos_box" m3="pos:' . $position . ';rev:' . $rev . ';">' . M3_NL; // リビジョン番号を付加
$contents .= '<h2 class="m3_widgetpos_box_title">' . $posHead . $position . '</h2>' . M3_NL;
return $contents;
}
/**
+ * 各部品のHTML出力(WordPressテンプレート専用)
+ *
+ * @param string $position HTMLテンプレート上の書き出し位置
+ * @param bool $showTitle タイトルを表示するかどうか
+ * @return string 出力コンテンツ
+ */
+ function getWPContents($position, $showTitle = true)
+ {
+ if ($showTitle){
+ return $this->getContents($position, self::WIDGET_STYLE_WORDPRESS/*WordPressテンプレート用出力*/, 100/*WordPressテンプレート*/);
+ } else {
+ return $this->getContents($position, self::WIDGET_STYLE_WORDPRESS_NOTITLE/*WordPressテンプレート(タイトルなし)用出力*/, 100/*WordPressテンプレート*/);
+ }
+ }
+ /**
* その他のポジションブロックデータを取得
*
* @param string ポジション作成用タグ
// 実行コマンドを取得
$cmd = $gRequestManager->trimValueOf(M3_REQUEST_PARAM_OPERATION_COMMAND);
- if ($cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){ // ウィジェット付きポジション表示
+ if ($cmd == M3_REQUEST_CMD_SHOW_POSITION || // 管理画面(ウィジェットなしポジション表示)のとき
+ $cmd == M3_REQUEST_CMD_SHOW_POSITION_WITH_WIDGET){ // 管理画面(ウィジェット付きポジション表示)のとき
return 1; // ウィジェットが設定されていないポジション名を表示するために固定で値を返す
}
if (!empty($rows[$i]['wd_template_type'])){ // 対応テンプレートタイプ
$templateTypeArray = explode(',', $rows[$i]['wd_template_type']);
if (in_array('bootstrap', $templateTypeArray)) $functionMark .= self::WIDGET_FUNCTION_MARK_BOOTSTRAP; // Bootstrap型テンプレート対応
+ if (in_array('wordpress', $templateTypeArray)) $functionMark .= self::WIDGET_FUNCTION_MARK_WORDPRESS; // WordPress型テンプレート対応
}
+ if (!empty($functionMark)) $functionMark = '<hr />' . $functionMark;
echo '<dl class="m3_widgetlist_item" id="' . $widgetTag . '">' . M3_NL;
echo '<dt>' . $widgetMark . $rows[$i]['wd_name'] . '</dt>' . M3_NL; // ウィジェット名
- echo '<dd><table width="100%"><tr valign="top"><td width="35">' . $imageTag . '</td><td>' . $desc . '</td></tr></table>';
+ echo '<dd><table style="width:100%;"><tr style="vertical-align:top;"><td style="width:35px;">' . $imageTag . '</td><td>' . $desc . '</td></tr></table>';
echo $functionMark . '</dd>' . M3_NL;
echo '</dl>' . M3_NL;
$ret = $this->db->getPageDef($pageId, $pageSubId, $position2, $rows2);// 0レコードでも正常とする
}
+ // ##### 該当するページのテンプレートタイプを取得 #####
+ $templateType = 99;
+ $templateGenerator = '';
+
+ // ページ用個別に設定されたテンプレートがある場合は取得
+ $curTemplate = '';
+ $line = $this->getPageInfo($pageId, $pageSubId);
+ if (!empty($line)) $curTemplate = $line['pn_template_id'];
+
+ // 取得できなければデフォルトを取得
+ if (empty($curTemplate)){
+ if ($pageId == $this->gEnv->getDefaultPageId()){ // 通常サイトのとき
+ $curTemplate = $this->gSystem->defaultTemplateId();
+ } else if ($pageId == $this->gEnv->getDefaultSmartphonePageId()){ // スマートフォン用サイトのとき
+ $curTemplate = $this->gSystem->defaultSmartphoneTemplateId(); // スマートフォン用デフォルトテンプレート
+ }
+ }
+
+ // テンプレートのタイプを取得
+ $ret = $this->db->getTemplate($curTemplate, $row);
+ if ($ret){
+ $templateType = $row['tm_type'];
+ $templateGenerator = $row['tm_generator'];
+ }
+
// 更新データを作成
// 更新対象のポジションブロック
echo '<div>' . M3_NL;
// ポジション名取得
$posName = str_replace(self::POSITION_TAG_HEAD, '', substr($updatepos[$i], 0, strlen($updatepos[$i]) - strlen(strrchr($updatepos[$i], "_"))));
if ($task == 'wmove' && $posName == $position2){
+ // Themlerテンプレート場合は配置ポジション名が「hmenu」をナビゲーション型とする
+ $style = '';
+ if ($templateGenerator == 'themler'){
+ if (strcasecmp($position2, 'hmenu') == 0){ // Joomla!v3テンプレート対応
+ $style = self::WIDGET_STYLE_NAVMENU; // デフォルトはナビゲーション型
+ }
+ } else {
+ if (strcasecmp($position2, 'user3') == 0 || // ナビゲーションメニュー位置の場合
+ strcasecmp($position2, 'position-1') == 0){ // Joomla!v2.5テンプレート対応
+ $style = self::WIDGET_STYLE_NAVMENU; // デフォルトはナビゲーション型
+ }
+ }
+
// ウィジェット一覧外枠
$posHead = '';
- if (strcasecmp($position2, 'user3') == 0 || strcasecmp($position2, 'position-1') == 0) $posHead = self::POS_HEAD_NAV_MENU; // 特殊ポジションブロックのアイコン付加
+ if ($style == self::WIDGET_STYLE_NAVMENU){
+ $posHead = self::POS_HEAD_NAV_MENU; // 特殊ポジションブロックのアイコン付加(ナビゲーションメニュー型)
+ } else if (strcasecmp($position2, 'main') == 0){
+ $posHead = self::POS_HEAD_MAIN; // 特殊ポジションブロックのアイコン付加(メイン型)
+ }
+ //if (strcasecmp($position2, 'user3') == 0 || strcasecmp($position2, 'position-1') == 0) $posHead = self::POS_HEAD_NAV_MENU; // 特殊ポジションブロックのアイコン付加
echo '<div id="' . $updatepos[$i] . '" class="m3_widgetpos_box" m3="pos:' . $position2 . ';rev:' . $rev . ';">' . M3_NL; // リビジョン番号を付加
echo '<h2 class="m3_widgetpos_box_title">' . $posHead . $position2 . '</h2>' . M3_NL;
// ウィジェット一覧出力
echo $this->getWidgetList($pageId, $pageSubId, $widgetTagHead, $rows2);
} else {
+ // Themlerテンプレート場合は配置ポジション名が「hmenu」をナビゲーション型とする
+ $style = '';
+ if ($templateGenerator == 'themler'){
+ if (strcasecmp($position, 'hmenu') == 0){ // Joomla!v3テンプレート対応
+ $style = self::WIDGET_STYLE_NAVMENU; // デフォルトはナビゲーション型
+ }
+ } else {
+ if (strcasecmp($position, 'user3') == 0 || // ナビゲーションメニュー位置の場合
+ strcasecmp($position, 'position-1') == 0){ // Joomla!v2.5テンプレート対応
+ $style = self::WIDGET_STYLE_NAVMENU; // デフォルトはナビゲーション型
+ }
+ }
+
// ウィジェット一覧外枠
$posHead = '';
- if (strcasecmp($position, 'user3') == 0 || strcasecmp($position, 'position-1') == 0) $posHead = self::POS_HEAD_NAV_MENU; // 特殊ポジションブロックのアイコン付加
+ if ($style == self::WIDGET_STYLE_NAVMENU){
+ $posHead = self::POS_HEAD_NAV_MENU; // 特殊ポジションブロックのアイコン付加(ナビゲーションメニュー型)
+ } else if (strcasecmp($position, 'main') == 0){
+ $posHead = self::POS_HEAD_MAIN; // 特殊ポジションブロックのアイコン付加(メイン型)
+ }
+ //if (strcasecmp($position, 'user3') == 0 || strcasecmp($position, 'position-1') == 0) $posHead = self::POS_HEAD_NAV_MENU; // 特殊ポジションブロックのアイコン付加
echo '<div id="' . $updatepos[$i] . '" class="m3_widgetpos_box" m3="pos:' . $position . ';rev:' . $rev . ';">' . M3_NL; // リビジョン番号を付加
echo '<h2 class="m3_widgetpos_box_title">' . $posHead . $position . '</h2>' . M3_NL;
$contents .= '<dl class="m3_widget m3_widget_sortable" id="' . $widgetTag . '" ' . $m3Option . ' >' . M3_NL;
$contents .= '<dt class="m3_widget_with_check_box ' . $sharedClassName . '"><div class="m3widgettitle">' . $widgetMark . $rows[$i]['wd_name'] . '</div>' . $operationMenu . '</dt>' . M3_NL;
- $contents .= '<dd><table width="100%"><tr valign="top"><td width="35">' . $imageTag . '</td><td>' . $desc . '</td></tr></table>' . M3_NL;
- $contents .= '<table width="100%"><tr><td>' . $configName . '</td><td align="right">' . $configImg . '</td></tr></table></dd>' . M3_NL;
+ $contents .= '<dd><table style="width:100%;"><tr style="vertical-align:top;"><td style="width:35px;border:none;">' . $imageTag . '</td><td style="border:none;">' . $desc . '</td></tr></table><hr />' . M3_NL;
+ $contents .= '<table style="width:100%;"><tr><td style="border:none;">' . $configName . '</td><td style="text-align:right;border:none;">' . $configImg . '</td></tr></table></dd>' . M3_NL;
$contents .= '</dl>' . M3_NL;
}
return $contents;
* ウィジェット出力を処理
*
* @param string $position HTMLテンプレート上の書き出し位置
- * @param int $index 行番号
- * @param array $fetchedRow fetch取得した行
- * @param string $style ウィジェットの表示スタイル(空の場合=Joomla!v1.0テンプレート用、空以外=Joomla!v1.5テンプレート用)
- * @param string $titleTag タイトル埋め込み用タグ(遅延ウィジェットの場合のみ作成)
- * @param int $widgetHeaderType ウィジェットタイトルを出力方法(0=出力なし、1=Joomla!v1.0PC用出力、2=Joomla!v1.0携帯用出力)
- * @return bool 処理を継続するかどうか(true=続行、false=中断)
+ * @param int $index 行番号
+ * @param array $fetchedRow fetch取得した行
+ * @param string $style ウィジェットの表示スタイル(空の場合=Joomla!v1.0テンプレート用、空以外=Joomla!v1.5テンプレート用)
+ * @param string $launchWidgetTag 遅延ウィジェット埋め込み用タグ(遅延ウィジェットの場合のみ作成)
+ * @param string $titleTag タイトル埋め込み用タグ(遅延ウィジェットの場合のみ作成)
+ * @param int $widgetHeaderType ウィジェットタイトルを出力方法(0=出力なし、1=Joomla!v1.0PC用出力、2=Joomla!v1.0携帯用出力)
+ * @return bool 処理を継続するかどうか(true=続行、false=中断)
*/
- function pageDefLoop($position, $index, $fetchedRow, $style, &$titleTag, $widgetHeaderType = 0)
+ function pageDefLoop($position, $index, $fetchedRow, $style, &$launchWidgetTag, &$titleTag, $widgetHeaderType = 0)
{
global $gEnvManager;
global $gErrorManager;
}
// パラメータ初期化
+ $launchWidgetTag = ''; // 遅延ウィジェット埋め込み用タグ
$titleTag = '';
// ウィジェットID取得
$prefix = $fetchedRow['wd_suffix']; // サフィックス文字列
$title = $fetchedRow['wd_name']; // デフォルトのウィジェットタイトル
if (empty($title)) $title = $fetchedRow['wd_id'];
+ $widgetHeadTitle = $fetchedRow['pd_title']; // ウィジェットのヘッドタイトル
+ if (empty($widgetHeadTitle)) $widgetHeadTitle = $title; // ウィジェットのヘッドタイトルが空の場合はウィジェットタイトルを取得
$serial = $fetchedRow['pd_serial']; // シリアル番号
$cssStyle = $fetchedRow['pd_style']; // CSS
$lateLaunchIndex = $fetchedRow['wd_launch_index']; // 遅延実行インデックス
$this->latelaunchWidgetParam[] = array($widgetId, $maxNo, $configId, $prefix, $serial, $style, $cssStyle, $title, $shared, $exportCss, $position, $index, $fetchedRow);
// 遅延実行用タグを埋め込む
- echo self::WIDGET_ID_TAG_START . $widgetId . self::WIDGET_ID_SEPARATOR . $maxNo . self::WIDGET_ID_TAG_END;
+ $launchWidgetTag = self::WIDGET_ID_TAG_START . $widgetId . self::WIDGET_ID_SEPARATOR . $maxNo . self::WIDGET_ID_TAG_END; // 遅延ウィジェット埋め込み用タグ
+ echo $launchWidgetTag;
// タイトル用タグ作成
$titleTag = self::WIDGET_ID_TITLE_TAG_START . $widgetId . self::WIDGET_ID_SEPARATOR . $maxNo . self::WIDGET_ID_TITLE_TAG_END;
// パラメータを設定
$gEnvManager->setCurrentWidgetPrefix($prefix); // プレフィックス文字列
+ // ウィジェットのヘッドタイトルを設定
+ $gEnvManager->setCurrentWidgetHeadTitle($widgetHeadTitle);
+
// ウィジェットのタイトルを設定
$gEnvManager->setCurrentWidgetTitle($title);
function setResponse($responseCode)
{
switch ($responseCode){
+ case 400: // リクエストにエラーがあるとき
+ header('HTTP/1.1 400 Bad request');
+ header('Status: 400 Bad request');
+ break;
case 403: // アクセス禁止のとき
header('HTTP/1.1 403 Forbidden');
header('Status: 403 Forbidden');
return true;
}
/**
+ * システム制御ページを表示するかどうかを返す
+ *
+ * @return bool true=システム制御ページを表示、false=システム制御ページを表示しない
+ */
+ function isSystemPage()
+ {
+ return $this->isSystemPage;
+ }
+ /**
* 指定URLへリダイレクト
*
* @param string $url 遷移先URL。未指定の場合は現在のスクリプト。URLでないときは、現在のスクリプトに付加。
if ($autoSsl){
$isSslPage = false;
if ($gEnvManager->isAdminUrlAccess($toUrl)){ // 管理画面へのアクセスのとき
+ // ルートURLがSSLの場合は管理画面は常にSSL付き
+ if ($gEnvManager->isRootUrlSsl()) $isSslPage = true;
+
// 管理画面のSSL状態を参照
if ($gEnvManager->getUseSslAdmin()) $isSslPage = true; // 管理画面でSSLを使用するとき
} else { // フロント画面へのアクセスのとき
if ($noMessage){
header('HTTP/1.1 302 Found(Moved Temporary)'); // ダイアログメッセージを抑止(ドコモ携帯端末用)
} else {
- header('HTTP/1.1 301 Moved Permanently');
+// header('HTTP/1.1 301 Moved Permanently');
+ header('HTTP/1.1 302 Moved Temporary'); // ドメインのURLをHTTPからHTTPに変更するとChromeで問題が発生したので301から302リダイレクトに変更(2018/4/30)
}
} else { // レスポンスコードが指定されている場合
switch ($responseCode){
case 301:
+ // ##### 301リダイレクトはChromeではブラウザにキャッシュされてしまうので注意 #####
header('HTTP/1.1 301 Moved Permanently');
break;
case 302:
}
}
}
-
+
// リダイレクト処理
$this->redirect($redirectUrl);
$success = true; // ログイン成功
return $url;
}
/**
- * 指定のページ属性のページURLを生成
+ * 現在のアクセスポイントの指定のページ属性のページURLを生成
*
* @param string $contentType コンテンツタイプ
- * @param string $param 実行パラメータ
- * @return string 生成したURL
+ * @param string $param 追加パラメータ
+ * @param bool $omitPageId ページID省略形を使用するかどうか
+ * @return string 生成したURL
*/
- function createContentPageUrl($contentType, $param = '')
+ function createContentPageUrl($contentType, $param = '', $omitPageId = true)
{
global $gEnvManager;
+ static $urlArray = array();
- $pageSubId = $this->getPageSubIdByContentType($contentType, $gEnvManager->getCurrentPageId());
- if (empty($pageSubId)) $pageSubId = $gEnvManager->getDefaultPageSubId();
+ // 複数回呼ばれるのでコンテンツタイプごとにページまでのURLは保存しておく
+ $baseUrl = $urlArray[$contentType];
+ if (!isset($baseUrl)){
+ // コンテンツタイプからページサブIDを取得
+ $pageSubId = $this->getPageSubIdByContentType($contentType, $gEnvManager->getCurrentPageId()); // DBから取得
- $url = $gEnvManager->createPageUrl();
- $url .= '?' . M3_REQUEST_PARAM_PAGE_SUB_ID . '=' . $pageSubId;
- if (!empty($param)) $url .= '&' . $param;
+ if (empty($pageSubId)){ // ページサブIDが取得できない場合はデフォルトのページサブIDを取得
+ $pageSubId = $gEnvManager->getDefaultPageSubId();
+ } else if ($pageSubId == $gEnvManager->getDefaultPageSubId()){ // デフォルトページの場合
+ if ($omitPageId) $pageSubId = ''; // ページID省略形を使用する場合はページサブIDを省略
+ }
+
+ // 現在のアクセスポイントのURLを取得
+ $baseUrl = $gEnvManager->createPageUrl();
+
+ // ページサブIDを付加
+ if (!empty($pageSubId)) $baseUrl .= '?' . M3_REQUEST_PARAM_PAGE_SUB_ID . '=' . $pageSubId;
+
+ // URLを保存
+ $urlArray[$contentType] = $baseUrl;
+ }
+
+ // 追加パラメータ
+ $url = $baseUrl;
+ if (!empty($param)){
+ if (strEndsWith($url, '.php') || strEndsWith($url, '/')){
+ $url .= '?';
+ } else {
+ $url .= '&';
+ }
+ $url .= $param;
+ }
return $url;
}
/**
* 現在のURLにアクセス可能かチェック
*
* @param bool $isActivePage ページが有効かどうか
+ * @param int $errCode エラーコード
* @return bool true=可能、false=不可
*/
- function canAccessUrl(&$isActivePage)
+ function canAccessUrl(&$isActivePage, &$errCode)
{
global $gEnvManager;
+ $errCode = 0; // エラーコード初期化
+
// 現在設定されているページIDを取得
$pageId = $gEnvManager->getCurrentPageId();
$pageSubId = $gEnvManager->getCurrentPageSubId();
}
} else { // 無効ページのとき
$isActivePage = false;
+
+ // ページIDの文字のチェック。ページIDは半角英小文字、数字、アンダーバー、ハイフンのみ使用可能。
+ if (preg_match("/[^0-9a-z-_]/", $pageSubId)) $errCode = 1; // 不正文字検出
}
return false;
}
return $this->pageInfo[$pageId . self::PAGE_ID_SEPARATOR . $pageSubId];
}
/**
+ * 現在のページのページ情報を取得
+ *
+ * @return array ページ情報レコード
+ */
+ function getCurrentPageInfo()
+ {
+ return $this->currentPageInfo;
+ }
+ /**
* 現在のページ情報からテンプレートIDを取得
*
* @param string $subTemplateId テンプレートIDが取得できるときはサブページIDが返る
if (!isset($orderNo)) $orderNo = 100;
$sortParam[] = array('key' => $key, 'value' => $value, 'no' => $orderNo);
}
- usort($sortParam, create_function('$a,$b', 'return $a["no"] - $b["no"];'));
+// usort($sortParam, create_function('$a,$b', 'return $a["no"] - $b["no"];'));
+ usort($sortParam, function($a, $b)
+ {
+ return $a['no'] - $b['no'];
+ });
// 文字列を作成
$sortCount = count($sortParam);
return $destParam;
}
/**
- * 画面で使用しているCSSファイルを取得
+ * DBからCSSファイル(テンプレート独自のCSSまたは外部のCSS)を取得
+ *
+ * @param string $templateId テンプレートID
+ * @return bool true=取得成功、false=取得失敗
+ */
+ function loadCssFiles($templateId = '')
+ {
+ if (empty($templateId)) $templateId = $this->gSystem->defaultTemplateId(); // PC画面デフォルトのテンプレートを取得
+
+ $ret = $this->db->getTemplate($templateId, $row);
+ if (!$ret) return false;
+
+ // 編集エディタ用パラメータが初期化されていない場合は初期化
+ if (empty($row['tm_editor_param'])){
+ // テンプレートを解析し、使用しているCSSファイルを取得
+ $editorParamObj = $this->parseTemplate($templateId);
+
+ // テンプレートの情報を更新
+ $updateParam = array();
+ $updateParam['tm_editor_param'] = serialize($editorParamObj);
+ $ret = $this->db->updateTemplate($templateId, $updateParam);
+ } else {
+ $editorParamObj = unserialize($row['tm_editor_param']);
+ }
+
+ if (isset($editorParamObj)){
+ $this->ckeditorCssFiles = array();
+ $cssFiles = $editorParamObj->cssFiles;
+ for ($i = 0; $i < count($cssFiles); $i++){
+ $cssFile = $cssFiles[$i];
+
+ if (strStartsWith($cssFile, '//')){ // URLが「//」で始まる外部ファイルの場合はそのまま追加
+ $this->ckeditorCssFiles[] = $cssFile;
+ } else if (strStartsWith($cssFile, '/')){ // URLが「/」で始まる相対パスの場合はURLに変換
+ $this->ckeditorCssFiles[] = $this->gEnv->getAdminUrl(true/*adminディレクトリ削除*/) . $cssFile;
+ } else {
+ $this->ckeditorCssFiles[] = $cssFile;
+ }
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+ /**
+ * URLで指定した画面のCSSファイル(テンプレート独自のCSSまたは外部のCSS)を取得
*
* @param string $url 取得画面のURL
- * @return array CSSファイルのURL
+ * @return なし
*/
- function getCssFilesByHttp($url)
+ function loadCssFilesByUrl($url)
{
+ // ##### cURLを使用する場合はセッションのブロックを解除する #####
+ session_write_close();
+
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_USERAGENT, M3_SYSTEM_NAME . '/' . M3_SYSTEM_VERSION); // ユーザエージェント
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 画面に出力しない
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
- curl_setopt($ch, CURLOPT_TIMEOUT, 5);
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
+ curl_setopt($ch, CURLOPT_TIMEOUT, 3);
curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id()); // セッションを維持
$content = curl_exec($ch);
curl_close($ch);
$pattern = '/<link[^<]*?href\s*=\s*[\'"]+(.+?)[\'"]+[^>]*?>/si';
if (preg_match_all($pattern, $headContent, $matches, PREG_SET_ORDER)){
foreach ($matches as $match){
- if (strEndsWith($match[1], '.css')) $urlArray[] = $match[1];
+ if (strEndsWith($match[1], '.css')){ // ファイル名の拡張子が「css」の場合
+ $urlArray[] = $match[1];
+ } else {
+ // typeが「text/css」を取得
+ $attrPattern = '/type\s*=\s*[\'"]+(.+?)[\'"]/si';
+ if (preg_match($attrPattern, $match[0], $attrMatch)){
+ if (strcasecmp($attrMatch[1], 'text/css') == 0){
+ $urlArray[] = $match[1];
+ continue;
+ }
+ }
+ // relが「stylesheet」を取得
+ $attrPattern = '/rel\s*=\s*[\'"]+(.+?)[\'"]/si';
+ if (preg_match($attrPattern, $match[0], $attrMatch)){
+ if (strcasecmp($attrMatch[1], 'stylesheet') == 0){
+ $urlArray[] = $match[1];
+ continue;
+ }
+ }
+ }
}
}
-
+
// ifで制御されているCSSファイルを除く
$delUrlArray = array();
- $pattern = '/<!--\[if\b.*?\]>[\b]*<link[^<]*?href\s*=\s*[\'"]+(.+?)[\'"]+[^>]*?>[\b]*<!\[endif\]-->/si';
+ $pattern = '/<!--\[if\b.*?\]>[\s\S]*<link[^<]*?href\s*=\s*[\'"]+(.+?)[\'"]+[^>]*?>[\s\S]*<!\[endif\]-->/si';
if (preg_match_all($pattern, $headContent, $matches, PREG_SET_ORDER)){
foreach ($matches as $match) $delUrlArray[] = $match[1];
}
- // 管理機能用のCSSを除く
- $this->ckeditorCssFiles = array_diff($urlArray, $delUrlArray); // CKEditor用のCSSファイル
-
+ // ##### テンプレート独自のCSSまたは外部のCSSを取得する #####
+ $this->ckeditorCssFiles = array();
+ $cssFiles = array_merge(array_diff($urlArray, $delUrlArray)); // CKEditor用のCSSファイル
+ for ($i = 0; $i < count($cssFiles); $i++){
+ $cssFileUrl = $cssFiles[$i];
+ $baseUrl = '';
+ if (strncasecmp($cssFileUrl, 'http://', strlen('http://')) == 0){
+ $baseUrl = $this->gEnv->getRootUrl();
+ } else if (strncasecmp($cssFileUrl, 'https://', strlen('https://')) == 0){
+ $baseUrl = $this->gEnv->getSslRootUrl(); // SSLの場合
+ }
+ // パスを解析
+ $relativePath = str_replace($baseUrl, '', $cssFileUrl); // ルートURLからの相対パスを取得
+
+ if (strStartsWith($relativePath, '//')){ // URLが「//」で始まる外部ファイルの場合
+ $this->ckeditorCssFiles[] = $cssFileUrl;
+ } else if (strStartsWith($relativePath, '/' . M3_DIR_NAME_TEMPLATES . '/')){ // テンプレートディレクトリの場合
+ $this->ckeditorCssFiles[] = $cssFileUrl;
+ } else if (strStartsWith($relativePath, '/')){ // テンプレートディレクトリ以外のディレクトリの場合
+ } else { // 外部URLの場合
+ $this->ckeditorCssFiles[] = $cssFileUrl;
+ }
+ }
+
// テンプレートタイプを取得
$pattern = '/var\s*M3_TEMPLATE_TYPE\s*=\s*(\d+?)\s*;/si';
if (preg_match($pattern, $headContent, $matches)) $this->ckeditorTemplateType = $matches[1]; // CKEditor用のテンプレートタイプ
{
return $this->ckeditorTemplateType;
}
+ /**
+ * POST時のリファラーチェック
+ *
+ * @return bool true=正常、false=不正
+ */
+/* function _checkReferer()
+ {
+ global $gEnvManager;
+ global $gRequestManager;
+
+ // リファラーをチェック
+ $referer = $gRequestManager->trimServerValueOf('HTTP_REFERER');
+ $uri = $gEnvManager->getCurrentRequestUri();
+ if (empty($referer) || $referer != $uri){
+ return false;
+ } else {
+ return true;
+ }
+ }*/
+ /**
+ * テンプレート画面を解析してCSSファイルやポジションの情報を取得
+ *
+ * @param string $templateId テンプレートID
+ * @return テンプレート情報オブジェクト
+ */
+ function parseTemplate($templateId)
+ {
+ // ##### cURLを使用する場合はセッションのブロックを解除する #####
+ session_write_close();
+
+ // テンプレートのURL
+ $url = $this->gEnv->getDefaultAdminUrl() . '?' . M3_REQUEST_PARAM_OPERATION_COMMAND . '=' . M3_REQUEST_CMD_SHOW_POSITION . '&template=' . $templateId;
+
+ // テンプレート情報オブジェクト
+ $tmplateInfoObj = new stdClass;
+ $tmplateInfoObj->cssFiles = array(); // テンプレートで使用されているCSSファイル
+
+ $ch = curl_init();
+ curl_setopt($ch, CURLOPT_URL, $url);
+ curl_setopt($ch, CURLOPT_USERAGENT, M3_SYSTEM_NAME . '/' . M3_SYSTEM_VERSION); // ユーザエージェント
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 画面に出力しない
+ curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 3);
+ curl_setopt($ch, CURLOPT_TIMEOUT, 3);
+ curl_setopt($ch, CURLOPT_COOKIE, session_name() . '=' . session_id()); // セッションを維持
+ $content = curl_exec($ch);
+ curl_close($ch);
+
+ // HEADタグを取り出す
+ $urlArray = array();
+ $headContent = '';
+ $pattern = '/<head\b[^>]*?>(.*?)<\/head\b[^>]*?>/si';
+ if (preg_match($pattern, $content, $matches)) $headContent = $matches[0];
+
+ // CSSファイル取り出し
+ $pattern = '/<link[^<]*?href\s*=\s*[\'"]+(.+?)[\'"]+[^>]*?>/si';
+ if (preg_match_all($pattern, $headContent, $matches, PREG_SET_ORDER)){
+ foreach ($matches as $match){
+ if (strEndsWith($match[1], '.css')){ // ファイル名の拡張子が「css」の場合
+ $urlArray[] = $match[1];
+ } else {
+ // typeが「text/css」を取得
+ $attrPattern = '/type\s*=\s*[\'"]+(.+?)[\'"]/si';
+ if (preg_match($attrPattern, $match[0], $attrMatch)){
+ if (strcasecmp($attrMatch[1], 'text/css') == 0){
+ $urlArray[] = $match[1];
+ continue;
+ }
+ }
+ // relが「stylesheet」を取得
+ $attrPattern = '/rel\s*=\s*[\'"]+(.+?)[\'"]/si';
+ if (preg_match($attrPattern, $match[0], $attrMatch)){
+ if (strcasecmp($attrMatch[1], 'stylesheet') == 0){
+ $urlArray[] = $match[1];
+ continue;
+ }
+ }
+ }
+ }
+ }
+
+ // ifで制御されているCSSファイルを除く
+ $delUrlArray = array();
+ $pattern = '/<!--\[if\b.*?\]>[\s\S]*<link[^<]*?href\s*=\s*[\'"]+(.+?)[\'"]+[^>]*?>[\s\S]*<!\[endif\]-->/si';
+ if (preg_match_all($pattern, $headContent, $matches, PREG_SET_ORDER)){
+ foreach ($matches as $match) $delUrlArray[] = $match[1];
+ }
+
+ // テンプレート独自のCSSまたは外部のCSSを取得する
+ $cssFiles = array_merge(array_diff($urlArray, $delUrlArray)); // CKEditor用のCSSファイル
+ for ($i = 0; $i < count($cssFiles); $i++){
+ $cssFileUrl = $cssFiles[$i];
+ $baseUrl = '';
+ if (strncasecmp($cssFileUrl, 'http://', strlen('http://')) == 0){
+ $baseUrl = $this->gEnv->getRootUrl();
+ } else if (strncasecmp($cssFileUrl, 'https://', strlen('https://')) == 0){
+ $baseUrl = $this->gEnv->getSslRootUrl(); // SSLの場合
+ }
+ // パスを解析
+ $relativePath = str_replace($baseUrl, '', $cssFileUrl); // ルートURLからの相対パスを取得
+
+ if (strStartsWith($relativePath, '//')){ // URLが「//」で始まる外部ファイルの場合
+ $tmplateInfoObj->cssFiles[] = $cssFileUrl;
+ } else if (strStartsWith($relativePath, '/' . M3_DIR_NAME_TEMPLATES . '/')){ // テンプレートディレクトリの場合
+ $tmplateInfoObj->cssFiles[] = $cssFileUrl;
+ } else if (strStartsWith($relativePath, '/')){ // テンプレートディレクトリ以外のディレクトリの場合
+ } else { // 外部URLの場合
+ $tmplateInfoObj->cssFiles[] = $cssFileUrl;
+ }
+ }
+
+ // パスを相対パスに変換
+ for ($i = 0; $i < count($tmplateInfoObj->cssFiles); $i++){
+ $cssFileUrl = $tmplateInfoObj->cssFiles[$i];
+
+ $baseUrl = '';
+ if (strncasecmp($cssFileUrl, 'http://', strlen('http://')) == 0){
+ $baseUrl = $this->gEnv->getRootUrl();
+ } else if (strncasecmp($cssFileUrl, 'https://', strlen('https://')) == 0){
+ $baseUrl = $this->gEnv->getSslRootUrl(); // SSLの場合
+ }
+ // パスを解析
+ $relativePath = str_replace($baseUrl, '', $cssFileUrl); // ルートURLからの相対パスを取得
+
+ // テンプレート内のCSSの場合は相対パスに変換
+ if (strStartsWith($relativePath, '/' . M3_DIR_NAME_TEMPLATES . '/')){// テンプレートディレクトリの場合
+ $tmplateInfoObj->cssFiles[$i] = $relativePath;
+ } else {
+ $tmplateInfoObj->cssFiles[$i] = $cssFileUrl;
+ }
+ }
+
+ // テンプレートのポジションを取得
+ $tmplateInfoObj->positions = array();
+ $pattern = '/var\s*M3_POSITION_DATA\s*=\s*[\'"]+(.+?)[\'"]/si';
+ if (preg_match($pattern, $headContent, $matches) && !empty($matches[1])){
+ $tmplateInfoObj->positions = explode(',', $matches[1]);
+ }
+ return $tmplateInfoObj;
+ }
+ /**
+ * デフォルトのテンプレートからレイアウト用テンプレートで使用していないポジションを取得
+ *
+ * @return array ポジション名の配列
+ */
+ function getLayoutTemplatePosition()
+ {
+ $removePositions = array('header', 'extra1', 'extra2', 'brand', 'hmenu', 'user3', 'banner1', 'top1', 'top2', 'top3',
+ 'left', 'banner2', 'breadcrumb', 'user1', 'user2', 'banner3', 'main-top', 'main', 'main-bottom', 'banner4', 'user4', 'user5', 'banner5',
+ 'right','bottom1', 'bottom2', 'bottom3', 'banner6', 'syndicate', 'copyright', 'footer'); // レイアウト用テンプレートに存在するので削除するポジション
+
+ // URLパラメータからデフォルトのテンプレートを取得
+ $pageId = $this->gRequest->trimValueOf(M3_REQUEST_PARAM_DEF_PAGE_ID);
+
+ $templateId = '';
+ if ($pageId == $this->gEnv->getDefaultPageId()){ // 通常サイトのとき
+ $templateId = $this->gSystem->defaultTemplateId();
+ } else if ($pageId == $this->gEnv->getDefaultSmartphonePageId()){ // スマートフォン用サイトのとき
+ $templateId = $this->gSystem->defaultSmartphoneTemplateId(); // スマートフォン用デフォルトテンプレート
+ }
+
+ // テンプレート情報取得
+ $ret = $this->db->getTemplate($templateId, $row);
+ if (!$ret) return array();
+ if (empty($row['tm_editor_param'])) return array();
+
+ // レイアウト用テンプレートに存在しないポジション名のみ返す
+ $editorParamObj = unserialize($row['tm_editor_param']);
+ if (isset($editorParamObj)){
+ if (isset($editorParamObj->positions)){
+ $srcArray = $editorParamObj->positions;
+ $destArray = array();
+ for ($i = 0; $i < count($srcArray); $i++){
+ $position = $srcArray[$i];
+ if (!in_array($position, $removePositions)) $destArray[] = $position;
+ }
+ return $destArray;
+ }
+ }
+ return array();
+ }
}
?>