Статьи

Настройка параметров вашего магазина с помощью eBay Trading API

В первой части мы объяснили различные части панели инструментов разработчика eBay и настроили наше тестовое приложение. Мы также создали нашу базу данных. Теперь мы готовы создать проект. В этой части мы сосредоточимся на настройках магазина. В третьей части мы добавим новые товары в наш магазин.

зависимости

Прежде чем мы продолжим, нам сначала нужно установить зависимости приложения. Создайте файл composer.json и добавьте следующее:

 { "require" : { "slim/slim-skeleton": "dev-master", "slimcontroller/slimcontroller": "dev-master", "guzzlehttp/guzzle": "4.*", "vlucas/valitron": "~1.2", "codeguy/upload": "*" }, "autoload": { "classmap": [ "controllers" ] } } 

Мы будем использовать Slim Framework для этого приложения. Так как в Slim действительно нет встроенного C в MVC , нам также необходим контроллер Slim . Затем нам также требуется Guzzle, чтобы мы могли легко делать вызовы API для eBay. Следующим является валитрон для проверки формы. Наконец, есть библиотека загрузки для проверки и обработки загрузок.

Создайте файл index.php в корне каталога проекта, затем добавьте следующий код:

 <?php require 'vendor/autoload.php'; $app = New \SlimController\Slim(array( 'templates.path' => 'templates' )); $app->view(new \Slim\Views\Twig()); $app->view->parserOptions = array( 'charset' => 'utf-8', 'cache' => realpath('templates/cache'), 'auto_reload' => true, 'strict_variables' => false, 'autoescape' => true ); $app->hook('slim.before', function () use ($app) { $app->view()->appendData(array('baseUrl' => '/tester/ebay_trading_api')); }); $app->run(); 

Разбивая его, сначала нам нужен файл autoload.php чтобы мы могли использовать библиотеки, которые нам требовались в файле composer.json ранее.

 require 'vendor/autoload.php'; 

Далее мы инициализируем контроллер Slim. Это позволяет нам настраивать параметры, которые будут использоваться контроллером, такие как путь к шаблонам, который является путем к каталогу шаблонов.

 $app = New \SlimController\Slim(array( 'templates.path' => 'templates' )); 

Далее мы говорим Slim использовать Twig для обработки наших представлений:

 $app->view(new \Slim\Views\Twig()); $app->view->parserOptions = array( 'charset' => 'utf-8', 'cache' => realpath('templates/cache'), 'auto_reload' => true, 'strict_variables' => true, 'autoescape' => true ); 

Мы также указали следующие параметры:

  • charset — набор символов, который будет использоваться Twig.
  • кеш — Twig компилирует шаблоны, которые мы используем, поэтому он не должен делать это при каждой загрузке страницы. Эти скомпилированные файлы шаблона хранятся в указанном здесь каталоге.
  • auto_reload — это говорит Twig перекомпилировать шаблон каждый раз, когда изменяется исходный код.
  • strict_variables — сообщает Twig, что нужно возвращать ошибки, когда переменная, используемая в шаблоне, не была объявлена
  • autoescape — это говорит Twig автоматически экранировать HTML, CSS и JavaScript-код, если они встречаются в шаблоне.

Затем мы создаем хук, который запускается до запуска приложения Slim. Этот хук прикрепляет baseUrl к представлению. Это означает, что какое бы значение мы ни присвоили baseUrl , оно всегда будет доступно в каждом представлении. Мы используем это значение позже, чтобы связать наши внешние активы.

 $app->hook('slim.before', function () use ($app) { $app->view()->appendData(array('baseUrl' => '/tester/ebay_trading_api')); }); 

Наконец, мы запускаем приложение Slim:

 $app->run(); 

Ebay Class

Нам нужно создать класс, который мы сможем использовать для упрощения вызовов API. Создайте папку classes в корне каталога проекта, затем создайте файл и назовите его Ebay.php . Внутри файла добавьте следующее:

 <?php class Ebay { } 

Затем объявите переменные, которые мы будем использовать в классе:

 public $compatability_level = 885; public $sandbox_url = 'https://api.sandbox.ebay.com/ws/api.dll'; public $url = 'https://api.ebay.com/ws/api.dll'; public $run_name; public $dev_id; public $app_id; public $cert_id; public $site_id; public $user_token; 

Это те же самые переменные, которые были у нас в HTTP-заголовках в части 1. Нам нужны эти переменные при каждом запросе к API. Единственное, что я не представил, — это URL, на который делаются запросы. Мы объявили два URL-адреса в этом классе: один для живой версии API, а другой для версии «песочницы». Вы можете просто выбрать, какой использовать при отправке запросов. Но следует помнить одну вещь: вы можете использовать URL-адрес песочницы только для учетных записей «песочницы», а реальный URL-адрес для реальных учетных записей eBay. Вы не можете использовать их взаимозаменяемо.

Затем создайте метод конструктора. Все, что он делает, это назначает глобальные настройки приложения, чтобы мы могли использовать их во всем классе:

 public function __construct($settings){ $this->run_name = $settings->run_name; $this->user_token = $settings->user_token; $this->dev_id = $settings->dev_id; $this->app_id = $settings->app_id; $this->cert_id = $settings->cert_id; $this->site_id = $settings->site_id; } 

Затем объявите метод request . Это позволило бы нам сделать фактический запрос к API:

 public function request($method, $request_body){ $client = new GuzzleHttp\Client(); $response = $client->post($this->url, array( 'verify' => false, 'headers' => array( 'X-EBAY-API-COMPATIBILITY-LEVEL' => $this->compatability_level, 'X-EBAY-API-DEV-NAME' => $this->dev_id, 'X-EBAY-API-APP-NAME' => $this->app_id, 'X-EBAY-API-CERT-NAME' => $this->cert_id, 'X-EBAY-API-SITEID' => $this->site_id, 'X-EBAY-API-CALL-NAME' => $method ), 'body' => $request_body )); $body = $response->xml(); return $body; } 

Этот метод принимает два аргумента: $method и $request_body . Метод $method — это имя метода API, который вы хотите вызвать. Здесь вы можете найти список методов API, которые вы можете использовать в eBay Trading API .
Другим аргументом является $request_body , который представляет собой строку XML, содержащую данные, необходимые для метода API. Вы также можете найти подробную информацию о данных, которые необходимо передать для каждого метода API, по ссылке, которую я предоставил, поэтому обязательно ознакомьтесь с ней.

Внутри метода мы объявляем новый экземпляр клиента GuzzleHTTP.

 $client = new GuzzleHttp\Client(); 

Затем мы делаем запрос POST к URL песочницы. Мы передаем массив, который содержит заголовки запроса и тело:

 $response = $client->post($this->sandbox_url, array( 'verify' => false, 'headers' => array( 'X-EBAY-API-COMPATIBILITY-LEVEL' => $this->compatability_level, 'X-EBAY-API-DEV-NAME' => $this->dev_id, 'X-EBAY-API-APP-NAME' => $this->app_id, 'X-EBAY-API-CERT-NAME' => $this->cert_id, 'X-EBAY-API-SITEID' => $this->site_id, 'X-EBAY-API-CALL-NAME' => $method ), 'body' => $request_body )); 

Мы установили для verify значение false . Это устанавливает для проверки сертификата SSL значение false . Обратите внимание, что это небезопасно, поэтому предпочтительно установить значение true . Но так как мы находимся только на этапе тестирования, мы можем установить его в false чтобы избежать проверки SSL-сертификата.

Далее идут headers — это в основном те же заголовки запросов, которые мы видели ранее.

Наконец, есть body которое содержит тело запроса. Позже мы увидим, какие данные нам нужно передать.

Как только запрос вернет ответ, он будет в формате XML, поэтому мы сообщаем Guzzle, чтобы он проанализировал его для нас, вызвав метод xml() . Это очень похоже на вызов simplexml_load_string для преобразования XML в объект. Наконец, мы вызываем json_encode и json_decode чтобы преобразовать объект в массив.

Затем создайте метод, который будет извлекать идентификатор сеанса из API. Для этого нам нужно использовать метод GetSessionID из API. Это требует имени запуска приложения в качестве параметра:

 public function getSessionID(){ $request_body = '<?xml version="1.0" encoding="utf-8"?> <GetSessionIDRequest xmlns="urn:ebay:apis:eBLBaseComponents"> <RuName>' . $this->run_name . '</RuName> </GetSessionIDRequest>'; $response = $this->request('GetSessionID', $request_body); return $response->SessionID; } 

Далее getUserToken метод getUserToken который использует FetchToken API FetchToken . Для этого требуется идентификатор сеанса, который мы получаем при вызове getSessionID . Этот метод возвращает маркер пользователя, который мы можем использовать для отправки запросов в API от имени пользователя.

 public function getUserToken($session_id){ $request_body = '<?xml version="1.0" encoding="utf-8"?> <FetchTokenRequest xmlns="urn:ebay:apis:eBLBaseComponents"> <SessionID>' . $session_id . '</SessionID> </FetchTokenRequest>'; $response = $this->request('FetchToken', $request_body); return $response->eBayAuthToken; } 

Поток будет примерно таким:

  1. Мы вызываем getSessionID который возвращает идентификатор сессии.
  2. Мы настроили приложение на перенаправление на eBay, передав идентификатор сессии в URL перенаправления.
  3. Пользователь входит в систему и дает разрешение на приложение.
  4. Пользователь перенаправлен в приложение.
  5. Мы вызываем getUserToken для получения токена пользователя, передавая идентификатор сессии, который мы получили ранее.
  6. API возвращает токен пользователя, и мы сохраняем его в базе данных для последующего использования.

Позже мы собираемся реализовать это в нашем коде.

Это почти все, что нам нужно сейчас от этого класса. Теперь нам нужно сказать Composer, что автозагрузка класса для нас. Откройте composer.json и добавьте classes в свойство classmap autoload :

 "autoload": { "classmap": [ "controllers", "classes" ] } 

Затем откройте файл index.php в корневом каталоге проекта и добавьте следующий код прямо перед $app->run() . Это позволило бы нам вызывать методы из класса Ebay из любого места, используя $this->app->ebay :

 $app->container->singleton('ebay', function () use($app) { $id = 1; $settings_result = $app->db->query("SELECT user_token, run_name, dev_id, app_id, cert_id, site_id FROM settings WHERE id = $id"); $settings = $settings_result->fetch_object(); return new Ebay($settings); }); 

Пока мы здесь, давайте также назначим экземпляр mysqli контейнеру приложения и db его db .

 $app->container->singleton('db', function (){ $server = 'localhost'; $user = 'user'; $pass = ''; $database = 'ebaytrading'; return new mysqli($server, $user, $pass, $database); }); 

Домашняя страница

Теперь мы готовы начать работать над интерфейсом. Сначала создайте файл base.twig в каталоге templates , затем добавьте следующий код:

 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>{{ title }}</title> <link rel="stylesheet" href="{{ baseUrl }}/assets/lib/bootstrap/bootstrap.css"> {% if is_productpage %} <link rel="stylesheet" href="{{ baseUrl }}/assets/lib/dropzone/dropzone.css"> {% endif %} </head> <body> <div class="navbar navbar-default navbar-static-top" role="navigation"> <div class="container"> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">{{ title }}</a> </div> <div class="navbar-collapse collapse"> <ul class="nav navbar-nav"> <li class="active"><a href="{{ baseUrl }}">Home</a></li> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Products <span class="caret"></span></a> <ul class="dropdown-menu" role="menu"> <li><a href="{{ baseUrl }}/products/new">New</a></li> <li><a href="{{ baseUrl }}/products">List</a></li> </ul> </li> </ul> <ul class="nav navbar-nav"> <li class="dropdown"><a href="{{ baseUrl }}/token">Get Token</a></li> </ul> <ul class="nav navbar-nav"> <li><a href="{{ baseUrl }}/settings">Settings</a></li> </ul> </div> </div> </div> <div class="container"> {% block content %}{% endblock %} </div> <script src="{{ baseUrl }}/assets/js/jquery.js"></script> <script src="{{ baseUrl }}/assets/lib/bootstrap/bootstrap.js"></script> {% if is_productpage %} <script src="{{ baseUrl }}/assets/js/handlebars.js"></script> <script src="{{ baseUrl }}/assets/lib/dropzone/dropzone.js"></script> <script src="{{ baseUrl }}/assets/js/dropzone-options.js"></script> <script src="{{ baseUrl }}/assets/js/new-product.js"></script> {% endif %} </body> </html> 

Если этот шаблон выглядит знакомым, это потому, что для этого проекта использовали Twitter Bootstrap.

Возвращаясь к шаблону, мы используем три переменные: baseUrl , content и title . Ранее мы уже объявили baseUrl из файла index.php . Позже мы собираемся передать content и title от контроллера. А пока давайте сосредоточимся на blocks в Twig. Мы используем их в шаблоне, вызывая block а затем имя переменной. В этом случае мы назвали content блока:

 {% block content %}{% endblock %} 

Блоки — это способ визуализации контента из другого шаблона на основе того, что мы передаем из контроллера. Позже мы рассмотрим, как передать фактический контент, который мы отображаем здесь.

Как я упоминал ранее, мы используем Twitter Bootstrap, поэтому нам нужно поместить его в каталог assets/lib/bootstrap . Вы можете использовать темы с bootswatch.com, если не хотите использовать тему по умолчанию. Лично я использую тему йети . Нам также нужен jQuery, так как от него зависит JavaScript Twitter Bootstrap, и он нам нужен для обработки событий. Нам также нужны Handlebars для шаблонов и dropzone для загрузки изображений продуктов.

Обратите внимание, что у нас есть следующие условия:

 {% if is_productpage %} {% endif %} 

Мы используем его только для загрузки стилей и скриптов, которые необходимы для текущей страницы.

Загрузите необходимые файлы, если вы этого еще не сделали.

Вернувшись, создайте контроллер Home в каталоге controllers . Это расширит SlimController :

 <?php class Home extends \SlimController\SlimController { } 

Внутри контроллера объявите метод indexAction . Он использует метод render для визуализации шаблона индекса для нас. Метод render принимает два аргумента: имя шаблона и некоторые необязательные данные, которые вы хотите передать. В этом случае мы просто передаем имя:

 public function indexAction(){ $this->render('index', array('title' => 'Home', 'name' => 'Dog')); } 

Затем создайте шаблон индекса, назовите его index.twig . При использовании шаблонов вы должны помнить, что имя файла шаблона должно совпадать с именем, которое вы использовали в контроллере. Из шаблона индекса нам нужно вызвать метод extends и передать имя файла базового шаблона, который мы использовали. Далее мы оборачиваем содержимое, которое хотим отображать, в теги block . Убедитесь, что имя, которое вы передаете, совпадает с именем, которое вы передали в базовом шаблоне:

 {% extends "base.twig" %} {% block content %} {{ parent() }} <h1>Hi {{ name }}</h1> {% endblock %} 

Поскольку мы уже пишем код для домашнего контроллера, мы могли бы также написать метод для получения идентификатора сеанса и токена пользователя. Сначала давайте сделаем идентификатор сессии. Это вызовет метод getSessionID() из класса Ebay и вернет идентификатор сеанса, который мы затем сохраним в сеансе. Затем мы перенаправляем пользователя на страницу входа в eBay. Здесь мы перенаправляем на страницу входа в песочницу. Я также включил URL-адрес для живого для тех, кто хочет развернуть приложение eBay позже. Как в режиме реального времени, так и в песочнице требуется, чтобы RuName и SessID передавались как параметр запроса.

 public function sessionAction(){ $session_id = $this->app->ebay->getSessionID(); $_SESSION['session_id'] = $session_id; //live: https://signin.ebay.co.uk/ws/eBayISAPI.dll?SignIn&RuName=" . $this->app->ebay->run_name . "&SessID=$session_id $redirect_url = "https://signin.sandbox.ebay.com/ws/eBayISAPI.dll?SignIn&RuName=" . $this->app->ebay->run_name . "&SessID=" . $session_id; $this->app->redirect($redirect_url); } 

Как только пользователь утвердит приложение, будет tokenAction() метод tokenAction() . Этот метод извлекает идентификатор сеанса, который мы сохранили ранее в сеансе. Затем мы используем его в качестве аргумента для getUserToken() который возвращает токен пользователя. Затем мы сохраняем этот токен пользователя в базе данных, чтобы впоследствии использовать его при запросах к API.

 public function tokenAction(){ $session_id = $_SESSION['session_id']; $token = $this->app->ebay->getUserToken($session_id); $id = 1; $settings_result = $this->app->db->query("SELECT user_token FROM settings WHERE id = $id"); $settings = $settings_result->fetch_object(); if(!empty($settings)){ $this->app->db->query("UPDATE settings SET user_token = '$token' WHERE id = $id"); }else{ $this->app->db->query("INSERT INTO settings SET user_token = '$token'"); } $this->app->redirect('/tester/ebay_trading_api'); } 

Маршруты

Далее нам нужно добавить маршруты, которые мы будем использовать в приложении. Мы можем сделать это из файла index.php прямо перед $app->run() :

 $app->addRoutes(array( '/' => 'Home:index', '/settings' => 'Settings:view', '/settings/update' => 'Settings:update', '/products/new' => 'Product:new', '/products/create' => 'Product:create', '/upload' => 'Product:upload', '/session' => 'Home:session', '/token' => 'Home:token', '/categories' => 'Product:categories' )); 

В приведенном выше коде мы используем метод addRoutes из расширения Slim Controller. Это занимает массив маршрутов, ключом является фактический маршрут, а значением — контроллер и метод. Контроллер и метод разделяются двоеточием : Соглашение, используемое Slim, заключается в том, что каждый метод в контроллере, который отвечает на маршрут, должен иметь суффикс Action .

Вот обзор того, что делает каждый маршрут:

  • / — домашняя страница.
  • /settings — для просмотра страницы настроек магазина.
  • /setttings/update — для обновления настроек магазина.
  • /products/new — для просмотра формы для создания новых продуктов.
  • /products/create — для создания нового продукта.
  • /upload — для загрузки изображений товара.
  • /session — для получения идентификатора сеанса.
  • /token — для получения токена пользователя.
  • /categories — для предложения категорий товаров.

Настройки магазина

Затем создайте новый файл в каталоге controllers и назовите его Settings.php . Это будет обрабатывать обновление настроек магазина. Чтобы немного сократить это, мы просто введем некоторые данные по умолчанию для настроек магазина, чтобы нам не нужно было писать код для создания настроек магазина. Выполните следующий запрос, чтобы вставить данные по умолчанию:

 INSERT INTO `store_settings` (`id`, `store_name`, `county`, `street`, `country_code_type`, `ebay_website`, `postal_code`, `category_mapping`, `category_prefill`, `currency_code`, `item_location`, `dispatch_time`, `listing_duration`, `listing_type`, `condition_type`, `optimal_picturesize`, `out_of_stock_control`, `get_it_fast`, `include_prefilled`, `shipping_profile`, `return_profile`, `payment_profile`, `shipping_service`, `shippingservice_priority`, `shippingservice_cost`, `shippingservice_additionalcost`) VALUES (1, 'My Awesome Store', 'Driftveil', '275 Star Street', 'GB', 'UK', 'XYZ 123', 1, 1, 'GBP', 'Driftveil Unova', 1, 'GTC', 'FixedPriceItem', '', 1, 1, 1, 1, '', '', '', '', 3, 30, 15); 

Обратите внимание, что для этого урока мы в основном будем использовать первую строку в таблице, ту, которая имеет идентификатор 1, поэтому мы будем использовать 1 в качестве идентификатора для выборки или обновления таблицы настроек магазина.

Затем создайте метод viewAction и вставьте следующий код:

 public function viewAction(){ $user_preferences = $this->app->ebay->getUserPreferences(); $shipping_services = $this->app->ebay->getEbayDetails('ShippingServiceDetails'); $condition_types_result = $this->app->db->query('SELECT id, name FROM condition_types'); $condition_types = array(); while($row = $condition_types_result->fetch_assoc()){ $condition_types[] = $row; } $listing_durations_result = $this->app->db->query('SELECT name FROM listing_durations'); $listing_durations = array(); while($row = $listing_durations_result->fetch_assoc()){ $listing_durations[] = $row['name']; } $listing_types_result = $this->app->db->query('SELECT name FROM listing_types'); $listing_types = array(); while($row = $listing_types_result->fetch_assoc()){ $listing_types[] = $row['name']; } $shippingservice_priorities = range(1, 4); $store_id = 1; $store_result = $this->app->db->query("SELECT store_name, county, street, country_code_type, ebay_website, postal_code, category_mapping, category_prefill, currency_code, item_location, dispatch_time, listing_duration, listing_type, condition_type, optimal_picturesize, out_of_stock_control, get_it_fast, include_prefilled, shipping_profile, return_profile, payment_profile, shipping_service, shippingservice_priority, shippingservice_cost, shippingservice_additionalcost FROM store_settings WHERE id = '$store_id'"); $store = $store_result->fetch_object(); $settings = array( 'user_preferences' => $user_preferences, 'shipping_services' => $shipping_services, 'condition_types' => $condition_types, 'listing_durations' => $listing_durations, 'listing_types' => $listing_types, 'store' => $store, 'shippingservice_priorities' => $shippingservice_priorities ); $this->render('settings/view', $settings); } 

Метод viewAction вызывает метод getUserPreferences из класса Ebay . Мы рассмотрим этот метод позже, но пока знаем, что он возвращает профили продавцов аутентифицированного пользователя. Мы также вызываем метод getEbayDetails который возвращает службы доставки, доступные для определенного веб-сайта eBay. Затем мы выбираем типы условий , перечисляем длительности и перечисляем типы из базы данных и назначаем их массиву.
Затем мы генерируем массив, содержащий числа от 1 до 4. Это будет служить выбором приоритетов службы доставки. Наконец, мы получаем настройки магазина и отображаем страницу.

Ранее мы использовали 2 метода из класса Ebay но мы еще не определили их. Откройте Ebay.php в вашем каталоге classes и добавьте следующие методы.

Во-первых, это метод getUserPreferences , который использует метод GetUserPreferences из API. Это позволяет вам получить пользовательские настройки из аутентифицированной учетной записи eBay. Этот метод API в основном требует логических значений. Он возвращает кучу данных, поэтому мы отфильтровываем другие, указывая только те поля, которые нам нужны. Вот разбивка полей, которые мы используем:

  • ShowGlobalShippingProgramListingPreference — если указан, он возвращает данные о том, включена глобальная программа доставки или нет.
  • ShowSellerExcludeShipToLocationPreference — если указан, он возвращает исключенные места доставки.
  • ShowSellerPaymentPreferences — если указано, возвращает платежные настройки продавца.
  • ShowSellerProfilePreferences — если указано, возвращает информацию о бизнес-политике.
  • ShowSellerReturnPreferences — если указано, возвращает возвращаемые настройки.

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

 public function getUserPreferences(){ $request_body = '<?xml version="1.0" encoding="utf-8"?> <GetUserPreferencesRequest xmlns="urn:ebay:apis:eBLBaseComponents"> <RequesterCredentials> <eBayAuthToken>' . $this->user_token . '</eBayAuthToken> </RequesterCredentials> <ShowGlobalShippingProgramListingPreference>true</ShowGlobalShippingProgramListingPreference> <ShowSellerExcludeShipToLocationPreference>true</ShowSellerExcludeShipToLocationPreference> <ShowSellerPaymentPreferences>true</ShowSellerPaymentPreferences> <ShowSellerProfilePreferences>true</ShowSellerProfilePreferences> <ShowSellerReturnPreferences>true</ShowSellerReturnPreferences> </GetUserPreferencesRequest>'; $response = $this->request('GetUserPreferences', $request_body); $seller_profiles = array(); foreach($response->SellerProfilePreferences->SupportedSellerProfiles->SupportedSellerProfile as $profile){ $is_default = $profile->CategoryGroup->IsDefault; if($is_default == 'true'){ $seller_profiles[] = array( 'id' => json_decode(json_encode($profile->ProfileID), true)[0], 'type' => json_decode(json_encode($profile->ProfileType), true)[0], 'name' => json_decode(json_encode($profile->ProfileName), true)[0] ); } } $user_preferences = array( 'seller_profiles' => $seller_profiles, 'paypal_emailaddress' => json_decode(json_encode($response->SellerPaymentPreferences->DefaultPayPalEmailAddress), true)[0] ); return $user_preferences; } 

Другой метод, который мы использовали, это getEbayDetails . Он использует метод GeteBayDetails из API. Нам нужно только указать значение для DetailName чтобы это работало. Ранее мы ShippingServiceDetails в качестве значения ShippingServiceDetails . Это позволяет нам получить список услуг доставки, поддерживаемых веб-сайтом eBay, где будет указан продукт. Для списка других применимых значений для DetailName , вы можете проверить эту страницу .

 public function getEbayDetails($detail_name){ $request_body = '<?xml version="1.0" encoding="utf-8"?> <GeteBayDetailsRequest xmlns="urn:ebay:apis:eBLBaseComponents"> <RequesterCredentials> <eBayAuthToken>' . $this->user_token . '</eBayAuthToken> </RequesterCredentials> <DetailName>' . $detail_name . '</DetailName> </GeteBayDetailsRequest>'; $response = $this->request('GeteBayDetails', $request_body); $services = array(); foreach($response->ShippingServiceDetails as $service){ $services[] = json_decode(json_encode($service->ShippingService), true)[0]; } return $services; } 

Возвращаясь к контроллеру настроек, добавьте метод updateAction . Это обновляет настройки магазина. Здесь мы используем valitron для проверки. Если проверка прошла успешно, мы извлекаем значения одно за другим. Для флажков мы проверяем, не является ли соответствующее поле не пустым. Если это не так, мы устанавливаем значение 1, иначе 0. После этого мы используем подготовленный оператор для обновления настроек магазина, передаем сообщение, которое будет возвращено пользователю, а затем перенаправляем на страницу настроек. Если проверка не пройдена, мы просто передаем ошибки и перенаправляем на страницу настроек.

 public function updateAction(){ $v = new Valitron\Validator($_POST); $v->rule('required', array('store_name', 'county', 'street', 'country_code_type', 'ebay_website', 'postal_code', 'currency_code', 'item_location', 'dispatch_time', 'listing_duration', 'listing_type', 'condition_type', 'PAYMENT', 'RETURN_POLICY', 'SHIPPING', 'shipping_service', 'shippingservice_priority', 'shippingservice_cost', 'shippingservice_additionalcost')); if($v->validate()){ $id = 1; //store settings id $store_name = $_POST['store_name']; $street = $_POST['street']; $county = $_POST['county']; $country_code_type = $_POST['country_code_type']; $ebay_website = $_POST['ebay_website']; $postal_code = $_POST['postal_code']; $category_mapping = (!empty($_POST['category_mapping'])) ? 1 : 0; $category_prefill = (!empty($_POST['category_prefill'])) ? 1 : 0; $optimal_picturesize = (!empty($_POST['optimal_picturesize'])) ? 1 : 0; $out_of_stock_control = (!empty($_POST['out_of_stock_control'])) ? 1 : 0; $get_it_fast = (!empty($_POST['get_it_fast'])) ? 1 : 0; $include_prefilled = (!empty($_POST['include_prefilled'])) ? 1 : 0; $currency_code = $_POST['currency_code']; $item_location = $_POST['item_location']; $dispatch_time = $_POST['dispatch_time']; $listing_duration = $_POST['listing_duration']; $listing_type = $_POST['listing_type']; $condition_type = $_POST['condition_type']; $payment_policy = $_POST['PAYMENT']; $return_policy = $_POST['RETURN_POLICY']; $shipping_policy = $_POST['SHIPPING']; $shipping_service = $_POST['shipping_service']; $shippingservice_priority = $_POST['shippingservice_priority']; $shippingservice_cost = $_POST['shippingservice_cost']; $shippingservice_additionalcost = $_POST['shippingservice_additionalcost']; if($query = $this->app->db->prepare("UPDATE store_settings SET store_name = ?, county = ?, street = ?, country_code_type = ?, ebay_website = ?, postal_code = ?, category_mapping = ?, category_prefill = ?, currency_code = ?, item_location = ?, dispatch_time = ?, listing_duration = ?, listing_type = ?, condition_type = ?, optimal_picturesize = ?, out_of_stock_control = ?, get_it_fast = ?, include_prefilled = ?, shipping_profile = ?, return_profile = ?, payment_profile = ?, shipping_service = ?, shippingservice_priority = ?, shippingservice_cost = ?, shippingservice_additionalcost = ? WHERE id = ?")){ $query->bind_param("ssssssiississsiiiissssiddi", $store_name, $county, $street, $country_code_type, $ebay_website, $postal_code, $category_mapping, $category_prefill, $currency_code, $item_location, $dispatch_time, $listing_duration, $listing_type, $condition_type, $optimal_picturesize, $out_of_stock_control, $get_it_fast, $include_prefilled, $shipping_policy, $return_policy, $payment_policy, $shipping_service, $shippingservice_priority, $shippingservice_cost, $shippingservice_additionalcost, $id); $query->execute(); $this->app->flash('message', array('type' => 'success', 'text' => 'Settings was updated!')); $this->app->redirect('/tester/ebay_trading_api/settings'); } }else{ $this->app->flash('form', $_POST); $this->app->flash('message', array( 'type' => 'danger', 'text' => 'Please fix the following errors', 'data' => $v->errors()) ); $this->app->redirect('/tester/ebay_trading_api/settings'); } } 

Вывод

В этой части мы реализовали базовый механизм обновления настроек нашего магазина. В следующей и последней части этой серии мы добавим функциональность Продукта — возможность добавлять новые продукты в наш магазин eBay. Будьте на связи!