Index: /branches/comu-ver2/data/Smarty/templates/default/admin/design/main_edit.tpl
===================================================================
--- /branches/comu-ver2/data/Smarty/templates/default/admin/design/main_edit.tpl	(revision 17414)
+++ /branches/comu-ver2/data/Smarty/templates/default/admin/design/main_edit.tpl	(revision 17416)
@@ -71,8 +71,8 @@
   <!--{/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="attention"> （上限<!--{$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="attention"> （上限<!--{$smarty.const.STEXT_LEN}-->文字）</span>
     <!--{/if}--><br />
 
@@ -96,5 +96,5 @@
   <table class="list center">
     <!--{foreach key=key item=item from=$arrPageList}-->
-    <tr style="background-color:<!--{if $item.page_id == $page_id}--><!--{$smarty.const.SELECT_RGB}--><!--{else}-->#ffffff<!--{/if}-->;">
+    <tr style="<!--{if $item.page_id == $page_id}-->background-color: <!--{$smarty.const.SELECT_RGB}-->;<!--{/if}-->">
       <td>
         <a href="<!--{$smarty.server.PHP_SELF|escape}-->?page_id=<!--{$item.page_id}-->" ><!--{$item.page_name}--></a>
Index: /branches/comu-ver2/data/class/pages/admin/design/LC_Page_Admin_Design_MainEdit.php
===================================================================
--- /branches/comu-ver2/data/class/pages/admin/design/LC_Page_Admin_Design_MainEdit.php	(revision 16741)
+++ /branches/comu-ver2/data/class/pages/admin/design/LC_Page_Admin_Design_MainEdit.php	(revision 17416)
@@ -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)){
@@ -192,17 +192,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_DIR . $_POST['url'] . '.php'));
                     $page_id = $arrPageData[0]['page_id'];
                 }
@@ -210,16 +208,16 @@
                                         array("page_id" => $page_id,
                                               "msg"     => "on")));
-            }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"));
@@ -278,5 +276,5 @@
             $sql .= " ) VALUES ( ?,?,?,?,?,?,?,?,now(),now() )";
             $sql .= " ";
-        }else{
+        } else {
             // データが存在してる場合にはアップデートを行う
             // SQL生成
@@ -315,24 +313,32 @@
         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";
-            $filename = basename($arrData['url']);
+            $url = USER_DIR . $arrData['url'] . '.php';
+            $php_dir = dirname($url);
+            if ($php_dir == '.') {
+                $php_dir = '';
+            } else {
+                $php_dir .= '/';
+            }
+            $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;
@@ -349,25 +355,42 @@
         $objErr->doFunc(array("名称", "page_name", STEXT_LEN), array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK"));
         $objErr->doFunc(array("URL", "url", STEXT_LEN), array("EXIST_CHECK", "SPTAB_CHECK", "MAX_LENGTH_CHECK"));
-
+        
         // 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のデータが存在しています。別のURLを付けてください。<br />';
+        }
+        
         return $objErr->arrErr;
     }
@@ -398,6 +421,8 @@
      * @return void
      */
-    function lfCreatePHPFile($path){
-
+    function lfCreatePHPFile($url){
+
+        $path = USER_PATH . $url . ".php";
+        
         // php保存先ディレクトリが存在していなければ作成する
         if (!is_dir(dirname($path))) {
@@ -411,5 +436,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/comu-ver2/data/class/helper/SC_Helper_PageLayout.php
===================================================================
--- /branches/comu-ver2/data/class/helper/SC_Helper_PageLayout.php	(revision 17116)
+++ /branches/comu-ver2/data/class/helper/SC_Helper_PageLayout.php	(revision 17416)
@@ -46,5 +46,5 @@
     function sfGetPageLayout(&$objPage, $preview = false, $url = ""){
         $debug_message = "";
-    	$arrPageLayout = array();
+        $arrPageLayout = array();
 
         // 現在のURLの取得
@@ -53,6 +53,7 @@
                 $url = "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
             }
+            $url2 = preg_replace('|^' . preg_quote(SITE_URL) . '|', '', $url);
             // URLを元にページデザインを取得
-            $arrPageData = $this->lfgetPageData(" url = ? " , array($url));
+            $arrPageData = $this->lfgetPageData(" url IN (?, ?) " , array($url2, $url)); // $url は従来互換
         }else{
             $arrPageData = $this->lfgetPageData(" page_id = ? " , array("0"));
@@ -60,7 +61,7 @@
                 . TEMPLATE_NAME . "/" . $arrPageData[0]['filename'] . ".tpl";
         }
-		
+        
         foreach($arrPageData[0] as $key => $val) {
-        	 $debug_message.= "arrPageData[$key]：" . $val . "\n";
+            $debug_message.= "arrPageData[$key]：" . $val . "\n";
         }
         
@@ -98,8 +99,8 @@
         $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);	// メイン下部
+        $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,25 +122,25 @@
      */
     function lfgetPageData($where = '', $arrVal = ''){
-        $objDBConn = new SC_DbConn;		// DB操作オブジェクト
-        $sql = "";						// データ取得SQL生成用
-        $arrRet = array();				// データ取得用
+        $objDBConn = new SC_DbConn;     // DB操作オブジェクト
+        $sql = "";                      // データ取得SQL生成用
+        $arrRet = array();              // データ取得用
 
         // SQL生成
         $sql .= " SELECT";
-        $sql .= " page_id";				// ページID
-        $sql .= " ,page_name";			// 名称
-        $sql .= " ,url";				// URL
-        $sql .= " ,php_dir";			// php保存先ディレクトリ
-        $sql .= " ,tpl_dir";			// tpl保存先ディレクトリ
-        $sql .= " ,filename";			// ファイル名称
-        $sql .= " ,header_chk ";		// ヘッダー使用FLG
-        $sql .= " ,footer_chk ";		// フッター使用FLG
-        $sql .= " ,edit_flg ";			// 編集可能FLG
-        $sql .= " ,author";				// authorタグ
-        $sql .= " ,description";		// descriptionタグ
-        $sql .= " ,keyword";			// keywordタグ
-        $sql .= " ,update_url";			// 更新URL
-        $sql .= " ,create_date";		// データ作成日
-        $sql .= " ,update_date";		// データ更新日
+        $sql .= " page_id";             // ページID
+        $sql .= " ,page_name";          // 名称
+        $sql .= " ,url";                // URL
+        $sql .= " ,php_dir";            // php保存先ディレクトリ
+        $sql .= " ,tpl_dir";            // tpl保存先ディレクトリ
+        $sql .= " ,filename";           // ファイル名称
+        $sql .= " ,header_chk ";        // ヘッダー使用FLG
+        $sql .= " ,footer_chk ";        // フッター使用FLG
+        $sql .= " ,edit_flg ";          // 編集可能FLG
+        $sql .= " ,author";             // authorタグ
+        $sql .= " ,description";        // descriptionタグ
+        $sql .= " ,keyword";            // keywordタグ
+        $sql .= " ,update_url";         // 更新URL
+        $sql .= " ,create_date";        // データ作成日
+        $sql .= " ,update_date";        // データ更新日
         $sql .= " FROM ";
         $sql .= "     dtb_pagelayout";
@@ -168,7 +169,7 @@
      */
     function lfGetNaviData($url, $preview=false){
-        $objDBConn = new SC_DbConn;		// DB操作オブジェクト
-        $sql = "";						// データ取得SQL生成用
-        $arrRet = array();				// データ取得用
+        $objDBConn = new SC_DbConn;     // DB操作オブジェクト
+        $sql = "";                      // データ取得SQL生成用
+        $arrRet = array();              // データ取得用
         $arrData = array();
 
@@ -215,10 +216,10 @@
                         $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'];
-                    	}
+                        $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'];
+                        }
                     }
                     
@@ -260,8 +261,8 @@
     function lfDelPageData($page_id){
         // DBへデータを更新する
-        $objDBConn = new SC_DbConn;		// DB操作オブジェクト
-        $sql = "";						// データ更新SQL生成用
-        $ret = ""; 						// データ更新結果格納用
-        $arrDelData = array();			// 更新データ生成用
+        $objDBConn = new SC_DbConn; // DB操作オブジェクト
+        $sql = "";                  // データ更新SQL生成用
+        $ret = "";                  // データ更新結果格納用
+        $arrDelData = array();      // 更新データ生成用
 
         // page_id が空でない場合にはdeleteを実行
