Pull to refresh
0

SDK: создание приложения в 3 шага

Reading time 5 min
Views 4.7K


Добрый день.

На прошлой неделе мы объявили об открытии SDK и пришла очередь описать процесс создания приложения.

Приложения для Finobox могут быть самыми разнообразными, например подготовка договоров и документов, смет и отчетов, анализ финансовых данных и построение графиков и так далее.

Любой php-разработчик с помощью SDK может создать свое приложение и разместить его в Finobox, получая прибыль от продаж этого приложения пользователям.

В этом посте мы опишем создание приложения для импорта финансовых данных из CSV файла.


1. Приготовления


С центра разработчика скачиваем последнюю версию SDK и распаковываем на своем веб-сервере. Все должно заработать из коробки, никаких путей и конфигураций настраивать не надо.

В папке Store располагаются все приложения. Пока что здесь найдем приложения для примера и заготовку — MyNewApplication. На основе заготовки и будем создавать приложение в этой статье.

Название папки должно совпадать с названием файла и именем класса приложения. Назовем приложение CSVImport. Переименуем файл, папку и класс, описанный в файле.

Структура файлов будет такова:


Отредактируем файл description.xml:
<application>
  <name>Импорт из CSV</name>
  <descr>Импортирует платежи из CSV файла</descr>
</application>



Посмотрим, что получилось:


Справка по SDK: Принцип работы приложений

2. Создаем интерфейс


Итак, наше приложение должно получить от пользователя файл и перегнать все обнаруженные записи в платежи текущей панели. Для этой задачи в интерфейсе достаточно единственного окна, где будет файловый ввод и кнопка запуска.

Но мы пойдем другим путем и сделаем приложение «двухходовым» — на втором шаге мы покажем пользователю, как приложение понимает загруженные данные перед тем, как начать перемалывать их в платежи.

Итак, в классе приложения CSVImport будут три метода: main и step2 для построения двух окон и import для выполнения действий по импорту данных.

<?php
class CSVImport extends Application{
  function main(){
    //метод вернет HTML первого окна приложения
     $this->setResultType(self::$RESULT_HTML);
  }
  function step2(){
    //метод вернет HTML второго окна приложения
     $this->setResultType(self::$RESULT_HTML);
  }
  function import(){
    //после импорта записей следует выйти и перегрузить данные
    $this->setResultType(self::$RESULT_CLOSE_N_RELOAD);
  }
}
?>


2.1 Окно загрузки файла

Для построения интерфейса формы воспользуемся конструктором форм.
Справка по SDK: Конструктор форм
  function main(){
     $form = $this->startUIForm();
     // добавим в форму файловый ввод и текст
     $form->add(
       FormElement::factory('FileInput', 'csvfile')
         ->setLabel('Выберите CSV файл')
     );
     $form->add(
       FormElement::factory('StaticInput')
         ->addAttribute('class="notice"')
         ->setValue('После нажатия кнопки "Загрузить данные" вы перейдете на страницу пдтверждения формата данных')
     );
     // указываем step2 как имя метода, в который надо попасть после нажатия кнопки
     $this->setResultType(self::$RESULT_HTML);
     return $this->finalizeUIForm($form, 'step2', 'Загрузить данные')->getHtml();
  }

Вид приложения на первом шаге:

2.2 Окно подтверждения формата

Файл загружен (или незагружен :) ). Проверим его и выведем первые 10 записей в таблице. Для построения кода этого окна воспользуемся механизмом шаблонов. Шаблон положим в папку приложения под именем csvtable.php. Также, передадим «транзитом» путь к загруженному файлу.

Справка по SDK: Шаблоны
  function step2(){
    $file = $_FILES['csvfile'];
    /**
     * проверяем файл
     */
    if ($file['error'] != 0)
      throw new Exception('Не удалось загрузить файл');
    if ( ($file['type'] != 'text/plain') && ($file['type'] != 'text/csv'))
      throw new Exception('Неверный формат файла');
    /**
     * читаем первые 10 строк
     */
     $limit = 10;$strings = array();
     $fhandle = @fopen($file['tmp_name'], 'r');
     if ($fhandle === false) throw new Exception('Не удалось получить файл');
     while(!feof($fhandle)){
       $strings[] = fgets($fhandle);
       if (--$limit < 0) break;
     }
     fclose($fhandle);
     $this->setResultType(self::$RESULT_HTML);
     // передаем шаблону данные и выводим результат
     return $this->renderTemplate('csvtable.php', array('csv' => $strings, 'filename' => $file['tmp_name']));
  }

Вид приложения на втором шаге:

2.3 Импорт данных

После подтверждения формата, остается только пройтись по файлу и создать новые платежи. Для опытов возьмем экспортный CSV-файл сервиса «Дребеденьги». Формат такой:

1 поле (нулевой индекс) — категория платежа. В концепции финобокса это метка.
3 — дата оплаты
4 — наименование платежа, комментарий
7 — сумма

Справка по SDK: Загрузка файлов и создание платежей
  function import(){
     $fhandle = @fopen($_POST['csvfile'], 'r');
     if ($fhandle === false) throw new Exception('Не удалось получить файл');
     while(!feof($fhandle)){
      $row = iconv('CP1251', 'UTF-8', fgets($fhandle));
      $row = str_replace('"', '', $row);
      $entry = explode(';', $row);
      if (count($entry) > 1){
        $payment = new Entry();
        $payment->name  = $entry[3];
        // указываем валюту платежа, пусть будет та, которая у пользователя по умолчанию
        $payment->currency_id = $this->userPreferences->defaultCurrency;
        $payment->value  = $entry[6];
        $payment->paiddate = $entry[2];
        $payment->tags = $entry[0];
        // создаем платеж
        $this->entriesData->insert($payment);
      }
     }
     fclose($fhandle);
     // удаляем временный файл
     unlink($_POST['csvfile']);   
    //после импорта записей следует выйти и перегрузить данные
    $this->setResultType(self::$RESULT_CLOSE_N_RELOAD);
    return;
  }


Примечание: в режиме SDK функции обновления и добавления платежей не изменяют файл данных, то есть после проведенного импорта данных в тестовой базе их больше не станет. В рабочем сервисе все работает по-рабочему.

3. Отправка приложения в магазин



Приложение готово, осталось только перевязать ленточкой, снабдить иконкой, установить цену и отправить на рассмотрение в центре разработчика


Готовое приложение для импорта таких файлов в Finobox.ru можно подключить здесь

* Исходный код примеров раскрашен с помощью Source Code Highlighter.
Tags:
Hubs:
+5
Comments 7
Comments Comments 7

Articles

Information

Website
www.finobox.ru
Registered
Founded
Employees
2–10 employees
Location
Россия