Генерация кода с XML


Я работаю на мой проект выпускника и я наткнулся на несколько дилемме, мне удалось решить некоторые обходные пути, но у меня есть сомнения, что это наиболее эффективный способ борьбы с этой проблемой.

Я пишу класс для работы с API Plesk и делая ее максимально гибкой для легкого использования.

Вот функция для генерации XML, который будет отправлять как запрос:

private function emailCreatePacket($domain, $params){
    // Create new XML document.
    $xml = new DomDocument('1.0', 'UTF-8');
    $xml->formatOutput = true;

    // Create packet
    $packet = $xml->createElement('packet');
    $packet->setAttribute('version', '1.4.2.0');
    $xml->appendChild($packet);
    $mail = $xml->createElement('mail');
    $packet->appendChild($mail);
    $create = $xml->createElement('create');
    $mail->appendChild($create);
    $filter = $xml->createElement('filter');
    $create->appendChild($filter);
    $domain_id = $xml->createElement('domain_id', $domain->id);
    $filter->appendChild($domain_id);
    $mailname = $xml->createElement('mailname');
    $filter->appendChild($mailname);
    foreach ($params as $key => $value) { 
        $node = $mailname;
        if(strpos($key, ':') !== false){
            $split = explode(':', $key);
            $key = $split[1];
            $node = ${$split[0]};
            if(!isset(${$split[0]})){
                ${$split[0]} = $xml->createElement($split[0]);
                $mailname->appendChild(${$split[0]});
            }
            $xmlelement = $xml->createElement($key, $value);
            ${$split[0]}->appendChild($xmlelement);
        }else{
            $xmlelement = $xml->createElement($key, $value); 
            $node->appendChild($xmlelement);
        }
    }
    return $xml->saveXML();
}

Вот мои общественные функции:

public function createEmail($host, $domain, $params){
    $curl = $this->curlInit($host);
    $packet = $this->emailCreatePacket($domain, $params);
    echo $packet;
    $response = $this->sendRequest($curl, $packet);
    echo $response;
    if($this->parseResponse($response)){
        return true;
    }
}

Вот несколько функций называется:

private function curlInit($host)
    {
        $security = new Security();
        $password = $security->decode($host['host_pass']);
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, "https://{$host['host_address']}:{$host['host_port']}/{$host['host_path']}");
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_POST,           true);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);    
        curl_setopt($curl, CURLOPT_HTTPHEADER,
             array("HTTP_AUTH_LOGIN: {$host['host_user']}",
                    "HTTP_AUTH_PASSWD: {$password}",
                    "HTTP_PRETTY_PRINT: TRUE",
                    "Content-Type: text/xml")
        );    
        return $curl;
    }

private function sendRequest($curl, $packet){
        curl_setopt($curl, CURLOPT_POSTFIELDS, $packet);
        $result = curl_exec($curl);
        if (curl_errno($curl)) {
            $error  = curl_error($curl);
            $errorcode = curl_errno($curl);
            curl_close($curl);
            throw new Exception("Er is iets mis gegaan: <br /><br /> Foutcode: " . $errorcode . "<br /> Foutmelding: " . $error );
        }
        curl_close($curl);
        return $result;
    }

private function parseResponse($response){
    $xml = new SimpleXMLElement($response);
    $status = $xml->xpath('//status');
    if($status[0] == "error"){
        $errorcode = $xml->xpath('//errcode');
        $errortext = $xml->xpath('//errtext');
        throw new Exception("Er is iets mis gegaan: <br /><br /> Foutcode: ". $errorcode[0] . "<br /> Foutmelding: " . $errortext[0]);
    }else{
        return $response;
    }
}

Вот код, который я использую для вызова моей функции:

<?php

/**
 * @author Jeffro
 * @copyright 2011
 */

require('init.php');

$security = new Security();

if($security->sslactive()){
    try
    {
        $hosts = new Hosts();
        $host = $hosts->getHost("192.168.1.60");
        $pleskapi = new PleskApi();
        $client = $pleskapi->getClientInfo($host, 'janbham');
        $domain = $pleskapi->getDomainInfo($host, "lol.nl");
    $params = array('name' => 'ohecht', 'mailbox:enabled' => 'true', 'mailbox:quota' => '100000000', 'alias' => 'aapjesrollen', 'password' => 'testmail', 'permissions:manage_drweb' => 'true');
    $pleskapi->createEmail($host, $domain, $params);
    }
    catch (Exception $ex)
    {
        echo $ex->GetMessage();
    }
}else{
    ?>
    SSL needs to be active
    <?php
}

?>

Проблема была в отношении структуры API использует его глубже вложенность каждый раз (который я теперь решена с помощью ':' в качестве разделителя)



676
7
задан 21 марта 2011 в 01:03 Источник Поделиться
Комментарии
1 ответ

Вообще говоря, мне нравится ваш код. Я думаю, что это хорошо спланированная с несколько недостатков. Меня также поразил ваше использование в PHP DOMDocument класса. При создании XML через php, я обычно выбираю для оператора foreach петли и буферизации вывода. Я осознаю этот объект класса, но ваш пример-это первое, что я видел его использовать. +1 для показывать мне что-то новое! :Д

2
ответ дан 23 марта 2011 в 12:03 Источник Поделиться