Index: /branches/version-2_4-dev/data/class/helper/SC_Helper_PageLayout.php
===================================================================
--- /branches/version-2_4-dev/data/class/helper/SC_Helper_PageLayout.php	(revision 18550)
+++ /branches/version-2_4-dev/data/class/helper/SC_Helper_PageLayout.php	(revision 18606)
@@ -46,15 +46,18 @@
     function sfGetPageLayout(&$objPage, $preview = false, $url = ""){
         $debug_message = "";
-    	$arrPageLayout = array();
+        $arrPageLayout = array();
 
         // 現在のURLの取得
         if ($preview === false) {
             if ($url == "") {
+                // 従来互換(dtb_pagelayoutのurlが絶対URLだった時)
                 $url = SITE_URL . preg_replace('|^' . preg_quote(URL_DIR) . '|', '' , $_SERVER['PHP_SELF']);
             }
+
+            $url2 = preg_replace('|^http://[^/]+' . preg_quote(URL_DIR) . '|', '', $url);
             // URLを元にページデザインを取得
-            $arrPageData = $this->lfgetPageData(" url = ? " , array($url));
-        }else{
-            $arrPageData = $this->lfgetPageData(" page_id = ? " , array("0"));
+            $arrPageData = $this->lfgetPageData("url IN (?, ?) AND page_id <> 0" , array($url2, $url)); // $url は従来互換
+        } else {
+            $arrPageData = $this->lfgetPageData("page_id = 0");
             $objPage->tpl_mainpage = USER_PATH . "templates/preview/"
                 . TEMPLATE_NAME . "/" . $arrPageData[0]['filename'] . ".tpl";
@@ -62,6 +65,6 @@
         
         reset($arrPageData[0]);
-		while( list($key,$val) = each($arrPageData[0]) ){
-        	 $debug_message.= "arrPageData[$key]：" . $val . "\n";
+        while( list($key,$val) = each($arrPageData[0]) ){
+            $debug_message.= "arrPageData[$key]：" . $val . "\n";
         }
         
@@ -97,10 +100,10 @@
 
         // 全ナビデータを取得する
-        $arrNavi = $this->lfGetNaviData($url, $preview);
-
-        $arrPageLayout['LeftNavi']  = $this->lfGetNavi($arrNavi,1);	// LEFT NAVI
-        $arrPageLayout['MainHead']  = $this->lfGetNavi($arrNavi,2);	// メイン上部
-        $arrPageLayout['RightNavi'] = $this->lfGetNavi($arrNavi,3);	// RIGHT NAVI
-        $arrPageLayout['MainFoot']  = $this->lfGetNavi($arrNavi,4);	// メイン下部
+        $arrNavi = $this->lfGetNaviData($arrPageLayout['page_id']);
+
+        $arrPageLayout['LeftNavi']  = $this->lfGetNavi($arrNavi,1);    // LEFT NAVI
+        $arrPageLayout['MainHead']  = $this->lfGetNavi($arrNavi,2);    // メイン上部
+        $arrPageLayout['RightNavi'] = $this->lfGetNavi($arrNavi,3);    // RIGHT NAVI
+        $arrPageLayout['MainFoot']  = $this->lfGetNavi($arrNavi,4);    // メイン下部
 
         GC_Utils::gfDebugLog($arrPageLayout);
@@ -121,37 +124,33 @@
      * @return array ページ情報を格納した配列
      */
-    function lfgetPageData($addwhere = '', $sqlval = ''){
-        $objQuery = new SC_Query;		// DB操作オブジェクト
-        $arrRet = array();				// データ取得用
-
-        // SQL文生成
+    function lfgetPageData($where = 'page_id <> 0', $where_vals = array()) {
+        $objQuery = new SC_Query;       // DB操作オブジェクト
+        $arrRet = array();              // データ取得用
+
         // 取得するカラム
-        $col  = " page_id";				// ページID
-        $col .= " ,page_name";			// 名称
-        $col .= " ,url";				// URL
-        $col .= " ,php_dir";			// php保存先ディレクトリ
-        $col .= " ,tpl_dir";			// tpl保存先ディレクトリ
-        $col .= " ,filename";			// ファイル名称
-        $col .= " ,header_chk ";		// ヘッダー使用FLG
-        $col .= " ,footer_chk ";		// フッター使用FLG
-        $col .= " ,edit_flg ";			// 編集可能FLG
-        $col .= " ,author";				// authorタグ
-        $col .= " ,description";		// descriptionタグ
-        $col .= " ,keyword";			// keywordタグ
-        $col .= " ,update_url";			// 更新URL
-        $col .= " ,create_date";		// データ作成日
-        $col .= " ,update_date";		// データ更新日
+        $col  = " page_id";             // ページID
+        $col .= " ,page_name";          // 名称
+        $col .= " ,url";                // URL
+        $col .= " ,php_dir";            // php保存先ディレクトリ
+        $col .= " ,tpl_dir";            // tpl保存先ディレクトリ
+        $col .= " ,filename";           // ファイル名称
+        $col .= " ,header_chk ";        // ヘッダー使用FLG
+        $col .= " ,footer_chk ";        // フッター使用FLG
+        $col .= " ,edit_flg ";          // 編集可能FLG
+        $col .= " ,author";             // authorタグ
+        $col .= " ,description";        // descriptionタグ
+        $col .= " ,keyword";            // keywordタグ
+        $col .= " ,update_url";         // 更新URL
+        $col .= " ,create_date";        // データ作成日
+        $col .= " ,update_date";        // データ更新日
         
         // 取得するテーブル
         $table = "dtb_pagelayout";
         
-        // where句の指定があれば追加
-        $where = ($addwhere != '') ? $addwhere : "page_id <> 0";
-        
         // 並び変え
         $objQuery->setOrder('page_id');
         
         // SQL実行
-        $arrRet = $objQuery->select($col, $table, $where, $sqlval);
+        $arrRet = $objQuery->select($col, $table, $where, $where_vals);
         
         // 結果を返す
@@ -163,34 +162,25 @@
      *
      * @param string $url ページのURL
-     * @param boolean $preview プレビュー表示の場合 true
      * @return array ナビ情報の配列
      */
-    function lfGetNaviData($url, $preview=false){
-        $objQuery = new SC_Query;		// DB操作オブジェクト
-        $sql = "";						// データ取得SQL生成用
-        $arrRet = array();				// データ取得用
-        $arrData = array();
-
-        // SQL文生成
+    function lfGetNaviData($page_id){
+        $objQuery = new SC_Query;   // DB操作オブジェクト
+
         // 取得するカラム
         $col = "target_id, bloc_name, tpl_path, php_path";
         
         // 取得するテーブル
-        $table = "dtb_blocposition AS pos, dtb_bloc AS bloc";
+        $table = "dtb_blocposition AS pos INNER JOIN dtb_bloc AS bloc ON bloc.bloc_id = pos.bloc_id";
         
         // where文生成
-        $where = "bloc.bloc_id = pos.bloc_id";
-        if ($preview == true) {
-            $where .= " AND EXISTS (SELECT page_id FROM dtb_pagelayout AS lay WHERE page_id = '0' AND pos.page_id = lay.page_id)";
-        }else{
-            $where .= " AND EXISTS (SELECT page_id FROM dtb_pagelayout AS lay WHERE url = ? AND page_id <> '0' AND pos.page_id = lay.page_id)";
-            $sqlval = array($url);
-        }
+        $where = "page_id = ?";
+        $where_vals[] = $page_id;
+
         // 並び変え
         $objQuery->setOrder('target_id, bloc_row');
         
         // SQL実行
-        $arrRet = $objQuery->select($col, $table, $where, $sqlval);
-                                            
+        $arrRet = $objQuery->select($col, $table, $where, $where_vals);
+        
         // 結果を返す
         return $arrRet;
@@ -207,17 +197,17 @@
         $arrRet = array();
         if(is_array($arrNavi) === true) {
-        	reset($arrNavi);
+            reset($arrNavi);
             while( list($key,$val)= each($arrNavi) ){
-            	// 指定された箇所と同じデータだけを取得する
+                // 指定された箇所と同じデータだけを取得する
                 if ($target_id == $val['target_id']){
                     if ($val['php_path'] != '') {
                         $arrNavi[$key]['php_path'] = HTML_PATH . $val['php_path'];
-                    }else{
-                    	$user_block_path = USER_TEMPLATE_PATH . TEMPLATE_NAME . "/" . $val['tpl_path'];
-                    	if(is_file($user_block_path)) {
-                    	   $arrNavi[$key]['tpl_path'] = $user_block_path;
-                    	} else {
-                           $arrNavi[$key]['tpl_path'] = TEMPLATE_DIR . $val['tpl_path'];
-                    	}
+                    } else {
+                        $user_block_path = USER_TEMPLATE_PATH . TEMPLATE_NAME . "/" . $val['tpl_path'];
+                        if(is_file($user_block_path)) {
+                            $arrNavi[$key]['tpl_path'] = $user_block_path;
+                        } else {
+                            $arrNavi[$key]['tpl_path'] = TEMPLATE_DIR . $val['tpl_path'];
+                        }
                     }
                     
@@ -258,9 +248,8 @@
      */
     function lfDelPageData($page_id){
-    	// DBへデータを更新する
-        $objQuery = new SC_Query;		// DB操作オブジェクト
-        $sql = "";						// データ更新SQL生成用
-        $ret = ""; 						// データ更新結果格納用
-        $arrDelData = array();			// 更新データ生成用
+        // DBへデータを更新する
+        $objQuery = new SC_Query;   // DB操作オブジェクト
+        $ret = "";                  // 結果格納用
+        $arrDelData = array();      // 抽出データ用
 
         // page_id が空でない場合にはdeleteを実行
Index: /branches/version-2_4-dev/data/class/pages/LC_Page_Sitemap.php
===================================================================
--- /branches/version-2_4-dev/data/class/pages/LC_Page_Sitemap.php	(revision 18573)
+++ /branches/version-2_4-dev/data/class/pages/LC_Page_Sitemap.php	(revision 18606)
@@ -105,9 +105,4 @@
         print("<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'>\n");
 
-        // 静的なページを処理
-        foreach($this->staticURL as $url) {
-            $this->createSitemap($url, '', 'daily', 1.0);
-        }
-
         // TOPページを処理
         $topPage = $this->getTopPage($this->arrPageList);
@@ -116,7 +111,12 @@
                              'daily', 1.0);
 
+        // 静的なページを処理
+        foreach ($this->staticURL as $url) {
+            $this->createSitemap($url, '', 'daily', 1.0);
+        }
+
         // 編集可能ページを処理
         $editablePages = $this->getEditablePage($this->arrPageList);
-        foreach($editablePages as $editablePage) {
+        foreach ($editablePages as $editablePage) {
             $this->createSitemap($editablePage['url'],
                                  $this->date2W3CDatetime($editablePage['update_date']));
@@ -125,9 +125,9 @@
         // 商品一覧ページを処理
         $products = $this->getAllProducts();
-        foreach($products as $product) {
+        foreach ($products as $product) {
             $this->createSitemap($product['url'], '', 'daily');
         }
         $mobileProducts = $this->getAllProducts(true);
-        foreach($mobileProducts as $mobileProduct) {
+        foreach ($mobileProducts as $mobileProduct) {
             $this->createSitemap($mobileProduct['url'], '', 'daily');
         }
@@ -135,10 +135,10 @@
         // 商品詳細ページを処理
         $details = $this->getAllDetail();
-        foreach($details as $detail) {
+        foreach ($details as $detail) {
             $this->createSitemap($detail['url'],
                                  $this->date2W3CDatetime($detail['update_date']));
         }
         $mobileDetails = $this->getAllDetail(true);
-        foreach($mobileDetails as $mobileDetail) {
+        foreach ($mobileDetails as $mobileDetail) {
             $this->createSitemap($mobileDetail['url'], 
                                  $this->date2W3CDatetime($mobileDetail['update_date']));
@@ -192,7 +192,6 @@
     function getTopPage($pageData) {
         $arrRet = array();
-        foreach($pageData as $page) {
+        foreach ($pageData as $page) {
             if ($page['page_id'] == "1") {
-                $page['url'] = SITE_URL . $page['url'];
                 $arrRet[0] = $page;
                 return $arrRet;
@@ -209,9 +208,7 @@
     function getEditablePage($pageData) {
         $arrRet = array();
-        $i = 0;
-        foreach($pageData as $page) {
+        foreach ($pageData as $page) {
             if ($page['page_id'] > 4) {
-                $arrRet[$i] = $page;
-                $i++;
+                $arrRet[] = $page;
             }
         }
@@ -310,5 +307,15 @@
         $sql .= " ORDER BY 	page_id";
 
-        return $objDBConn->getAll($sql, $arrVal);
+        $pageData = $objDBConn->getAll($sql, $arrVal);
+        // URL にプロトコルの記載が無い場合、SITE_URL を前置する。
+        foreach (array_keys($pageData) as $key) {
+            $page =& $pageData[$key];
+            if (!preg_match('|^https?://|i', $page['url'])) {
+                $page['url'] = SITE_URL . $page['url'];
+            }
+        }
+        unset($page);
+
+        return $pageData;
     }
 
Index: /branches/version-2_4-dev/data/class/pages/admin/design/LC_Page_Admin_Design_MainEdit.php
===================================================================
--- /branches/version-2_4-dev/data/class/pages/admin/design/LC_Page_Admin_Design_MainEdit.php	(revision 18584)
+++ /branches/version-2_4-dev/data/class/pages/admin/design/LC_Page_Admin_Design_MainEdit.php	(revision 18606)
@@ -111,5 +111,5 @@
 
             // ディレクトリを画面表示用に編集
-            $arrPageData[0]['directory'] = str_replace( USER_DIR,'', $arrPageData[0]['php_dir']);
+            $arrPageData[0]['directory'] = str_replace(USER_DIR, '', $arrPageData[0]['php_dir']);
 
             $this->arrPageData = $arrPageData[0];
@@ -133,5 +133,5 @@
             $arrPreData = $this->objLayout->lfgetPageData("page_id = ?" , array($page_id));
             
-            // tplファイルの削除
+            // tplファイルの削除 (XXX: 処理の意図が不明。存在していると都合が悪いファイル?)
             $del_tpl = USER_PATH . "templates/" . $arrPreData[0]['filename'] . '.tpl';
             if (file_exists($del_tpl)){
@@ -193,17 +193,15 @@
                     $this->objLayout->lfDelFile($arrPageData[0]);
                     // PHPファイル作成
-                    $cre_php = USER_PATH . $_POST['url'] . ".php";
-                    $this->lfCreatePHPFile($cre_php);
+                    $this->lfCreatePHPFile($_POST['url']);
                 }
 
                 // TPLファイル作成
                 $cre_tpl = USER_TEMPLATE_PATH . "/" . TEMPLATE_NAME . "/" . basename($_POST['url']) . '.tpl';
-
                 $this->lfCreateFile($cre_tpl);
 
-                // 編集可能ページの場合にのみ処理を行う
-                if ($arrPageData[0]['edit_flg'] != 2) {
-                    // 新規作成した場合のために改にページIDを取得する
-                    $arrPageData = $this->objLayout->lfgetPageData(" url = ? " , array(USER_URL.$_POST['url'].".php"));
+                // 新規作成の場合、
+                if ($page_id == '') {
+                    // ページIDを取得する
+                    $arrPageData = $this->objLayout->lfgetPageData(" url = ? AND page_id <> 0" , array(USER_URL.$_POST['url'] . ".php"));
                     $page_id = $arrPageData[0]['page_id'];
                 }
@@ -212,16 +210,16 @@
                                               "msg"     => "on")));
 				exit;
-            }else{
+            } else {
                 // エラーがあれば入力時のデータを表示する
                 $this->arrPageData = $_POST;
                 $this->arrPageData['header_chk'] = SC_Utils_Ex::sfChangeCheckBox(SC_Utils_Ex::sfChangeCheckBox($_POST['header_chk']), true);
                 $this->arrPageData['footer_chk'] = SC_Utils_Ex::sfChangeCheckBox(SC_Utils_Ex::sfChangeCheckBox($_POST['footer_chk']), true);
-                $this->arrPageData['directory'] = $_POST['url'];
-                $this->arrPageData['filename'] = "";
+                $this->arrPageData['directory'] = '';
+                $this->arrPageData['filename'] = $_POST['url'];
             }
         }
 
         // データ削除処理 ベースデータでなければファイルを削除
-        if ($_POST['mode'] == 'delete' and 	!$this->objLayout->lfCheckBaseData($page_id)) {
+        if ($_POST['mode'] == 'delete' and !$this->objLayout->lfCheckBaseData($page_id)) {
             $this->objLayout->lfDelPageData($_POST['page_id']);
             $this->sendRedirect($this->getLocation("./main_edit.php"));
@@ -281,5 +279,5 @@
             $sql .= " ) VALUES ( ?,?,?,?,?,?,?,?,now(),now() )";
             $sql .= " ";
-        }else{
+        } else {
             // データが存在してる場合にはアップデートを行う
             // SQL生成
@@ -318,25 +316,33 @@
         if ($this->objLayout->lfCheckBaseData($arrData['page_id'])) {
             $arrPageData = $this->objLayout->lfgetPageData( ' page_id = ? ' , array($arrData['page_id']));
+            
             $name = $arrPageData[0]['page_name'] ;
             $url = $arrPageData[0]['url'];
+            $php_dir = $arrPageData[0]['php_dir'];
             $filename = $arrPageData[0]['filename'];
-        }else{
+        } else {
             $name = $arrData['page_name'] ;
-            $url = USER_URL.$arrData['url'].".php";
+            $url = USER_DIR . $arrData['url'] . '.php';
+            $php_dir = dirname($url);
+            if ($php_dir == '.') {
+                $php_dir = '';
+            } else {
+                $php_dir .= '/';
+            }
             $tpl_dir = substr(TPL_DIR, strlen(URL_DIR));
-            $filename = basename($arrData['url']);
+            $filename = basename($arrData['url']); // 拡張子を付加しない
         }
         
         // 更新データ配列の作成
         $arrUpdData = array(
-                            $name										// 名称
-                            ,$url										// URL
-                            ,$php_dir									// PHPディレクトリ
-                            ,$tpl_dir									// TPLディレクトリ
-                            ,$filename									// ファイル名
-                            ,SC_Utils_Ex::sfChangeCheckBox($arrData['header_chk'])	// ヘッダー使用
-                            ,SC_Utils_Ex::sfChangeCheckBox($arrData['footer_chk'])	// フッター使用
-                            ,$_SERVER['HTTP_REFERER']					// 更新URL
-                            );
+            $name                                                   // 名称
+            ,$url                                                   // URL
+            ,$php_dir                                               // PHPディレクトリ
+            ,$tpl_dir                                               // TPLディレクトリ
+            ,$filename                                              // ファイル名
+            ,SC_Utils_Ex::sfChangeCheckBox($arrData['header_chk'])  // ヘッダー使用
+            ,SC_Utils_Ex::sfChangeCheckBox($arrData['footer_chk'])  // フッター使用
+            ,$_SERVER['HTTP_REFERER']                               // 更新URL
+        );
 
         return $arrUpdData;
@@ -355,21 +361,38 @@
 
         // URLチェック
-        if (substr(strrev(trim($array['url'])),0,1) == "/") {
+        $okUrl = true;
+        foreach (explode('/', $array['url']) as $url_part) {
+            if (!ereg( '^[a-zA-Z0-9:_~\.-]+$', $url_part)) {
+                $okUrl = false;
+            }
+            if ($url_part == '.' || $url_part == '..') {
+                $okUrl = false;
+            }
+        }
+        if (!$okUrl) {
             $objErr->arrErr['url'] = "※ URLを正しく入力してください。<br />";
         }
-
-        $check_url = USER_URL . $array['url'] . ".php";
-        if( strlen($array['url']) > 0 && !ereg( "^https?://+($|[a-zA-Z0-9:_~=&\?\.\/-])+$", $check_url ) ) {
-            $objErr->arrErr['url'] = "※ URLを正しく入力してください。<br />";
-        }
-
+        
         // 同一のURLが存在している場合にはエラー
-        if(!isset($objErr->arrErr['url']) and $array['url'] !== ''){
-        	// URLのチェック（プレビュー用のレコードは含まない）
-            $arrChk = $this->objLayout->lfgetPageData(" url = ? AND page_id <> 0" , array(USER_URL . $array['url'].".php"));
-
-            if (count($arrChk[0]) >= 1 and $arrChk[0]['page_id'] != $array['page_id']) {
-                $objErr->arrErr['url'] = '※ 同じURLのデータが存在しています。別のURLを付けてください。<br />';
-            }
+        $sqlWhere = '';
+        $params = array();
+        
+        $sqlWhere .= ' (url = ? OR url = ?)';
+        $params[] = USER_DIR . $array['url'] . '.php';
+        $params[] = USER_URL . $array['url'] . '.php'; // 従来形式
+
+        // プレビュー用のレコードは除外
+        $sqlWhere .= ' AND page_id <> 0';
+
+        // 変更の場合、自身のレコードは除外
+        if (strlen($array['page_id']) != 0) {
+            $sqlWhere .= ' AND page_id <> ?';
+            $params[] = $array['page_id'];
+        }
+
+        $arrChk = $this->objLayout->lfgetPageData($sqlWhere , $params);
+
+        if (count($arrChk) >= 1) {
+            $objErr->arrErr['url'] = '※ 同じURLのデータが存在しています。別のURを付けてください。<br />';
         }
 
@@ -402,6 +425,8 @@
      * @return void
      */
-    function lfCreatePHPFile($path){
-
+    function lfCreatePHPFile($url){
+
+        $path = USER_PATH . $url . ".php";
+        
         // php保存先ディレクトリが存在していなければ作成する
         if (!is_dir(dirname($path))) {
@@ -415,5 +440,5 @@
 
         // require.phpの場所を書き換える
-        $php_data = str_replace("###require###", HTML_PATH . "require.php", $php_data);
+        $php_data = str_replace("###require###", str_repeat('../', substr_count($url, '/')) . '../require.php', $php_data);
 
         // phpファイルの作成
Index: /branches/version-2_4-dev/data/Smarty/templates/default/admin/design/main_edit.tpl
===================================================================
--- /branches/version-2_4-dev/data/Smarty/templates/default/admin/design/main_edit.tpl	(revision 16937)
+++ /branches/version-2_4-dev/data/Smarty/templates/default/admin/design/main_edit.tpl	(revision 18606)
@@ -116,8 +116,8 @@
 									<!--{ if $arrErr.url != "" }--><span class="red12"><!--{$arrErr.url}--></span><!--{/if}-->
 									URL：<!--{if $arrPageData.edit_flg == 2}-->
-											<!--{$smarty.const.SITE_URL}--><!--{$arrPageData.url|escape}-->
-											<input type="hidden" name="url" value="<!--{$arrPageData.filename|escape}-->" maxlength="<!--{$smarty.const.STEXT_LEN}-->" />
+											<!--{$smarty.const.SITE_URL|escape}--><!--{$arrPageData.url|escape}-->
+											<input type="hidden" name="url" value="<!--{$arrPageData.filename|escape}-->" />
 										<!--{else}-->
-											<!--{$user_URL}--><input type="text" name="url" value="<!--{$arrPageData.directory|escape}--><!--{$arrPageData.filename|escape}-->" maxlength="<!--{$smarty.const.STEXT_LEN}-->" style="<!--{if $arrErr.url != ""}-->background-color: <!--{$smarty.const.ERR_COLOR}-->;<!--{/if}--> ime-mode: disabled;" size="40" class="box40" />.php<span class="red"> （上限<!--{$smarty.const.STEXT_LEN}-->文字）</span>
+											<!--{$user_URL|escape}--><input type="text" name="url" value="<!--{$arrPageData.directory|escape}--><!--{$arrPageData.filename|escape}-->" maxlength="<!--{$smarty.const.STEXT_LEN}-->" style="<!--{if $arrErr.url != ""}-->background-color: <!--{$smarty.const.ERR_COLOR}-->;<!--{/if}--> ime-mode: disabled;" size="40" class="box40" />.php<span class="red"> （上限<!--{$smarty.const.STEXT_LEN}-->文字）</span>
 										<!--{/if}-->
 								</td>
