PHP CURL? AJAX? Импортировать XML-фид данных в виде динамического выпадающего меню

У меня есть компания, которая предоставляет фид данных для поискового инструмента, но я должен создать поисковый инструмент. Товарные запасы меняются ежечасно, поэтому у них есть канал для информации о продукте. Я могу получить канал, чтобы заполнить форму поиска, где клиенты могут искать на моем сайте, чтобы узнать, доступен ли продукт этого поставщика.

Может ли кто-нибудь указать мне правильное направление, чтобы проанализировать XML-канал и отобразить результаты в виде раскрывающегося списка в форме? Как только они выбирают первый элемент "Стиль", то должно появиться новое поле с именем "Цвет", которое снова возвращается из ленты во втором вызове (я думаю, что это будет второй вызов, передающий параметр, собранный в форме в первом). выбор.

Я не прошу никого писать это для меня, но я новичок в cURL (который, я думаю, мне нужно использовать) и SimpleXML, и мне просто нужны ссылки на хороший соответствующий учебник или несколько советов.

1 ответ

Решение

Ну, не очень понятно, как вы хотите, чтобы вещи происходили, поэтому трудно дать вам совет относительно того, используете ли вы XML Feed на стороне сервера или на стороне клиента.

Кроме того, вы не объяснили, как вы можете "получить" XML-фид. Это веб-сервис, который требует аутентификации? Что это за запрос? Или это просто файл, находящийся где-то в сети? Или это доступно локально?

Я предполагаю, что ваш фид не требует сложных запросов или аутентификации.

Итак, вот пример AJAX с использованием JQuery и GET-запроса

Пример XML (productsfeed.xml)

<products>
    <product id="prod1" name="iMac" price="2000" vendor="Apple">
        <stock>10</stock>
    </product>
    <product id="prod2" name="iPad" price="500" vendor="Apple">
        <stock>50</stock>
    </product>
    <product id="prod3" name="Galaxy S3" price="500" vendor="Samsung">
        <stock>100</stock>
    </product>
</products>

Пример HTML с вызовом ajax и выпадающим списком продуктов.

<!DOCTYPE HTML>
<html>
    <head>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
        <script>
        $(document).ready(function(){
            $.ajax({
                url: 'http://myhost.com/webservice', // Url to the webservice or feed
                // Here goes all the "shenanigans" regarding the web service, like
                // request type, headers to send, etc..
                success: function(xml) {
                    $(xml).find('product').each(function(){
                        var id     = $(this).attr('id');
                        var name   = $(this).attr('name');
                        var price  = $(this).attr('price');
                        var vendor = $(this).attr('vendor');
                        var stock  = $(this).find('stock').text();

                        var $selectItem = $('<option></option>');
                        $selectItem.attr('value', id);
                        $selectItem.attr('data-id', id);
                        $selectItem.attr('data-price', price);
                        $selectItem.attr('data-vendor', vendor);
                        $selectItem.attr('data-stock', stock);
                        $selectItem.html(name);

                        $selectItem.appendTo('#plist');
                    });

                }
            });
        });
        </script>
    </head>
    <body>
        <div><span>Product List</span></div>
        <div id="plist-wrapper">
            <select id="plist">

            </select>
        </div>
    </body>
</html>

Теперь с PHP

Если это веб-сервис, вы можете использовать cURL

$url = 'http://myhost.com/webservice';

// HTTP Headers to send to the webservice
// specific to the webservice you're consuming
$headers = array();

$ch = curl_init();

// curl_setopt to set the options
// see http://www.php.net/manual/en/function.curl-setopt.php
curl_setopt($ch, CURLOPT_URL, $url);

//headers if needed
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

// Send the request and check the response
if (($result = curl_exec($ch)) === FALSE) {
    echo 'Failed with' . curl_error($ch) . '<br />';
} else {
    echo "Success!<br />\n";
}
curl_close($ch);

Если это не веб-сервис (просто XML-файл), вы можете использовать file_get_contents

$result = file_get_contents('http://myhost.com/productsfeed.xml');

Для разбора xml и отображения выпадающего меню выберите

$xml = new DOMDocument();
$xml->loadXML($result);

$html = new DOMDocument();
$htmlSource = 
'<html>
    <head></head>
    <body>
        <div><span>Product List</span></div>
        <div id="plist-wrapper">
            <select id="plist"></select>
        </div>
    </body>
</html>';

$html->loadHTML($htmlSource);
$selectList = $html->getElementsByTagName('select')->item(0);
$optionItem = $html->createElement('option');

$prodNodeList = $xml->getElementsByTagName('product');

foreach ($prodNodeList as $prodNode) {
    $id     = $prodNode->getAttribute('id');
    $name   = $prodNode->getAttribute('name');
    $price  = $prodNode->getAttribute('price');
    $vendor = $prodNode->getAttribute('vendor');

    $option = clone $optionItem;
    $option->setAttribute('value', $id);
    $option->setAttribute('data-id', $id);
    $option->setAttribute('data-price', $price);
    $option->setAttribute('data-vendor', $vendor);
    $option->nodeValue = $name;
    $selectList->appendChild($option);
}

print $html->saveHTML();
Другие вопросы по тегам