Вывод информации из базы данных в нескольких форматах
В настоящее время я создаю CMS, и одной из основных функций CMS является система передачи данных. Веб-сайт должен передавать содержимое одной из своих баз данных большому количеству сайтов, включенных в список. Каждый сайт имеет свои собственные спецификации для форматирования этой информации, и мне было поручено создать бэкэнд, который можно использовать для простого изменения и добавления каналов данных для непрограммистов.
Пока что из форматов, которые я получил, есть три типа файлов: XML, CSV и TXT. Существуют разные стандарты форматирования даже внутри этих типов файлов, разный порядок полей, некоторые имеют цитаты, некоторые нет и т. Д. Я некоторое время ломал голову над этим, и вот мое решение:
- Каждый канал будет иметь шаблон, хранящийся в отдельной таблице базы данных. Шаблоны будут состоять из любой структуры, которая требуется фиду (XML, CSV, TXT) со значением заполнителя (например, {{NAME}}). Затем скрипт будет перебирать каждую запись в базе данных, заменять заполнители значениями переменных и сохранять заполненный документ с правильным расширением файла.
Моя проблема состоит в том, чтобы выяснить, как сохранить несколько файлов, используя один файл PHP (возможно, вызывая один и тот же файл несколько раз из другого файла PHP?), И, кроме того, как сохранить файлы разных типов, как этот. Как установить расширение и сохранить файл?
2 ответа
Вы сохраняете несколько файлов, как вы сохраняете первый.
Если у вас есть содержимое файлов в $filecontent
и имя файла, которое будет использоваться (с соответствующим расширением) в $filepath
, ты можешь использовать
file_put_contents($filename, $filecontent)
Сделайте это в своем цикле, и все готово.
Для получения дополнительной информации о файле file_put_contents см. Справочную страницу php.
Я бы порекомендовал объектно-ориентированный подход ко всему этому:
1) Создайте интерфейсы для каждого типа данных, в который вам нужно преобразовать каждый объект
interface xmlSerializable {
public function toXML();
}
interface csvSerializable {
public function toCSV();
}
interface txtSeriablizable() {
public function toTXT();
}
2) Создайте класс для представления типа данных, которые вам нужно сериализовать в различные форматы для ваших клиентов, и implement
каждый из интерфейсов
class Data implements xmlSerializeable { // I only implemented one for brevity
private $id = null;
private $stuff = null;
private $otherStuff = null;
private $stuffArray = array();
public __construct($id, $stuff, $otherStuff, $stuffArray) {
$this->id = $id;
$this->stuff = $stuff;
$this->otherStuff = $otherStuff;
$this->stuffArray = $stuffArray;
}
public function getId() { return $this->id; }
public function toXML() {
$output = '<?xml version="1.0" encoding="UTF-8"?>'."\n".
'<data>'."\n\t".
'<id>'.$this->id.'</id>'."\n\t".
'<stuff>'.$this->stuff.'</stuff>'."\n\t".
'<otherStuff>'.$this->otherStuff.'</otherStuff>'."\n\t".
'<stuffArray>'."\n\t\t";
foreach($this->stuffArray as $stuff) {
$output .= '<stuff>'.$stuff.'</stuff>'."\n\t\t";
}
$output .= '</stuffArray>'."\n".
'</data>';
return $output;
}
}
Теперь вы можете создавать Data
объекты из вашей базы данных путем создания DataFactory
который принимает запрос SQL и возвращает массив Data
объекты. Чтобы сериализовать их, просто вызовите метод, который вы реализовали для каждого формата:
$df = new DataFactory($pdo);
$datas = $df->query('SELECT * FROM Data');
foreach($datas as $data) {
file_put_contents('/data/xml/'.$data->getId().'.xml', $data->toXML());
// You can add other formats here in the above fashion
}