#php #json
#php #json
Вопрос:
Я работаю над легким встроенным редактором контента для своего сайта. Подобно CushyCMS или SurrealCMS, «редактируемые» элементы моей страницы определяются с class="editable"
помощью .
Я хотел бы передать 2 переменные в php через AJAX:
$page
Документ, в который нужно записать (например. ‘/path/index.html ‘)
$json
Строка json: {"0":"First Content","1":"Second Content","2":"Third Content"}
где ключ — это индекс всех элементов с class="editable"
, а значение — это innerHTML каждого элемента.
Как я могу открывать $page
и находить / заменять элементы в PHP 5.3 class="editable"
?
$page = $_POST['page'];
$json = $_POST['json'];
$doc = new DOMDocument();
$doc = DOMDocument::loadHTMLFile($page);
// Detect DOM elements with class="editable" amp; replace content with JSON data
// Save changes to designated file
$doc->saveHTMLFile($page); // Write to file eg, 'index.html'
echo ('Success');
Комментарии:
1. Что теперь выводит ваш цикл for? Кроме того, я бы не просто «echo (‘success’)», я бы сделал, если (fwrite($ fp, $ html)) echo ‘success’;
2. Спасибо за подсказку echo! Прямо сейчас я вхожу
Parse error: syntax error, unexpected ')'
в курсforeach ($ret[$i]) {
дела .3. О, да. Это не синтаксис foreach . Я дам ответ ниже.
Ответ №1:
Вы можете использовать XPath для отслеживания всех редактируемых элементов в DOM.
$xpath = new DOMXPath($doc);
$entries = $xpath->query('//*[@class="editable"]');
$edits = json_decode($json, true);
$num_edits = count($edits);
for($i=0; $i<$num_edits; $i )
{
$f = new DOMDocument();
$edit = mb_convert_encoding($edits[$i], 'HTML-ENTITIES', "UTF-8");
$f->loadHTML($edit);
$node = $f->documentElement->firstChild;
$entries->item($i)->nodeValue = "";
foreach($node->childNodes as $child) {
$entries->item($i)->appendChild($doc->importNode($child, true));
}
}
Здесь это снова в контексте вашего исходного кода:
$page = $_POST['page'];
$json = $_POST['json'];
$doc = new DOMDocument();
$doc = DOMDocument::loadHTMLFile($page);
// Detect DOM elements with class="editable" amp; replace content with JSON data
$xpath = new DOMXPath($doc);
$entries = $xpath->query('//*[@class="editable"]');
$edits = json_decode($json, true);
$num_edits = count($edits);
for($i=0; $i<$num_edits; $i )
{
$f = new DOMDocument();
$edit = mb_convert_encoding($edits[$i], 'HTML-ENTITIES', "UTF-8");
$f->loadHTML($edit);
$node = $f->documentElement->firstChild;
$entries->item($i)->nodeValue = "";
foreach($node->childNodes as $child) {
$entries->item($i)->appendChild($doc->importNode($child, true));
}
}
// Save changes to designated file
$doc->saveHTMLFile($page); // Write to file eg, 'index.html'
echo ('Success');
Комментарии:
1.
nodeValue
похоже, преобразует мои html-теги в обычный текст. Можно ли в любом случае сохранить его как innerHTML?2. @Josiah: Я улучшил
for
цикл из-за недавнего открытия, что старый код обрабатывал только правильно сформированный XHTML, но HTML. Теперь у него не должно быть проблем ни с тем, ни с другим.
Ответ №2:
Вероятно, задание для DOMDocument
или simplehtmldom
.
Комментарии:
1. У вас есть пример? Я новичок в PHP :). Спасибо!
Ответ №3:
Для этого вам не нужен цикл foreach, если цикл for предоставляет индексы. Попробуйте это:
// Write JSON content to class="editable" elements
for ($i = 0; $i < $ret->length; $i ) {
echo $data[$i];
}
Ответ №4:
Вы можете использовать QueryPath, библиотеку PHP для работы с XML и HTML. Как jQuery для PHP.
С их сайта:
QueryPath — это библиотека PHP для работы с XML и HTML. Он предназначен для работы не только с локальными файлами, но и с веб-сервисами и ресурсами базы данных. Он реализует большую часть интерфейса jQuery, но он сильно настроен для использования на стороне сервера.