在 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 }