PHP DOMDocument nối thêm HTML

ví dụ

Tạo một

phần tử và nối nó vào tài liệu

const para = tài liệu. createElement("p");
para. innerText = "Đây là một đoạn văn";
tài liệu. thân hình. appendChild(para);

Tự mình thử »

Tạo một

phần tử và nối nó với một phần tử

const para = tài liệu. createElement("p");
para. innerHTML = "Đây là một đoạn văn. ";
tài liệu. getElementById("myDIV"). appendChild(para);

Tự mình thử »

Thêm ví dụ bên dưới


Định nghĩa và cách sử dụng

Phương thức

$p = $dom->createElement('p');
06 tạo một nút phần tử



cú pháp

tài liệu. tạo phần tử (loại)

Thông số

Kiểu mô tả tham sốBắt buộc.
Loại phần tử cần tạo.

Giá trị trả về

TypeDescriptionNodeNút phần tử được tạo

Thêm ví dụ

Tạo một nút

const btn = tài liệu. createElement("button");
btn. innerHTML = "Nút Hello";
tài liệu. thân hình. appendChild(btn);

Tự mình thử »


Hỗ trợ trình duyệt

$p = $dom->createElement('p');
07 là tính năng DOM Cấp 1 (1998)

Nó được hỗ trợ đầy đủ trong tất cả các trình duyệt

ChromeIEEdgeFirefoxSafariOperaCó9-11CóCóCóCó

ví dụ

  1. Tạo ra một
  2. yếu tố
  3. Tạo một nút văn bản
  4. Nối văn bản vào
  5. yếu tố
  6. Chèn
  7. phần tử trước con đầu tiên trong một
      :

const newNode = tài liệu. createElement("li");
const textNode = document. createTextNode("Nước");
newNode. appendChild(textNode);

const list = tài liệu. getElementById("myList");
list. chènB Before (newNode, danh sách. con[0]);

Tự mình thử »

Di chuyển phần tử cuối cùng từ danh sách này sang đầu danh sách khác

const nút = tài liệu. getElementById("myList2"). lastElementChild;
const list = document. getElementById("myList1");
danh sách. insertB Before (nút, danh sách. con[0]);

Tự mình thử »

Di chuyển phần tử cuối cùng từ danh sách này đến cuối danh sách khác

const nút = tài liệu. getElementById("myList2"). lastElementChild;
const list = document. getElementById("myList1");
danh sách. insertB Before(nút, null);

Tự mình thử »


Định nghĩa và cách sử dụng

Phương thức

$p = $dom->createElement('p');
08 chèn một nút con trước một nút con hiện có



cú pháp

yếu tố. insertB Before (mới, hiện có)

hoặc

nút. insertB Before (mới, hiện có)

Thông số

Tham sốMô tả mớiBắt buộc.
Nút (phần tử) cần chèn. hiện cóBắt buộc.
Nút (phần tử) cần chèn trước.
Nếu
$p = $dom->createElement('p');
09, nó sẽ được chèn vào cuối.

Giá trị trả về

TypeDescriptionNodeNút được chèn

Hỗ trợ trình duyệt

$p = $dom->createElement('p');
10 là tính năng DOM Cấp 1 (1998)

Nó được hỗ trợ đầy đủ trong tất cả các trình duyệt

ChromeIEEdgeFirefoxSafariOperaCó9-11CóCóCóCó

Tạo khuôn mẫu làm cho trang web hoạt động. Tổng hợp dữ liệu và cấu trúc thành nội dung. Đó là siêu năng lực thú vị nhất của chúng tôi với tư cách là nhà phát triển — lấy một số dữ liệu, sau đó làm cho dữ liệu đó hoạt động cho chúng tôi, trong bất kỳ bản trình bày nào chúng tôi cần. Mảng đối tượng có thể trở thành bảng, danh sách thẻ, biểu đồ hoặc bất kỳ thứ gì chúng tôi cho là hữu ích nhất cho người dùng. Cho dù dữ liệu là các bài đăng trên blog của riêng chúng tôi trong các tệp Markdown hay tỷ giá hối đoái toàn cầu theo phút, đánh dấu và kết quả UX tùy thuộc vào chúng tôi với tư cách là nhà phát triển giao diện người dùng

PHP là một ngôn ngữ tuyệt vời để tạo khuôn mẫu, cung cấp nhiều cách để hợp nhất dữ liệu với đánh dấu. Hãy đi vào một ví dụ về việc sử dụng dữ liệu để tạo biểu mẫu HTML trong bài đăng này

Bạn muốn bẩn tay ngay lập tức?

Trong PHP, chúng ta có thể biến nội tuyến thành chuỗi ký tự sử dụng dấu ngoặc kép, vì vậy nếu chúng ta có biến

$p = $dom->createElement('p');
0, chúng ta có thể viết
$p = $dom->createElement('p');
1 và nó sẽ in ra kết quả mong muốn là
$p = $dom->createElement('p');
2. Để tạo khuôn mẫu phức tạp hơn, chúng ta luôn có thể nối các chuỗi, như.
$p = $dom->createElement('p');
3

Đối với những học sinh cũ, có

$p = $dom->createElement('p');
4. Đối với các chuỗi nhiều dòng, bạn có thể sử dụng Heredoc (cái bắt đầu như
$p = $dom->createElement('p');
5). Và, cuối cùng nhưng chắc chắn không kém phần quan trọng, chúng ta có thể rắc các biến PHP bên trong HTML, như
$p = $dom->createElement('p');
6

Tất cả các tùy chọn này đều tuyệt vời, nhưng mọi thứ có thể trở nên lộn xộn khi cần nhiều logic nội tuyến. Nếu chúng ta cần xây dựng các chuỗi HTML phức hợp, chẳng hạn như một biểu mẫu hoặc điều hướng, độ phức tạp có thể là vô hạn, vì các phần tử HTML có thể lồng vào nhau

Những gì chúng tôi đang cố gắng tránh

Trước khi tiếp tục và làm điều mình muốn, bạn nên dành một phút để xem xét điều mình không muốn làm. Hãy xem xét đoạn văn rút gọn sau đây từ thánh thư của WordPress Core,

$p = $dom->createElement('p');
7, câu 170-270

________số 8

Để xây dựng một điều hướng

$p = $dom->createElement('p');
8 trong chức năng này, chúng tôi sử dụng một biến,
$p = $dom->createElement('p');
9, là một chuỗi rất dài mà chúng tôi tiếp tục thêm nội dung vào đó. Loại mã này có thứ tự hoạt động rất cụ thể và giới hạn. Nếu chúng tôi muốn thêm một thuộc tính vào
$p = $dom->createElement('p');
10, chúng tôi phải có quyền truy cập vào
$p = $dom->createElement('p');
11 trước khi điều này chạy. Và nếu chúng tôi muốn tùy ý lồng một
$p = $dom->createElement('p');
12 hoặc một
$p = $dom->createElement('p');
13 bên trong
$p = $dom->createElement('p');
10, chúng tôi cần tạo một khối mã hoàn toàn mới sẽ thay thế phần giữa của dòng 7 bằng khoảng 4-10 dòng mới, tùy thuộc vào chính xác những gì chúng tôi muốn . Bây giờ, hãy tưởng tượng bạn cần tùy ý thêm
$p = $dom->createElement('p');
12 , sau đó tùy ý thêm
$p = $dom->createElement('p');
13, bên trong hoặc sau
$p = $dom->createElement('p');
12. Điều đó một mình là ba câu lệnh
$p = $dom->createElement('p');
18, làm cho mã thậm chí còn khó đọc hơn

Rất dễ để kết thúc với mì spaghetti dạng chuỗi khi nối như thế này, điều này thật thú vị khi nói rằng thật khó để duy trì

Bản chất của vấn đề là khi chúng ta cố gắng suy luận về các phần tử HTML, chúng ta không nghĩ về các chuỗi. Nó chỉ xảy ra rằng các chuỗi là những gì trình duyệt sử dụng và các kết quả đầu ra của PHP. Nhưng mô hình tinh thần của chúng ta giống DOM hơn - các phần tử được sắp xếp thành một cây và mỗi nút có nhiều thuộc tính, thuộc tính và con tiềm năng

Sẽ không tuyệt sao nếu có một cách có cấu trúc, biểu cảm để xây dựng cái cây của chúng ta?

Đi vào…

Lớp học $p = $dom->createElement('p');19

PHP 5 đã thêm mô-đun

$p = $dom->createElement('p');
10 vào danh sách các loại Không được nhập quá nghiêm ngặt™. Điểm vào chính của nó là lớp
$p = $dom->createElement('p');
19, tương tự như lớp JavaScript của API Web API
$p = $dom->createElement('p');
10. Nếu bạn đã từng sử dụng
$p = $dom->createElement('p');
13 hoặc, đối với những người trong chúng ta ở một độ tuổi nhất định, cú pháp
$p = $dom->createElement('p');
14 của jQuery, thì điều này có thể sẽ cảm thấy khá quen thuộc

Chúng tôi bắt đầu bằng cách khởi tạo một

$p = $dom->createElement('p');
19 mới

$p = $dom->createElement('p');
7

Bây giờ chúng ta có thể thêm một

$p = $dom->createElement('p');
16 vào nó

$p = $dom->createElement('p');

Chuỗi

$p = $dom->createElement('p');
17 đại diện cho loại phần tử chúng tôi muốn, vì vậy các chuỗi hợp lệ khác sẽ là ________ 218, ________ 219, v.v.

Khi chúng ta có một phần tử, chúng ta có thể đặt các thuộc tính của nó

$p = $dom->createElement('p');
1

Chúng ta có thể thêm trẻ em vào nó

$p = $dom->createElement('p');
1

Và cuối cùng, lấy chuỗi HTML hoàn chỉnh trong một lần

$p = $dom->createElement('p');
5

Lưu ý cách mã hóa kiểu này giữ cho mã của chúng tôi được sắp xếp theo mô hình tinh thần của chúng tôi - một tài liệu có các phần tử; . Toàn bộ phần “HTML chỉ là một chuỗi” xuất hiện ở cuối, khi cấu trúc của chúng tôi đã sẵn sàng

“Tài liệu” ở đây hơi khác so với DOM thực tế, ở chỗ nó không cần đại diện cho toàn bộ tài liệu mà chỉ là một khối HTML. Trên thực tế, nếu bạn cần tạo hai phần tử giống nhau, bạn có thể lưu một chuỗi HTML bằng cách sử dụng

$p = $dom->createElement('p');
50, sửa đổi “tài liệu” DOM thêm một chút, sau đó lưu một chuỗi HTML mới bằng cách gọi lại
$p = $dom->createElement('p');
50

Lấy dữ liệu và thiết lập cấu trúc

Giả sử chúng ta cần tạo một biểu mẫu trên máy chủ bằng cách sử dụng dữ liệu từ nhà cung cấp CRM và đánh dấu của riêng chúng ta. Phản hồi API từ CRM trông như thế này

$p = $dom->createElement('p');
8

Ví dụ này không sử dụng cấu trúc dữ liệu chính xác của bất kỳ CRM cụ thể nào, nhưng nó khá tiêu biểu

Và giả sử chúng ta muốn đánh dấu của mình trông như thế này

$p = $dom->createElement('p');
9

$p = $dom->createElement('p');
52 đó là gì? . Miễn là đầu vào trống, nó khớp với
$p = $dom->createElement('p');
53, nhưng người dùng không thấy bất kỳ văn bản giữ chỗ hiển thị nào. Chỉ là loại điều bạn có thể làm khi chúng tôi kiểm soát đánh dấu

Bây giờ chúng ta đã biết kết quả mong muốn của mình là gì, đây là kế hoạch trò chơi

  1. Nhận định nghĩa trường và nội dung khác từ API
  2. Khởi tạo một
    $p = $dom->createElement('p');
    19
  3. Lặp lại các trường và xây dựng từng trường theo yêu cầu
  4. Nhận đầu ra HTML

Vì vậy, hãy bỏ qua quy trình của chúng tôi và tìm hiểu một số kỹ thuật

$p = $dom->createElement('p');
3

Cho đến nay, chúng tôi đã nhận được dữ liệu và phân tích cú pháp, khởi tạo

$p = $dom->createElement('p');
19 của chúng tôi và lặp lại đầu ra của nó. Chúng ta muốn làm gì cho từng lĩnh vực?

$p = $dom->createElement('p');
7

Vì chúng tôi đang ở trong một vòng lặp và PHP không có các biến phạm vi trong các vòng lặp, chúng tôi đặt lại phần tử

$p = $dom->createElement('p');
58 trên mỗi lần lặp. Sau đó, nếu trường có nhãn, chúng tôi xây dựng phần tử. Cuối cùng, chúng tôi nối nó vào phần tử vùng chứa

Lưu ý rằng chúng ta thiết lập các lớp bằng phương thức

$p = $dom->createElement('p');
59. Không giống như API Web, rất tiếc là không có sự chuyển giao danh sách lớp đặc biệt nào. Chúng chỉ là một thuộc tính khác. Nếu chúng ta có một số logic lớp thực sự phức tạp, vì It’s Just PHP™, chúng ta có thể tạo một mảng và sau đó ẩn nó.
______380.

Đầu vào đơn

Vì chúng tôi biết rằng API sẽ chỉ trả về các loại trường cụ thể, nên chúng tôi có thể chuyển đổi loại và viết mã cụ thể cho từng loại

$p = $dom->createElement('p');
70

Bây giờ, hãy xử lý các vùng văn bản, các hộp kiểm đơn lẻ và các trường ẩn

$p = $dom->createElement('p');
71

Bạn có nhận thấy điều gì đó mới mà chúng tôi đang thực hiện đối với hộp kiểm và các trường hợp ẩn không? . Đối với một trường hộp kiểm duy nhất, chúng tôi muốn sửa đổi lớp của vùng chứa, vì vậy chúng tôi có thể căn chỉnh hộp kiểm và nhãn theo chiều ngang;

Bây giờ nếu chúng ta chỉ đơn thuần nối các chuỗi, thì sẽ không thể thay đổi vào thời điểm này. Chúng tôi sẽ phải thêm một loạt các câu lệnh

$p = $dom->createElement('p');
18 liên quan đến loại phần tử và siêu dữ liệu của nó ở đầu khối. Hoặc, có thể tệ hơn, chúng tôi bắt đầu cách
$p = $dom->createElement('p');
85 sớm hơn, sau đó sao chép-dán rất nhiều mã chung giữa mỗi nhánh

Và đây là vẻ đẹp thực sự của việc sử dụng một công cụ xây dựng như

$p = $dom->createElement('p');
19 — cho đến khi chúng tôi đạt được
$p = $dom->createElement('p');
50 đó, mọi thứ vẫn có thể chỉnh sửa được và mọi thứ vẫn có cấu trúc

Các phần tử vòng lặp lồng nhau

Hãy thêm logic cho các phần tử

$p = $dom->createElement('p');
88

$p = $dom->createElement('p');
72

OK, có rất nhiều thứ đang diễn ra ở đây, nhưng logic cơ bản là giống nhau. Sau khi thiết lập

$p = $dom->createElement('p');
88 bên ngoài, chúng tôi tạo một mảng gồm các
$p = $dom->createElement('p');
90 để nối bên trong nó

Chúng tôi cũng đang thực hiện một số mánh khóe dành riêng cho

$p = $dom->createElement('p');
88 tại đây. Nếu không có tùy chọn được chọn trước, chúng tôi sẽ thêm một tùy chọn giữ chỗ trống đã được chọn nhưng người dùng không thể chọn. Mục tiêu là đặt
$p = $dom->createElement('p');
92 của chúng ta làm “placeholder” bằng cách sử dụng CSS, nhưng kỹ thuật này có thể hữu ích cho tất cả các loại thiết kế. Bằng cách thêm nó vào
$p = $dom->createElement('p');
93 trước khi thêm các tùy chọn khác, chúng tôi đảm bảo rằng đó là tùy chọn đầu tiên trong đánh dấu

Bây giờ, hãy xử lý

$p = $dom->createElement('p');
94 nút radio và hộp kiểm

$p = $dom->createElement('p');
73

Vì vậy, trước tiên, chúng tôi xác định xem bộ trường có dành cho hộp kiểm hoặc nút radio hay không. Sau đó, chúng tôi đặt lớp vùng chứa phù hợp và xây dựng

$p = $dom->createElement('p');
94. Sau đó, chúng tôi lặp lại các lựa chọn có sẵn và xây dựng một
$p = $dom->createElement('p');
96 cho mỗi một với một
$p = $dom->createElement('p');
81 và một
$p = $dom->createElement('p');
56

Lưu ý rằng chúng tôi sử dụng phép nội suy chuỗi PHP thông thường để đặt lớp vùng chứa trên dòng 21 và để tạo một ID duy nhất cho mỗi lựa chọn trên dòng 30

mảnh vỡ

Một loại cuối cùng mà chúng tôi phải thêm vào hơi phức tạp hơn vẻ ngoài của nó. Nhiều biểu mẫu bao gồm các trường hướng dẫn, không phải là đầu vào mà chỉ là một số HTML mà chúng tôi cần in giữa các trường khác

Chúng ta sẽ cần tiếp cận một phương pháp

$p = $dom->createElement('p');
19 khác,
$p = $dom->createElement('p');
30. Điều này cho phép chúng tôi thêm HTML tùy ý mà không cần sử dụng cấu trúc DOM

$p = $dom->createElement('p');
74

Tại thời điểm này, bạn có thể tự hỏi làm thế nào chúng tôi tìm thấy chính mình với một đối tượng được gọi là

$p = $dom->createElement('p');
93, thực sự đại diện cho một phần tử tĩnh
$p = $dom->createElement('p');
32. Mục tiêu là sử dụng một tên biến chung cho mỗi lần lặp lại vòng lặp trường, vì vậy, cuối cùng, chúng ta luôn có thể thêm nó bằng cách sử dụng
$p = $dom->createElement('p');
33 bất kể loại trường thực tế là gì. Vì vậy, yeah, đặt tên cho mọi thứ là khó khăn

Thẩm định

API chúng tôi đang sử dụng vui lòng cung cấp thông báo xác thực riêng cho từng trường bắt buộc. Nếu có lỗi gửi, chúng tôi có thể hiển thị lỗi nội tuyến cùng với các trường, thay vì thông báo chung chung "rất tiếc, lỗi của bạn" ở dưới cùng

Hãy thêm văn bản xác thực vào từng phần tử

$p = $dom->createElement('p');
75

Đó là tất cả những gì nó cần. Không cần phải loay hoay với logic loại trường — chỉ cần xây dựng một phần tử có điều kiện cho mỗi trường

Mang tất cả lại với nhau

Vậy điều gì sẽ xảy ra sau khi chúng ta xây dựng tất cả các thành phần trường? . Chúng tôi cũng có thể sử dụng cơ hội để thêm các thuộc tính phổ biến, như

$p = $dom->createElement('p');
37. Sau đó, chúng tôi sẽ thêm nút gửi, nút này tách biệt với các trường trong API này

$p = $dom->createElement('p');
76

Tại sao chúng tôi kiểm tra xem

$p = $dom->createElement('p');
93 có đúng sự thật không?

Xin chào, một biểu mẫu HTML tùy chỉnh

Điểm thưởng. hàng và cột

Như bạn có thể biết, nhiều trình tạo biểu mẫu cho phép tác giả đặt hàng và cột cho các trường. Ví dụ: một hàng có thể chứa cả trường tên và họ, mỗi trường trong một cột có chiều rộng 50%. Vì vậy, làm thế nào chúng ta sẽ thực hiện điều này, bạn yêu cầu?

Phản hồi API của chúng tôi bao gồm dữ liệu lưới như thế này

$p = $dom->createElement('p');
77

Chúng tôi giả định rằng việc thêm thuộc tính

$p = $dom->createElement('p');
71 là đủ để tạo kiểu cho chiều rộng, nhưng mỗi hàng cần phải là phần tử riêng của nó (i. e. không có lưới CSS)

Trước khi chúng tôi đi sâu vào, hãy nghĩ về những gì chúng tôi cần để thêm hàng. Logic cơ bản diễn ra như thế này

  1. Theo dõi hàng mới nhất gặp phải
  2. Nếu hàng hiện tại lớn hơn, tôi. e. chúng tôi đã chuyển sang hàng tiếp theo, tạo một thành phần hàng mới và bắt đầu thêm vào hàng đó thay vì hàng trước đó

Bây giờ, chúng ta sẽ làm điều này như thế nào nếu chúng ta nối các chuỗi? . Loại “chuỗi HTML đảo ngược” này luôn khiến tôi rất khó hiểu, vì vậy tôi chỉ có thể tưởng tượng IDE của mình cảm thấy thế nào. Và điều tuyệt vời nhất là nhờ có các thẻ mở tự động đóng của trình duyệt, một lỗi đánh máy duy nhất sẽ dẫn đến hàng triệu

$p = $dom->createElement('p');
96 lồng nhau. Cũng giống như niềm vui, nhưng ngược lại

Vậy cách có cấu trúc để xử lý việc này là gì? . Trước tiên, hãy thêm theo dõi hàng trước vòng lặp của chúng ta và xây dựng một phần tử vùng chứa hàng bổ sung. Sau đó, chúng tôi sẽ đảm bảo nối từng vùng chứa

$p = $dom->createElement('p');
74 vào
$p = $dom->createElement('p');
75 của nó thay vì trực tiếp vào
$p = $dom->createElement('p');
76

$p = $dom->createElement('p');
78

Cho đến nay, chúng tôi vừa thêm một

$p = $dom->createElement('p');
96 khác xung quanh các trường. Hãy xây dựng một phần tử hàng mới cho mỗi hàng bên trong vòng lặp

$p = $dom->createElement('p');
79

Tất cả những gì chúng ta cần làm là ghi đè đối tượng

$p = $dom->createElement('p');
75 dưới dạng một phần tử DOM mới và PHP coi nó như một đối tượng duy nhất mới. Vì vậy, ở cuối mỗi vòng lặp, chúng tôi chỉ thêm bất kỳ giá trị nào của
$p = $dom->createElement('p');
75 hiện tại - nếu nó vẫn giống như trong lần lặp trước, thì biểu mẫu được cập nhật;

Chúng ta sẽ đi đâu từ đây?

Các biểu mẫu là một trường hợp sử dụng tuyệt vời cho việc tạo khuôn mẫu hướng đối tượng. Và khi nghĩ về đoạn mã đó từ WordPress Core, một lập luận có thể được đưa ra rằng các menu lồng nhau cũng là một trường hợp sử dụng tốt. Bất kỳ tác vụ nào mà việc đánh dấu tuân theo logic phức tạp đều là ứng cử viên sáng giá cho phương pháp này.

$p = $dom->createElement('p');
19 có thể xuất bất kỳ XML nào, vì vậy bạn cũng có thể sử dụng nó để tạo nguồn cấp RSS từ dữ liệu bài đăng

Đây là toàn bộ đoạn mã cho biểu mẫu của chúng tôi. Vui lòng điều chỉnh nó với bất kỳ API biểu mẫu nào mà bạn thấy mình đang xử lý. Đây là tài liệu chính thức, rất hữu ích để hiểu về API có sẵn

Chúng tôi thậm chí còn chưa đề cập đến việc

$p = $dom->createElement('p');
19 có thể phân tích cú pháp HTML và XML hiện có. Sau đó, bạn có thể tra cứu các phần tử bằng API XPath, tương tự như
$p = $dom->createElement('p');
702 hoặc
$p = $dom->createElement('p');
703 trên Node. js. Có một chút đường cong học tập, nhưng đó là một API siêu mạnh để xử lý nội dung bên ngoài

Sự thật thú vị. Các tệp Microsoft Office kết thúc bằng

$p = $dom->createElement('p');
704 (e. g.
$p = $dom->createElement('p');
705) là các tệp XML. Đừng nói với bộ phận tiếp thị, nhưng có thể phân tích tài liệu Word và xuất HTML trên máy chủ

Điều quan trọng nhất là hãy nhớ rằng tạo khuôn mẫu là một siêu năng lực. Có thể xây dựng đánh dấu phù hợp cho tình huống phù hợp có thể là chìa khóa cho một UX tuyệt vời