JS TinyMCE กำลังบันทึกแบบเต็มหน้า

ฉันมีปัญหานี้กับ TinyMCE ซึ่งเมื่อฉันส่งเนื้อหาไปยังฐานข้อมูล เนื้อหานั้นจะถูกบันทึกด้วย <!doctype...<html>.....<body> ฉันเห็นโพสต์เกี่ยวกับการลบปลั๊กอินแบบเต็มหน้า แต่ในกรณีของฉัน ฉันไม่มีสิ่งนั้น ดังนั้นฉันจึงพยายามลบมันเพื่อให้แน่ใจ และรีเฟรชแคชของเบราว์เซอร์ และฉันก็ยังพบปัญหาเดิมอยู่ ฉันแค่ต้องการบันทึก HTML ไว้ระหว่างแท็กเนื้อหา

ฉันส่ง TinyMCE เหมือนแบบฟอร์มปกติโดยมีพื้นที่ข้อความเป็นชื่อ POST และมีปุ่มส่ง

 <form method="post" action="/profile/edit/profile/text">

        {{ csrf_field() }}

        <input type="hidden" name="text2" value="1">

        <textarea id="tinymce-editor" name="text">{!! $profile -> text !!}</textarea>

        <button class="btn btn-success" type="submit"><i class="fa fa-fw fa-check"></i>Lagre</button>

    </form>

.

/**
 * @return mixed
 *
 * Process profile text
 */
public function postEditText() {

    // Sanitize HTML
    $html = $this -> sanitizeHTML(Input::get('text'));

    // Validate
    $val = Validator::make([
        'text' => $html
    ], [
        'text' => 'sometimes|max:50000'
    ]);

    if ($val -> fails()) {
        return $this -> backWithErrors($val);
    }

    // Update
    Auth::user() -> profile() -> update([
        'text' => $html
    ]);

    return $this -> backWithSuccess('Profilteksten ble lagret!');

}

.

/**
 * @param $html
 * @return string
 *
 * HTML sanitizer
 */
private function sanitizeHTML($html) {

    // Disable entity loader
    libxml_disable_entity_loader(false);

    // New DOM doc
    $d = new \DOMDocument();
    $d -> loadHTML($html);

    // Script tags
    $st = $d -> getElementsByTagName('script');
    $l = $st -> length;

    // Remove
    for ($i = 0; $i < $l; $i++) {
        $st -> item($i) -> parentNode -> removeChild($st -> item($i));
    }

    return $d -> saveHTML();

}

ขอบคุณล่วงหน้า.


person Kaizokupuffball    schedule 29.07.2016    source แหล่งที่มา
comment
แล้วคุณใช้โค้ดอะไรในการแยกเนื้อหาจาก TinyMCE และบันทึกลงในฐานข้อมูล? หากคุณไม่ได้ติดตั้งปลั๊กอินแบบเต็มหน้า การเรียก getContent() จะได้รับเฉพาะสิ่งที่อยู่ระหว่างแท็กเนื้อหาเท่านั้น หากไม่เห็นโค้ดที่เป็นปัญหา สิ่งที่เราจะทำคือให้คุณคาดเดา   -  person Michael Fromin    schedule 29.07.2016
comment
ฉันไม่ได้ใช้รหัสใด ๆ เพื่อแยกอะไรเลย เป็นเพียงรูปแบบปกติพร้อมพื้นที่ข้อความที่ถูกแทนที่ด้วย TinyMCE แบบฟอร์มจะถูกส่งเหมือนแบบฟอร์มปกติ (ไม่มี AJAX เป็นเพียงปุ่มส่ง) ฉันสามารถอัปเดตโพสต์ด้วยรหัส   -  person Kaizokupuffball    schedule 29.07.2016


คำตอบ (1)


ดูเหมือนคุณจะมีโค้ดที่สร้าง DOMDocument ใหม่ จากนั้นจึงโหลด HTML เข้าไป

หากคุณบันทึกผลลัพธ์ของ Input::get('text') คุณจะได้อะไร?

บางทีโค้ดของคุณใน sanitizeHTML() คือสิ่งที่กำลังสร้างเอกสาร HTML ที่สมบูรณ์

ตามคู่มือสำหรับ DOMDocument มัน "แสดงถึงเอกสาร HTML หรือ XML ทั้งหมด ทำหน้าที่เป็นรากของแผนผังเอกสาร" หากเป็นเช่นนั้น ฉันสงสัยว่านั่นคือสิ่งที่กำลังสร้างเอกสารทั้งหมดของคุณ ไม่ใช่ TinyMCE

person Michael Fromin    schedule 29.07.2016
comment
ประณามคุณพูดถูกอย่างแน่นอน ขอบคุณ! คุณรู้ไหมว่าฉันจะกำจัดสิ่งนี้ได้อย่างไร? ฉันต้องถอดแท็ก <script> ออก นั่นคือเหตุผลที่ฉันเลือกใช้ DOMDocument มีวิธีโหลด HTML ที่กำหนดแทนที่จะเพิ่ม <!doctype... ทั้งหมดหรือไม่ - person Kaizokupuffball; 29.07.2016
comment
ไม่เป็นไร ฉันพบวิธีแก้ปัญหาแล้ว ใช้สิ่งนี้แทน: $d -> loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD); แต่ขอบคุณ! - person Kaizokupuffball; 29.07.2016