Добрый день.
На прошлой неделе мы объявили об открытии 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.