Найденный под "app/code/core/Mage/Page/Block/Html/Header.php":
public function getWelcome()
{
if (empty($this->_data['welcome'])) {
if (Mage::app()->isInstalled() && Mage::getSingleton('customer/session')->isLoggedIn()) {
$this->_data['welcome'] = $this->__('Welcome, %s!', Mage::getSingleton('customer/session')->getCustomer()->getName());
} else {
$this->_data['welcome'] = Mage::getStoreConfig('design/header/welcome');
}
}
return $this->_data['welcome'];
}
, Таким образом, это похоже Mage::getSingleton('customer/session')->getCustomer()
, доберется, Ваш ток вошел в систему клиент;)
Для получения в настоящее время входил в систему администратор:
Mage::getSingleton('admin/session')->getUser();
Ваша проблема выражается в следующем: у вас есть файл XSM, который не соответствует схеме, и вы хотите преобразовать его во что-то действительное.
С помощью XSOM вы можете прочитать структуру в XSD и, возможно, проанализировать XML, но все равно потребуется дополнительное отображение недопустимой формы на допустимую. Использовать таблицу стилей было бы намного проще, потому что вам пришлось бы проходить через XML, используя узлы XPath для обработки элементов в правильном порядке. В XML, где вы хотите, чтобы яблоки были перед грушами, таблица стилей сначала скопирует узел яблока (/ Fruit / Apple), а затем узел груши. Таким образом, независимо от порядка в старом файле, они будут в правильном порядке в новом файле.
Что вы могли сделать с XSOM, так это прочитать XSD и сгенерировать таблицу стилей, которая изменит порядок данных. Затем преобразуйте XML, используя эту таблицу стилей. как только XSOM сгенерировал таблицу стилей для XSD, вы можете просто повторно использовать таблицу стилей до тех пор, пока XSD не будет изменен или пока не потребуется другой XSD.
Конечно, вы можете использовать XSOM для немедленного копирования узлов в правильном порядке. Но поскольку это означает, что ваш код должен пройти через все узлы и дочерние узлы, для завершения обработки может потребоваться некоторое время. Таблица стилей будет делать то же самое, но преобразователь сможет все это обработать быстрее. Он может работать непосредственно с данными, в то время как код Java должен будет получать / устанавливать каждый узел через свойства XMLDocument.
Когда я думаю об этом, мне интересно, было ли это уже сделано раньше. Он был бы очень общим и мог бы обрабатывать почти каждый XSD / XML.
Давайте посмотрим ... Используя "// xsd: element / @ name", вы получите все имена элементов в схеме. Каждое уникальное имя необходимо преобразовать в шаблон. В этих шаблонах вам нужно будет обработать дочерние узлы конкретного элемента, что немного сложнее получить. Элементы могут иметь ссылку, которой вам нужно будет следовать. В противном случае получить все дочерние узлы xsd: element it.
У меня пока нет хорошего ответа на этот вопрос, но я должен отметить, что здесь есть вероятность двусмысленности. Рассмотрим эту схему:
<xs:element name="root">
<xs:choice>
<xs:sequence>
<xs:element name="foo"/>
<xs:element name="bar">
<xs:element name="dee">
<xs:element name="dum">
</xs:element>
</xs:sequence>
<xs:sequence>
<xs:element name="bar">
<xs:element name="dum">
<xs:element name="dee">
</xs:element>
<xs:element name="foo"/>
</xs:sequence>
</xs:choice>
</xs:element>
и этот входной XML:
<root>
<foo/>
<bar>
<dum/>
<dee/>
</bar>
</root>
Это можно сделать так, чтобы оно соответствовало схеме, либо переупорядочив
и
, или переупорядочив
и
. Кажется, нет причин предпочитать одно другому.
По сути, вы хотите взять корневой элемент и оттуда рекурсивно просмотреть дочерние элементы в документе и дочерние элементы, определенные в схеме, и согласовать порядок.
Я дам вам решение C # -синтаксиса, поскольку это то, что я кодирую днем и ночью, оно довольно близко к Java. Обратите внимание, что мне придется догадываться о XSOM, поскольку я не знаю его API. Я также придумал методы XML Dom, поскольку предоставление ваших C #, вероятно, не поможет :)
// предполагаем, что первым вызовом является SortChildrenIntoNewDocument (sourceDom.DocumentElement, targetDom.DocumentElement, schema.RootElement)
public void SortChildrenIntoNewDocument( XmlElement source, XmlElement target, SchemaElement schemaElement )
{
// whatever method you use to ask the XSOM to tell you the correct contents
SchemaElement[] orderedChildren = schemaElement.GetChildren();
for( int i = 0; i < orderedChildren.Length; i++ )
{
XmlElement sourceChild = source.SelectChildByName( orderedChildren[ i ].Name );
XmlElement targetChild = target.AddChild( sourceChild )
// recursive-call
SortChildrenIntoNewDocument( sourceChild, targetChild, orderedChildren[ i ] );
}
}
Я бы не стал Не рекомендую рекурсивный метод, если это будет глубокое дерево, в этом случае вам придется создать некоторые объекты типа «обходчик дерева». Преимущество такого подхода в том, что вы »