在 Yii2 的設計經驗中,
常常會使用 CKediotr 做為 textarea 的編輯器,
但是插圖或檔案上傳需要另外做設定,而且常會忘記怎麼設定,
乾脆做個筆記好了。
原理
在 CKeditor 裡,按下檔案上傳時,應該是利用 ajax 之類的技術在背景返回 server端處理上傳檔案,所以需要告訴 CKeditor 要用哪個 action 處理上傳後的檔案,處理完畢後再把檔案的 URL 位置回傳給 CKeditor。
程式碼部份
表單部分的程式 ( _form.php )
<?php use yii\helpers\Html; use yii\widgets\ActiveForm; use dosamigos\ckeditor\CKEditor; /* 製作檔案上傳的 action 的絕對路徑 , 並存在 $url 變數中 */ $url=Yii::$app->urlManager->createAbsoluteUrl(['editor/file-upload']); ?> <div class="editor-form"> <?php $form = ActiveForm::begin(); ?> <?= $url ?> <?= $form->field($model, 'memo')->widget(CKEditor::className(), [ 'options' => ['rows' => 6], 'preset' => 'full', 'clientOptions' => [ 'filebrowserUploadUrl' => $url ] //要把這個 aciton 傳給 CKeditor ]) ?> <div class="form-group"> <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> </div> <?php ActiveForm::end(); ?> </div>
檔案上傳處理程式 ( EditorController.php )
public function actionFileUpload() {
//先取得檔案要存放的路徑 , 等一下才能把暫存檔搬過去
$uploadPath = Yii::getAlias('@webroot').'/uploads/';
//確認檔案有上傳成功再處理
if (isset($_FILES["upload"]["name"]) && $_FILES["upload"]["error"] == 0) {
//檔案上傳,改檔名
$org_name=explode(".",$_FILES["upload"]["name"]);
//新檔名
$upload_filename=time().".".$org_name[count($org_name)-1];
//把暫存檔案搬到目錄中
move_uploaded_file($_FILES["upload"]["tmp_name"], $uploadPath . $upload_filename);
//要回傳給 CKeditor 的檔案 URL
$url = Yii::$app->urlManager->createAbsoluteUrl('/uploads/'.$upload_filename);
//如果有什麼額外的回饋訊息,要打在這裡
$message="";
$funcNum = $_GET['CKEditorFuncNum'] ;
//利用 JavaScript 指令回傳
echo "<script type='text/javascript'>window.parent.CKEDITOR.tools.callFunction($funcNum, '$url', '$message');</script>";
} // end if
}
