У меня есть файл xml, в котором я хотел бы создать форму / таблицу для добавления, редактирования и удаления записей с помощью PHP. В настоящее время я использую simpleXML для загрузки XML-файла и отображения его содержимого на различных страницах.
Есть ли способ создать таблицу, которая показывает все результаты и позволяет мне редактировать или удалять эту конкретную строку таблицы, которая представляет собой полную запись в файле XML.
При нажатии кнопки редактирования я хотел бы, чтобы сведения из записи отображались в форме, которую пользователь может изменить, а затем сохранить, обновив XML-файл и соответствующую веб-страницу.
Мне нужно, чтобы это было сделано на PHP, предпочтительно с использованием SimpleXML, хотя я открыт для предложений других способов сделать это с помощью PHP.
Ваше здоровье






Я бы посоветовал вам использовать DomDocument и DomXPath, а не SimpleXml. Однако в целом XML не является оптимальным носителем для хранения данных - вам, вероятно, следует использовать базу данных для того, что вы делаете. Если вам нужно легко обмениваться данными, вы могли бы использовать SQLite вместо более распространенного MySql.
Вы можете использовать собственную базу данных XML для облегчения создания, добавления, обновления и извлечения XML-документов и узлов. В прошлом я успешно использовал БерклиDBXML (теперь часть Oracle). Также доступна библиотека PHP.
XSLT - ваш друг для преобразования файла базы данных XML в формат, который вы хотите отображать на веб-странице. Вы создаете шаблон XSL, который включает весь HTML-код, который вы хотите для каждой записи, а затем выполняете итерацию по XML-файлу с помощью оператора for-each. Я дам приблизительный обзор и при необходимости могу помочь с более подробной информацией.
Вот общий файл PHP, который я использую для выполнения XSLT (обработки файла XML с файлом XSL) через AJAX. Этот настроен для работы с обязательными (и, если желательно, необязательными) входными данными, передаваемыми в вызове GET из браузера. p # n и p # v (см. комментарии в верхней части кода ниже) - это пары параметров и значений, которые должны быть переданы в документ XSL в тех случаях, когда вы хотите использовать какой-либо входной параметр, чтобы повлиять на вывод. В этом случае вывод возвращается обратно в браузер. Вот PHP для запуска базы данных XML и преобразование XSLT для создания HTML для вашего веб-дисплея (таблицы или того, что вы поместили в шаблон файла XSL):
<?php
//REQUIRED INPUTS:
// - xml: path to xml document
// - xsl: path to xsl style sheet
// - pCount: number of parameters to be passed to xslt (send zero '0' if none)
//OPTIONAL INPUTS (must have as many as specified in pCount, increment '1' in
//names below up a number for each iteration):
// - p1n: name of first parameter
// - p1v: value of first parameter
//SET Paths
$xmlPath = $_GET['xml'];
$xslPath = $_GET['xsl'];
// Load the XML source
$xml = new DOMDocument;
$xml->load($xmlPath);
$xsl = new DOMDocument;
$xsl->load($xslPath);
// Configure the transformer
$proc = new XSLTProcessor;
$proc->importStyleSheet($xsl); // attach the xsl rules
//Set Parameter(s), if present
$xslParamCount = $_GET['pCount']; //Check number of xsl parameters specified in GET
for ($i=1; $i<=$xslParamCount; $i++){
$xslParamName = $_GET['p'.$i.'n'];
$xslParamValue = $_GET['p'.$i.'v'];
$proc->setParameter( '', $xslParamName, $xslParamValue); //Set parameters for XSLTProcessor
}
// TRANSFORM
echo $proc->transformToXML($xml);
// SET Mime Type
$mime = "application/xhtml+xml";
$charset = "iso-8859-1";
header("Content-Type: $mime;charset=$charset");
?>
Ниже приведен пример шаблона файла XSL, который принимает документ базы данных XML и преобразует его в HTML для вставки на веб-страницу. Обратите внимание на теги HTML span. Все теги xsl представляют собой инструкции по обработке, которые определяют, что входит в теги HTML и вокруг них в шаблоне. В этом случае мы фильтруем результаты и выбираем соответствующие данные для отображения на основе входных параметров, переданных в файл XSL (см. Элементы xsl: param вверху):
<?xml version='1.0' encoding='UTF-8'?>
<xsl:stylesheet xmlns:xsl='http://www.w3.org/1999/XSL/Transform' version='1.0'>
<xsl:param name='testId'/>
<!--Input options for following param: localUse, notLocalUse, nottestId, or '' (all)-->
<xsl:param name='matchType'/>
<xsl:template match='/'>
<xsl:choose>
<xsl:when test = "$matchType='localUse'">
<xsl:for-each select = "//test[@id=$testId and @localUse='yes']">
<xsl:sort select = "../@id"/>
<div><xsl:if test='../@localPrefTestId=$testId'><xsl:attribute name='class'>preferredTest</xsl:attribute></xsl:if>
<span class='productStockCode'>
<xsl:if test='../@localPrefTestId=$testId'>
<xsl:attribute name='title'>Preferred test for this product</xsl:attribute>
</xsl:if>
<xsl:if test='../@localPrefTestId!=$testId'>
<xsl:attribute name='title'>Alternate (not preferred) test for this product - see note to right</xsl:attribute>
</xsl:if>
<xsl:value-of select='../@id'/>
</span>
<span class='productStockName'>
<xsl:if test='../@localPrefTestId=$testId'>
<xsl:attribute name='title'>Preferred test for this product</xsl:attribute>
</xsl:if>
<xsl:if test='../@localPrefTestId!=$testId'>
<xsl:attribute name='title'>Alternate (not preferred) test for this product - see note to right</xsl:attribute>
</xsl:if>
<xsl:value-of select='../@name'/>
</span>
<span class='producttestNote'>
<xsl:value-of select='child::localPrefNote'/>
</span>
<span class='productDeleteButton'>
<input onClick='remProdLink(this)' title='Click to remove link to this product' type='image' src='button_tiny_X_grey.bmp'></input>
</span>
</div>
</xsl:for-each>
</xsl:when>
<xsl:otherwise>
<p>Server Error: GET must specify matchType parameter value of 'localUse', 'notLocalUse', 'nottestId', or '' (for all)</p>
<p>matchType received: <xsl:value-of select='$matchType'/></p>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--Note the output method = "html" below is required for this to insert correctly into a web page; without this it may nest improperly if any divs are empty-->
<xsl:output method = "html" omit-xml-declaration = "yes"/>
</xsl:stylesheet>
Обратите внимание, что все тесты xsl являются выражениями XPath.
Чтобы удалить строку, у вас может быть кнопка в этой строке, которая вызывает функцию JavaScript с аргументом «this» (см. OnClick = 'remProdLink (this)' в коде выше) для ссылки на строку, а затем захватить уникальный идентификатор строка в JavaScript примерно такая:
function remProdLink(obj){
//get unique id via Dom from passed in object reference
//edit everything after "obj" below to get to the unique id in the record
var testCode = obj.parentNode.parentNode.firstChild.nextSibling.innerHTML;
//code to send AJAX POST to server with required information goes here
}
На стороне сервера ваш PHP получает POST AJAX с уникальным идентификатором, загружает файл базы данных XML в simpleXml, находит узел через XPath и удаляет его, примерно так:
<?php
//Move url encoded post data into variables
$testCode = $_POST['testCode']; //$testCode should be a unique id for the record
//load xml file to edit
$xml = simplexml_load_file('yourDatabase.xml');
//find target node for removal with XPath
$targets = $xml->xpath("//testCode[@id=$testCode]");
//import simpleXml reference into Dom to do removal
$dom2 = dom_import_simplexml($targets[0]);
$dom2->parentNode->removeChild($dom2);
//format xml to save indented tree (rather than one line) and save
$dom = new DOMDocument('1.0');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;
$dom->loadXML($xml->asXML());
$dom->save('yourDatabase.xml');
?>
Что касается редактирования элемента, у вас может быть другая функция JavaScript, вызываемая аналогично функции удаления, как указано выше, создать форму под этим элементом на веб-странице с кнопкой сохранения изменений, и при нажатии этой кнопки вызвать другую функцию JavaScript для AJAX POST на сервер, аналогично удалению. Только на этот раз ваш POST должен будет включать всю информацию, которая могла быть отредактирована в записи, вместе с уникальным идентификатором записи. Файл PHP найдет соответствующую запись (так же, как и при удалении), а затем вы можете либо отредактировать части этой записи в PHP, либо просто удалить ее, а затем создать и добавить новую версию записи.
Я не уверен, сколько деталей вам нужно. Надеюсь, это даст вам хорошее начало. Прокомментируйте, пожалуйста, мой ответ, если вам нужны более подробные сведения по какой-либо его части. Удачи!
@predikt: Спасибо, что уловили опечатку. Это должно было быть removeChild ($ dom2). Ответ обновлен.
ваш ответ включает строку в последней части кода относительно $ dom здесь: // импортировать ссылку simpleXml в Dom для удаления $ dom2 = dom_import_simplexml ($ target [0]); $ dom2-> parentNode-> removeChild ($ dom); но я не заметил, что $ dom инициализирован до этого фрагмента кода. Вы можете объяснить эту часть дальше? Спасибо за вклад и подробные образцы.