HTML-форма для ответа XML и ответ - PullRequest
0 голосов
/ 27 сентября 2010

У меня есть форма, которая выглядит следующим образом. Теперь клиент попросил преобразовать это в формат, который запрашивает и отправляет ответ в XML. Может кто-нибудь подсказать мне соответствующий учебник или пример на PHP. Кажется, есть много способов сделать это

<form action="" method='post'>
<table>
<tr><td>User Number </td><td><input type='text' name='task_user_no' value='<?=$task_user_no?>'></td></tr>
<tr><td>Date </td><td><input type='text' name='task_date' value='<?=$task_date?>'> (YYYYMMDD)</td></tr>
<tr><td>From Time </td><td><input type='text' name='task_from_time' value='<?=$task_from_time?>'>(HHMM)</td></tr>
<tr><td>To Time </td><td><input type='text' name='task_to_time' value='<?=$task_to_time?>'>(HHMM)</td></tr>
<tr><td>Message </td><td><input type='text' name='task_message' value='<?=$task_message?>'></td></tr>
<tr><td>&nbsp;</td><td><input type='submit' value='submit' name='submit' ></td></tr>
</form>

Ответы [ 2 ]

2 голосов
/ 27 сентября 2010

Ну, так как вы не предоставили подробности, я плохо изложил основы:

  1. Задание cron, взаимодействие с пользователем или какой-либо другой триггер вызывает запрос на удаленном сервере (RS)
  2. Сценарий php на RS создает запрос для отправки на сервер приложений (AS), на котором размещается ваш сайт / приложение
  3. AS анализирует переменные запроса и создает запрос для хранилища данных.
  4. AS выполняет запрос к хранилищу данных и преобразует результаты в формат XML
  5. AS отправляет ответ в виде XML на RS
  6. RS анализирует XML и делает все, что угоднонужно сделать с данными, которые он содержит

Итак, с учетом этих шагов приведу несколько примеров сценариев:

RS Server Script

// set up params for query:

$params = array(
  'task_no' => '0000000'
  'task_date' => 'YYYYMMDD',
  'task_from_time' => 'HHMM',
  'task_to_time' => 'HHMM',
  'taks_message' => 'The Message'
);

$client = curl_init('http://remote-server.com/task.php');

// return the response instead of outputting it
curl_setopt($client, CURLOPT_RETURNTRANSFER, true); 

// make it a POST request, use CURLOPT_GET for Get requests
curl_setopt($client, CURLOPT_POST, true);

// set the data to send.. if using get then intstead use http_build_query($params) and append the resuult to the URL used in curl_init
curl_setopt($client, CURLOPT_POSTFIELDS, $params);

$response = curl_exec($client);

// load the response as xml

try
{
  $responseXml = new SimpleXmlElement($response);

  // do stuff here with the result see SimpleXml documentation for working with the xml nodes

  exit;
}
catch(Exception $e)
{
   // log message from exception

   // exit with a non-zero status code may be important for cron or a shell invocation
   exit($e->getCode()); 
}

задачаСценарий .php на AS

// Im going to use PDO for simplicity sake
$db = new PDO($dsn, $user, $pass);
$query = 'SELECT * from table_name'
         .'WHERE task_user_no = :task_user_no' 
         .'AND task_date = :task_date' 
         .'AND task_from_time = :task_from_time'
         .'AND task_to_time = :task_to_time';

$stmt = $db->prepare($query);
$params = $_POST; // make a copy for binding
$xml = new DOMDocument('1.0', 'UTF-8');

// create some basic elements
$response = $xml->createElement('response');
$info = $xml->createElement('info');
$results = $xml->createElement('results');

// set up an array we can append later if there are errors
$errors = array();

foreach($params as $field => $value)
{
   $paramName = ':' . $field;

   switch($field)
   {
      case 'task_user_no':
        $paramType = PDO::PARAM_INT; // assuming an int pk/fk
        break;
      default:
        $paramType = PDO::PARAM_STR; // assuming string for all others
        break;
   }

   if(!$stmt->bindParam($paramName, $param[$field], $paramType))
   {

       $errors[] = $xml->createElement('error', sprintf(
          'Value for (%s) does not exist or is not of the proper type (%s).'
           $field,
           $paramType
       ));
   }
}

if(!$stmt->execute() && ($pdoError = $stmt->errorCode()))
{
   $errors[] = sprintf(
      'There was an error retrieving your data, Error (%s)',
      $pdoError
    );
}


while(false !== ($record = $stmt->fetch(PDO::FETCH_ASSOC)))
{
  $task = $xml->createElement('task');

  foreach($record as $col => $val)
  {
    $task->appendChild($xml->createElement($col, $val));

    $results->appendChild($task);
   }
}

if(!empty($errors))
{
   $errorsElement = $xml->createElement('errors');

   foreach($errors as $error)
   {
      $errorsElement->appendChild($xml->createElement('error', $error));
   }

  $info->appendChild($errorsElement);
}

$response->appendChild($info);
$response->appendChild($results);
$xml->appendChild($response);

$responseStr = $xml->saveXml();

header('Content-type: text/xml');
header('Content-length: '. strlen($responseStr));
header('HTTP/1.1 200 Ok');
print $responseStr;
exit;

Конечно, вы можете использовать существующие библиотеки для дальнейшего упрощения ... Например, вместо использования curl вы можете использовать Zend_Http_Client (который я определенно рекомендую, посколькуэто не только позволяетиспользовать curl, а также fopen и прямые розетки).ИЛИ для разбора ответа xml на AS вы можете использовать Zend_Dom_Query, что в основном позволяет вам работать с ответом xml способом, аналогичным jQuery (селекторы css и что не вместо xPath).

0 голосов
/ 27 сентября 2010

Посмотрите на Jquery Ajax Function

Doc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...