igniterlabs/ti-ext-importexport
ImportExport extension for TastyIgniter: export menu items, customers, reservations and orders to CSV, edit offline, then import updates back into your site. Simple CSV-based data migration and bulk updates for TastyIgniter records.
## Getting Started
### Minimal Setup
1. **Installation**:
```bash
composer require igniterlabs/ti-ext-importexport -W
php artisan igniter:up
Access Admin Panel: Navigate to Tools > Import/Export in the TastyIgniter admin dashboard.
First Use Case:
Admin Panel Integration:
Tools > Import/Export for quick operations.registerImportExport() method in your extension’s Extension class to add custom types:
public function registerImportExport(): array {
return [
'import' => [
'my_custom_import' => [
'label' => 'Custom Data Import',
'model' => \App\Models\CustomImport::class,
'configFile' => 'extension::models/custom_import',
'permissions' => 'Extension.ManageImports',
],
],
'export' => [
'my_custom_export' => [
'label' => 'Custom Data Export',
'model' => \App\Models\CustomExport::class,
'configFile' => 'extension::models/custom_export',
'permissions' => 'Extension.ManageExports',
],
],
];
}
Custom Model Patterns:
Imports:
Extend IgniterLabs\ImportExport\Models\ImportModel and implement importData():
public function importData(array $data): void {
foreach ($data as $record) {
$validated = Validator::validate($record, [
'field1' => 'required|string',
'field2' => 'nullable|integer',
]);
// Save logic...
}
}
logCreated(), logUpdated(), and logError() for tracking.Exports:
Extend IgniterLabs\ImportExport\Models\ExportModel and implement exportData():
public function exportData(array $columns, array $options = []): array {
return $this->newQuery()
->where('active', 1)
->get($columns)
->toArray();
}
Configuration Files:
Define column mappings and UI options in resources/models/{type}.php:
return [
'columns' => [
'id' => 'ID',
'name' => 'Name',
'price' => 'Price (USD)',
],
'fields' => [
'update_existing' => [
'label' => 'Update Existing Records',
'type' => 'switch',
'default' => true,
],
],
];
File Handling:
storage/app/imports/. Use storage_path('app/imports') to access.return response()->streamDownload(function () {
$this->generateCsv($data);
}, 'export_' . now() . '.csv');
Validation & Error Handling:
importData() using Laravel’s Validator.logError($rowNumber, $message) for admin review.Column Mismatches:
columns array in your config file. Use snake_case for DB fields.if (!array_key_exists('expected_column', $data[0])) {
$this->logError(1, "Missing required column: 'expected_column'");
return;
}
Large File Timeouts:
max_execution_time.exportData():
return $this->newQuery()->chunk(500, function ($records) {
// Process chunks...
})->toArray();
Permission Issues:
'Extension.ManageImports').registerPermissions() method.Excel vs. CSV:
.xlsx), use a library like PhpOffice/PhpSpreadsheet and pre-process files:
$spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($file);
$data = $spreadsheet->getActiveSheet()->toArray();
Database Locking:
DB::connection()->disableSharedLocks().Log Inspection:
\Log::debug('Import data', ['data' => $data]);
CSV Parsing Errors:
League\Csv\Reader directly to debug:
$csv = Reader::createFromPath($filePath, 'r');
$csv->setHeaderOffset(0);
foreach ($csv as $record) {
// Inspect $record
}
Configuration Overrides:
$this->app->singleton('importExport.config', function () {
return [
'csv_delimiter' => ';', // Default is ','
];
});
Custom Field Types: Extend the UI with custom field types (e.g., dropdowns) by publishing assets:
public function boot() {
$this->loadViewsFrom(__DIR__.'/views', 'import_export');
$this->publishes([
__DIR__.'/views' => resource_path('views/vendor/import_export'),
]);
}
Pre/Post Hooks: Add logic before/after imports/exports via events:
// In EventServiceProvider
protected $listen = [
'igniter.import.before' => [
\App\Listeners\PreImportLogic::class,
],
'igniter.export.after' => [
\App\Listeners\PostExportLogic::class,
],
];
API Integration: Expose imports/exports via API by creating a controller:
public function export(Request $request) {
$export = new \App\Models\CustomExport();
return $export->download($request->columns);
}
Bulk Operations:
Optimize for bulk updates by using upsert:
DB::table('table')->upsert($data, ['id'], ['name', 'price']);
Localization: Translate column labels and messages:
'columns' => [
'name' => trans('import_export.columns.name'),
],
Add translations to resources/lang/{locale}/import_export.php.
---
How can I help you explore Laravel packages today?