Làm cách nào để truy xuất văn bản THAY ĐỔI từ Joomla Editor?


7

Tôi có một trang cho phép người dùng chỉnh sửa văn bản giới thiệu của một bài viết cụ thể và tôi đang sử dụng mã này để cho phép họ làm như vậy:

$editor = & JFactory::getEditor();
$params = array('smilies'=> '0' ,'style'  => '0' ,'layer'  => '0' ,'table'  => '0' ,'clear_entities'=>'0');
echo $editor->display('introtext',$this->introtext  , '96%', '100px', 250, 40, false, null, null, null, $params);

Vấn đề là khi tôi đi lưu các thay đổi với jQuery / AJAX, tôi chỉ có thể truy cập HTML gốc mà trình soạn thảo đã được khởi tạo. Tôi đã sử dụng trình soạn thảo TinyMCE trong khi phát triển, nhưng người dùng thích JCE, vì vậy các câu trả lời cụ thể của biên tập viên được tìm thấy với Google không phải là mẹo cho tôi.

Làm thế nào để một người có được văn bản chỉnh sửa mà người dùng muốn lưu, để được đăng? Tôi đã giả định rằng cái này, hoặc tương tự, sẽ hoạt động, nhưng rõ ràng nó không:

var newHTML = $('#introtext').val();

1
Tôi thực sự cần phải bắt đầu thử nghiệm JCE vì mọi người dường như yêu thích nó. Chỉ cần một lưu ý phụ (nếu bạn đang sử dụng không sử dụng Joomla 1.5), bạn không cần &trước đó JFactory. Do JCE không cung cấp một cái gì đó trong "API" của họ có thể thay đổi nội dung? Không chắc sự hỗ trợ của họ có miễn phí hay không nhưng có thể đáng để hỏi họ
Tạm biệt

@Lodder Bạn không cần &trước đây JFactorynếu sử dụng PHP5 - Tôi không nghĩ rằng điều này nhất thiết liên quan đến một phiên bản cụ thể của Joomla (ngoài thực tế là <1.5 có thể không hoạt động trên PHP5)? j Joomla.stackexchange.com/questions/411/ Mạnh
MrWhite

@ w3d - Đúng rồi bạn. Bạn không chắc chắn những gì tôi đã suy nghĩ đó
Lodder

Điểm tốt .... giá cắt / dán .... không chắc chắn rằng tôi thực sự đã viết một dòng mã mới kể từ '03, lol
GDP

Câu trả lời:


3

Nếu tôi nhớ đúng, JCE sử dụng iframe cho nội dung. Do đó, trước tiên bạn cần có một tham chiếu đến iframe, sau đó truy cập vào tài liệu bên trong của iframe, nó sẽ cung cấp bên trongHTML như văn bản bạn đang tìm kiếm. Tôi đã làm điều này một lần, nhưng tiếc là tôi không thể truy cập mã cho đến Chủ nhật.

Tôi sẽ bắt đầu với một cái gì đó như thế này (đây là cách tôi nhớ nó, không thể kiểm tra nó ngay bây giờ):

var iframe = document.getElementById('jform_articletext_ifr');
var innerDoc = iframe.contentDocument || iframe.contentWindow.document;
var currentText = innerDoc.innerHTML;

Với currentText là văn bản "mới".


Đây dường như cũng là trường hợp của TinyMCE, vì vậy đảm bảo có nhiều nghiên cứu hơn, nhưng than ôi, tôi đã phải làm lại mã của mình mà không có kiến ​​thức này, vì vậy sẽ không thể xác minh. Cảm ơn về hướng đi mặc dù - sẽ quan tâm đến việc nghe từ bất cứ ai theo đuổi và xác nhận điều này!
GDP

2

Câu hỏi của "GDP" là

"Làm thế nào để một người có được văn bản đã chỉnh sửa mà người dùng muốn lưu, để được đăng?.

"Nai sừng tấm" đã giúp tôi bắt đầu đi đúng hướng nhưng tôi đã nhờ đến jQuery để thực sự có được văn bản đã chỉnh sửa. Đây là những gì tôi đã làm:

jQuery ("# ​​Array_ifr"). nội dung (). find ("cơ thể"). find ("p"). html ();

Trong đó " Array_ifr" là id của iframe the JCE editor uses. Tôi đã tìm thấy điều này bằng cách kiểm tra các yếu tố với Fireorms.

Điều này làm việc cho tôi trong một Joomla! môi trường nhưng tôi không thấy nó là một vấn đề ở bất kỳ ai khác. Hy vọng điều này sẽ giúp những người khác với mã hóa của họ.


Điều này làm việc cho một đoạn duy nhất. Nếu có nhiều văn bản mà (một số đoạn và / hoặc các thẻ khác), hãy bỏ ".find ('p')" cuối cùng. Điều này sẽ trả về tất cả các nội dung.
Sheldon Seale

1

Không có phương pháp nào tôi biết, bạn sẽ phải lưu trữ văn bản gốc và sau đó thực hiện so sánh khi gửi.

Thêm chi tiết, do đó, nói chung Trình chỉnh sửa được đặt ở cấp Toàn cầu nhưng người dùng có thể chọn thay đổi cấu hình của mình để chọn trình chỉnh sửa ưa thích.

Thời đại Joomla 3.x + tải Trình chỉnh sửa bằng cách JFormFieldEditortải trình soạn thảo đã chọn. Người dùng thực hiện các thay đổi trong trình chỉnh sửa nhưng như bạn đã lưu ý rằng chúng không được phản ánh đến trường ngay lập tức. ví dụ trong một bài viết đó sẽ là #jform_articletextyếu tố

Tuy nhiên, đối với hầu hết các biên tập viên theo thời gian mục được lưu, phần tử biểu mẫu jform[articletext]có nội dung được cập nhật. (Điều này dường như không áp dụng cho các trình soạn thảo AJAX mà tôi đã thấy).

Tôi chỉ đang suy đoán ở đây, nhưng tôi tưởng tượng họ (các biên tập viên) đính kèm một submitsự kiện vào biểu mẫu chính và đưa nội dung của họ vào trường vào thời điểm đó. Nơi khác bạn có thể kiểm tra là liên kết "Toggle Editor" mà JCE và TinyMCE có.

Trong một bài viết, TinyMCE có trình kích hoạt sự kiện nhấp này được đính kèm với nút "Toggle Editor":

function onclick(event) {
    tinyMCE.execCommand('mceToggleEditor', false, 'jform_articletext');
    return false;
}

Điều này làm cho nội dung của các biên tập viên được tuôn ra trường #jform_articletext.

Một cách tiếp cận khác có thể là gửi một submitsự kiện đến trình soạn thảo đang hoạt động với hy vọng làm cho nó cập nhật trường với văn bản đã thay đổi.

Vì mỗi trình soạn thảo có thể thực hiện xử lý submittheo một cách khác nhau và không phải tất cả chúng đều có nút "Toggle Editor" của MCE, bạn có thể phải xây dựng một trường hợp đặc biệt cho mỗi trình soạn thảo mà bạn muốn hỗ trợ.


1
Một so sánh với những gì? OP dường như không thể truy cập vào văn bản mới được chỉnh sửa?
MrWhite

Thật tệ, tôi rất phản ứng quá đơn giản dựa trên kiến ​​thức giả định, về cơ bản mỗi trình soạn thảo là một ứng dụng Javascript khác nhau, Joomla chỉ mong lĩnh vực mà trình soạn thảo được đính kèm sẽ được cập nhật tại thời điểm gửi.
Craig

1

cố gắng đặt ngay trước

<?php echo $editor->save('introtext'); ?>
var newHTML = $('#introtext').val();

hoặc là

var newHTML = <?php echo $editor->getContent('introtext'); ?>

vì vậy văn bản từ trình soạn thảo sẽ được sao chép vào biến newHTML đó

tất nhiên mã javascript của bạn phải ở cùng một tệp biểu mẫu php (không phải trong tệp js độc lập)


1
Bạn đã kiểm tra mã này trước khi đăng? (Nếu không, vui lòng tạo thói quen này khi có thể để các nhà nghiên cứu trong tương lai có thể thực hiện liền mạch các giải pháp của bạn) Không nên newHTMLgói giá trị phân phối php?
mickmackusa

0

Chủ đề này khá cũ nhưng điều này có thể giúp người khác ...

Câu trả lời của nai sừng tấm gần như chính xác, ngoại trừ việc tôi phải sửa đổi thành

var currentText = innerDoc.body.innerHTML;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.