2014-02-23 50 views
1

我得到了一個從文本文件加載html代碼到一個textarea的頁面,我需要能夠使用腳本保存它的內容。加載一個文件,編輯並保存它(服務器端)PHP

我正在使用PHP腳本從文件加載代碼並將其回送到textarea,但是如何將內容發送回腳本並將其保存到相同的文件或文件中一個新的名字?

我想如果getElementById會幫助我,但我不知道如何。

負載腳本(它刪除文件太多的能力)

// The file hierarchy: 
// 
//Web root - admin - This file 
//   - pages - in here are the page text files 

// The variable pagesList is the filename chosen in a dropdown list earlier 
$page = $_GET["pagesList"]; 
$action = $_GET["action"]; 
//get the path to the page(all pages are in a folder named 'pages') 
$filename = dirname(dirname(__FILE__))."/pages/".$page; 

if(file_exists($filename) and is_file($filename)){ 

    //If I want to load a file 
    if($action == "open"){ 
     $f = fopen($filename,"rt"); 
     $content = fread($f, filesize($filename)); 
     echo $content; 
     @fclose($f); 

    //If I want to delete a file 
    }elseif($action == "delete" && is_file($filename)){ 
     //move the working directory to where the file is 
     $old = getcwd(); 
     chdir(dirname(dirname(__FILE__))."/pages/"); 
     //---- 
     if(unlink($filename)) 
      echo "File deleted,".$filename; 
     else 
      echo "Error deleting file!"; 
     //change back the working directory to where it was 
     chdir($old); 

    //If I want to save a file 
    }elseif($action == "save"){ 
     if(file_exists($filename)){ 

      //Unknown script, need help! 

     }else{ 

     } 
    } 
}  

textarea裏有隻有一行包括它:

<textarea id="html_content" style="width:600;height:200;"><?php include("loader.php") ?></textarea> 

概括起來:我需要幫助將textarea的內容提供給腳本以便稍後保存。

編輯:感謝davidkonrad我只需在腳本中添加幾個POST接收並添加file_put_content與發送給它的內容。

出現的問題是,jQuery顯然會在每個「或」之前放置\,這會弄亂所有應該是乾淨有效的html代碼,我將不得不用「以某種方式替換\」,str_replace不會削減它的任何想法

EDIT2:?再次感謝davidkonrad通過使用encodeURIComponent方法(jQuery的)客戶方和urldecode(PHP)服務器端固定它

回答

4

更新,如果您不確定如何提交文本EA您loader.php:

<form method="post" action="loader.php"> 
<input type="hidden" name="filename" value="test.html"> 
<input type="hidden" name="action" value="save"> 
<textarea name="html_content"></textarea> 
<input type="submit" value="save"> 
</form> 

loader.php,現在你有

$filename=$_POST['filename']; 
$action=$_POST['action']; 
$html_content=$_POST['html_content']; 

在這裏是 「的test.html」, 「保存」 和任何文本輸入到textarea的。使用這些變量在if .. else環的上述,如

} elseif($action == "save"){ 
    if(file_exists($filename)){ 
     //Unknown script, need help! 
     file_put_contents($filename, $html_content); //or how you want to do it 
    } 
} 

缺點是

  • 需要在每個動作
  • 您需要再次呼應了插入的內容重新加載頁面,之間<textarea> .. </textarea>一旦它插入(據我所知,HTML是loader.php的一部分)
  • 同樣保持跟蹤當前文件名更復雜

注意:除非有特殊原因,否則在寫入文件之前,您不必檢查文件是否已經存在。而仍然認爲在目錄周圍旅遊只是讓它變得複雜:)是否/pages/不只是一個相對路徑?


它不需要那麼複雜。我會用一種更簡單和結構化的方法,包括

    通過簡單 file_put_contentsfile_get_contentsunlink,包括一些小的錯誤處理
  • $.ajax呼叫的系統(jQuery的)執行每一項任務調用
  • 一個PHP類上面的PHP類

以下工作示例執行HTML文件的保存,加載和刪除操作,您必須授予RW權限,該指定格式爲/files

file.php

class File { 
    private $filename; 
    private $dir = 'files/'; 

    public function __construct() { 
     $action = isset($_POST['action']) ? $_POST['action'] : false; 
     $this->filename = isset($_POST['filename']) ? $_POST['filename'] : false; 
     if ((!$action) || (!$this->filename)) return; 
     switch ($action) { 
      case 'save' : 
       $this->save(); break; 
      case 'load' : 
       $this->load(); break; 
      case 'delete' : 
       $this->delete(); break; 
      default : 
       return; 
       break; 
     } 
    } 
    private function save() { 
     $content = isset($_POST['content']) ? $_POST['content'] : ''; 
     file_put_contents($this->dir.$this->filename, urldecode($content)); 
    } 
    private function load() { 
     $content = @file_get_contents($this->dir.$this->filename); 
     echo $content; 
    } 
    private function delete() { 
     unlink($this->dir.$this->filename); 
    } 
} 
$file = new File(); 

file.html,標記

<input type="text" id="filename" value="test.txt"><br> 
<textarea id="html_content" style="width:600;height:200;"></textarea> 
<br> 
<button id="save">save</button> 
<button id="load">load</button> 
<button id="delete">delete</button> 

file.html,腳本:

var url = 'file.php'; 
$("#save").click(function() { 
    $.ajax({ 
     url : url, 
     type: 'post', 
     data : { 
      filename : $("#filename").val(), 
      action : 'save', 
      content : encodeURIComponent($('#html_content').val()) 
     } 
    }); 
}); 
$("#delete").click(function() { 
    $.ajax({ 
     url : url, 
     type: 'post', 
     data : { 
      filename : $("#filename").val(), 
      action : 'delete' 
     } 
    }); 
}); 
$("#load").click(function() { 
    $.ajax({ 
     url : url, 
     type: 'post', 
     data : { 
      filename : $("#filename").val(), 
      action : 'load' 
     }, 
     success : function(html) { 
      $("#html_content").val(html); 
     } 
    }); 
}); 

HTML內容(標記,HTML實體)保持通過使用encodeURIComponenturldecode保存。自己嘗試一下,並將其視爲更復雜系統的基礎。如果你想創建一個新文件,只需在文件名框中輸入一個新的文件名。如果要加載文件,請在文件名框中輸入該文件名。我認爲file_put_contents等遠比處理文件句柄,chdir(dirname(dirname(__FILE__))."/pages/");(??)等更強大。

+0

哇,謝謝,但我得到的主要問題是關於將textarea內的文本轉移到php腳本。你可以看到已經完成了加載和刪除操作。 Theres沒有錯你的代碼的方式,但我寧願繼續我開始它的方式。而且我看到您使用POST來處理內容,但我會使用GET,以獲得更大的靈活性。 –

+0

好吧,不太明白 - 爲什麼你不能通過正常的形式/提交將textarea的內容傳遞給PHP腳本?使用POST代替GET的原因有一個原因:GET有一些窄的限制,對於使用suhosin補丁的普通PHP,$ _GET字段的默認限制是512字節。對於瀏覽器,GET的最大長度(包括所有字段)大約爲2000個字符。編輯HTML文件時不多 - 請參閱http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-a-url-in-different-browsers - 我想您最終會使用POST最後:) – davidkonrad

+0

啊,theres一個限制..那麼,有可能在表單中有一個textarea,並通過POST提交其內容?我的意思是我想繼續使用我已有的腳本,而不是使用JQuery或第二個全新的腳本來處理我已有的腳本。 –

0

嘗試使用PHP的fputs函數來保存文件

+0

問題是將textarea的內容放入腳本中,保存並不困難。 –

相關問題