namespace App\Console\Commands;
use App\Models\AuthUser;
+use App\Models\FluidbookDocument;
use App\Models\FluidbookPublication;
use App\Models\FluidbookQuote;
use App\Models\FluidbookTheme;
use Cubist\Backpack\Magic\Fields\Date;
use Cubist\Backpack\Magic\Fields\Datetime;
use Cubist\Backpack\Magic\Fields\Files;
+use Cubist\Util\ObjectUtil;
use Cubist\Util\PHP;
use Illuminate\Support\Facades\DB;
$actions = [
//'Backup current database' => 'backup',
'Migrate magic models' => 'migrate',
- 'Import publications' => 'importPublications',
+ 'Import documents' => 'importDocuments',
+ //'Import publications' => 'importPublications',
'Clean caches' => 'cleanCache'
];
$this->executeProcessQuiet('/usr/bin/php8.0 artisan optimize:clear');
}
-
- protected function _unserialize($str)
+ protected function importDocuments()
{
- $class = 'stdClass';
- $str = preg_replace('/^O:\d+:"[^"]++"/', 'O:' . strlen($class) . ':"' . $class . '"', $str);
- $str = str_replace("s:8:\"\0*\0datas\"", 's:5:"datas"', $str);
- return unserialize($str);
+ PHP::neverStop();
+ FluidbookDocument::truncate();
+
+ foreach (DB::table($this->_oldDB . '.documents')->orderBy('document_id', 'desc')->get() as $e) {
+ $this->line('Import ' . $e->document_id);
+ $c = new FluidbookDocument();
+ $c->setIncrementing(false);
+ $c->id = $e->document_id;
+ $date = new \DateTime();
+ $date->setTimestamp($e->date);
+ $c->created_at = $c->updated_at = $date;
+ $c->file = $e->file;
+ $c->owner = $e->proprietaire;
+ $c->pages = $e->pages;
+ $c->pdf_data = $this->_unserializeAndJSON($e->generalInfos);
+ $c->file_data = $this->_unserializeAndJSON($e->localInfos);
+ $c->bookmarks = str_replace('"titre":', '"title":', $this->_unserializeAndJSON($e->bookmarks, '[]'));
+ $c->saveWithoutFlushingCache();
+ }
}
+ protected function _unserializeAndJSON($s, $default = '[]')
+ {
+ $r = ObjectUtil::safeUnserialize($s);
+ if (!$r) {
+ return $default;
+ }
+ return json_encode($r);
+ }
protected function importPublications()
{
// }
FluidbookPublication::truncate();
- foreach (DB::table($this->_oldDB . '.books')->orderBy('book_id', 'desc')->get() as $e) {
+ foreach (DB::table($this->_oldDB . '.books')->orderBy('book_id', 'asc')->get() as $e) {
$this->line('Import ' . $e->book_id);
$oldRoot = $this->_oldRoot . 'books/working/' . $e->book_id . '/';
$c = new FluidbookPublication();
$c->setAttribute('composition', $composition);
try {
- $c->save();
+ $c->saveWithoutFlushingCache();
} catch (\Exception $e) {
dd($e);
}
namespace App\Http\Controllers\Admin\Operations\FluidbookPublication;
+use Cubist\Util\Files\Files;
use Illuminate\Support\Facades\Route;
trait CompositionOperation
protected function setupCompositionRoutes($segment, $routeName, $controller)
{
Route::match(['get'], $segment . '/{id}/composition', $controller . '@getComposition');
+ Route::match(['get'], $segment . '/docs/{doc_id}/thumb_{doc_page}.jpg', $controller . '@getThumb');
}
protected function setupCompositionDefaults()
{
}
+ protected function getThumb($doc_id, $doc_page)
+ {
+ $path = '/mnt/sshfs/godzilla/data/fluidbook/docs/' . $doc_id . '/p' . $doc_page . '.jpg';
+ return response(null)->header('Content-Type', Files::_getMimeType($path))->header('X-Sendfile', $path);
+ }
+
protected function getComposition()
{
$res = [];
--- /dev/null
+<?php
+
+namespace App\Models;
+
+use App\Models\Base\ToolboxModel;
+use Cubist\Backpack\Magic\Fields\Datetime;
+use Cubist\Backpack\Magic\Fields\Integer;
+use Cubist\Backpack\Magic\Fields\Text;
+use Cubist\Backpack\Magic\Fields\Textarea;
+use Cubist\Backpack\Magic\Models\CubistMagicAbstractModel;
+
+class FluidbookDocument extends ToolboxModel
+{
+ protected $table = 'fluidbook_document';
+ protected $_options = ['name' => 'fluidbook-document',
+ 'singular' => 'document',
+ 'plural' => 'documents'];
+ protected static $_permissionBase = 'fluidbook-document';
+
+ public function setFields()
+ {
+ parent::setFields();
+
+ $this->addField('file', Text::class);
+ $this->addField('pages', Integer::class);
+ $this->addOwnerField();
+ $this->addField('bookmarks', Textarea::class);
+ $this->addField('pdf_data', Textarea::class);
+ $this->addField('file_data', Textarea::class);
+ }
+}
@push('crud_fields_scripts')
<script>
$(function () {
- var id = $('input[name="id"]').val();
- loadFormDatabase();
-
-
- function loadFormDatabase() {
-
+ function initPages() {
+ var data = JSON.parse($("#compositionField").val());
+ var numbers = $('input[name="page_numbers"]').val().split(',');
+ $.each(data, function (pageNr, page) {
+ addPage(page[0], page[1], numbers[pageNr - 1]);
+ });
}
- });
+ function addPage(document_id, document_page, pageNumber) {
+ $("#composition_pages").append('<div class="page"><img src="/fluidbook-publication/docs/' + document_id + '/thumb_' + document_page + '.jpg" /><span>' + pageNumber + '</span></div>');
+ }
+ initPages();
+ });
</script>
@endpush
</style>
@endpush
@endif
+<div id="composition">
+ <input
+ id="compositionField"
+ type="hidden"
+ name="{{ $field['name'] }}"
+ value="{{ old(square_brackets_to_dots($field['name'])) ?? $field['value'] ?? $field['default'] ?? '' }}"
+ @include('crud::fields.inc.attributes')
+ >
+ <div id="composition_uploader"></div>
+ <div id="composition_pages"></div>
+</div>