我正在开发一个应该处理 XML 数据的 Web 应用程序,当我尝试编辑以前保存的数据时遇到了一些问题。
这就是我从一开始就在做的事情:用户必须填写一个包含多个输入的表单,我在控制器中获取该数据,使用 Xml::fromArray 将其转换为 XML 字符串并将其存储在单个数据库字段中。这完美地工作,生成的 XML 字符串正是我所需要的。这是表格的(部分)。
echo $this->Form->input('data.FT.Header.Transmission.Number');
echo $this->Form->input('data.FT.Header.Transmission.Format');
echo $this->Form->input('data.FT.Header.Transmission.Destination');
现在我正在尝试为该数据添加一个编辑功能。我从我的控制器中获取该数据,将其转换回具有 Xml::build 的对象,然后......这就是问题的开始。
如果我这样做
debug($invoice->data->FT->Header->Transmission);
一切看起来都很好,因为它告诉我我有一个包含以下内容的对象:
object(SimpleXMLElement) {
Number => 'Npslu'
Format => 'Rgytz'
Destination => 'Uheac'
}
但是,如果我尝试查看 $invoice->data->FT->Header->Transmission->Number 包含的内容,而不是字符串,我会得到一个空结果。这就是为什么(我认为)所有表单输入都是空的。
我查看了官方文档,尝试将其转换为数组(这应该是 cakephp 处理数据的旧方式)以及我想到的所有内容......仍然没有结果。
我究竟做错了什么?
更新:我设法以这种(肮脏的)方式创建了一个工作对象:
$array = Xml::toArray( Xml::build( $xmlString ) );
$object = json_decode(json_encode($array), FALSE);
现在,如果我调试 $invoice->data->FT->Header->Transmission 我有正确的值,这在我的情况下是一个巨大的进步:)
问题是表单助手仍然无法识别该值。如果我的编辑模板中有这个
echo $this->Form->input('data.FT.Header.Transmission.Number');
然后该字段为空。如果我以这种方式指定它的值
echo $this->Form->input('data.FT.Header.Transmission.Number', array('value' => $invoice->data->FT->Header->Transmission->Number);
它应该正常工作。我知道我可以指定每个值,但我想自动使用它,就像我在该页面中拥有的其他字段(非 XML 相关)一样,例如 $invoice->sent 被 $this-> 正确识别表单->输入('发送')...
更新 2:这是 XML 生成的代码:
<?xml version="1.0" encoding="UTF-8"?>
<FT>
<Header>
<Transmission>
<Number>1234</Number>
<Format>qwer</Format>
<Destination>asdf</Destination>
</Transmission>
</Header>
</FT>
这些是我用来将输入字段的值转换为 XML 并返回的函数:
// Values to XML, called from the add function this way:
// $this->request->data['data'] = $this->_arrayToXml($this->request->data['data']);
protected function _arrayToXml($array) {
$xmlObject = Xml::fromArray($array);
$xmlString = $xmlObject->asXML();
return $xmlString;
}
// XML to Values, called from the edit function this way:
// $invoice->data = $this->_xmlToObject($invoice->data);
protected function _xmlToObject($xmlString) {
$array = Xml::toArray( Xml::build( $xmlString ) );
$object = json_decode(json_encode($array), FALSE);
return $object;
}
ps 如果您看到一些细微的不一致,请原谅我,我正在尝试删除所有不相关的代码以避免发布大量代码...