PHP code example of mezcalito / sylius-file-upload-plugin

1. Go to this page and download the library: Download mezcalito/sylius-file-upload-plugin library. Choose the download type require.

2. Extract the ZIP file and open the index.php.

3. Add this code to the index.php.
    
        
<?php
require_once('vendor/autoload.php');

/* Start to develop here. Best regards https://php-download.com/ */

    

mezcalito / sylius-file-upload-plugin example snippets


// bundles.php

return [
    // ...
    Mezcalito\SyliusFileUploadPlugin\MezcalitoSyliusFileUploadPlugin::class => ['all' => true], 
];

# src/entity/book.php


namespace App\Entity;

use Doctrine\Common\Collections\Collection;
use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;
use Mezcalito\SyliusFileUploadPlugin\Model\FilesAwareInterface;
use Mezcalito\SyliusFileUploadPlugin\Model\FilesAwareTrait;
use Sylius\Component\Resource\Model\ResourceInterface;
use Sylius\Resource\Metadata\AsResource;
use Sylius\Resource\Metadata\BulkDelete;
use Sylius\Resource\Metadata\Create;
use Sylius\Resource\Metadata\Delete;
use Sylius\Resource\Metadata\Index;
use Sylius\Resource\Metadata\Show;
use Sylius\Resource\Metadata\Update;


#[ORM\Entity]
#[ORM\Table(name: 'app_book')]
class Book implements ResourceInterface, FilesAwareInterface
{

    use FilesAwareTrait {
        FilesAwareTrait::__construct as private initializeFilesCollection;
    }

    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: Types::INTEGER)]
    protected ?int $id = null;

    #[ORM\OneToMany( mappedBy: 'owner', targetEntity: BookFile::class, cascade: ['all'], orphanRemoval: true)]
    #[ORM\JoinTable(name: 'app_book_file')]
    protected Collection $files;

    public function getId(): ?int
    {
        return $this->id;
    }
    public function __construct() {
        $this->initializeFilesCollection();
    }


}


# src/entity/Book.php
#[AsResource(alias: 'app.book', section: 'admin', formType: BookType::class, templatesDir: '@SyliusAdmin\\shared\\crud', routePrefix: 'admin')]
#[Index(grid: 'app_book')]
#[Create]
#[Update]
#[Delete]
#[Show]
#[BulkDelete]
#[Create(formType: BookType::class)]

# src/entity/BookFile.php


declare(strict_types=1);

namespace App\Entity;

use Mezcalito\SyliusFileUploadPlugin\Model\File;

class BookFile extends File
{
}

# src/entity/BookFile.php

#[AsResource(alias: 'test.book_file', section: 'admin', formType: BookFileType::class, routePrefix: 'admin')]
class BookFile extends File
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column(type: Types::INTEGER)]
    protected ?int $id = null;

    #[ORM\ManyToOne( targetEntity: Book::class, inversedBy: 'files')]
    #[ORM\JoinColumn(name: 'owner_id', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')]
    protected mixed $owner;
}



declare(strict_types=1);

namespace App\Form\Type;

use Sylius\Bundle\AdminBundle\Form\Type\AddButtonType;
use Sylius\Bundle\ResourceBundle\Form\Type\AbstractResourceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\UX\LiveComponent\Form\Type\LiveCollectionType;

class BookType extends AbstractResourceType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder->add('files', LiveCollectionType::class, [
            'entry_type' => BookFileType::class,
            'allow_add' => true,
            'allow_delete' => true,
            'by_reference' => false,
            'button_add_type' => AddButtonType::class,
            'button_add_options' => [
                'label' => 'sylius.ui.add_rule',
            ],
            'button_delete_options' => [
                'label' => false,
            ],
        ]);
    }
    public function getBlockPrefix(): string
    {
        return 'app_admin_book';
    }
}


public function __construct()
{
    parent::__construct();
    $this->files = new ArrayCollection();
    $this->addFile(new BookFile());
}



declare(strict_types=1);

namespace App\Form\Type;

use Mezcalito\SyliusFileUploadPlugin\Form\Type\FileType;

class BookFileType extends FileType
{
    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix(): string
    {
        return 'app_admin_book_file';
    }
}

# src/Grid/BookGrid.php


namespace App\Grid;

use Sylius\Bundle\GridBundle\Builder\Action\CreateAction;
use Sylius\Bundle\GridBundle\Builder\Action\DeleteAction;
use Sylius\Bundle\GridBundle\Builder\Action\UpdateAction;
use Sylius\Bundle\GridBundle\Builder\ActionGroup\BulkActionGroup;
use Sylius\Bundle\GridBundle\Builder\ActionGroup\ItemActionGroup;
use Sylius\Bundle\GridBundle\Builder\ActionGroup\MainActionGroup;
use Sylius\Bundle\GridBundle\Builder\Field\TwigField;
use Sylius\Bundle\GridBundle\Builder\GridBuilderInterface;
use Sylius\Bundle\GridBundle\Grid\AbstractGrid;
use Sylius\Bundle\GridBundle\Grid\ResourceAwareGridInterface;
use App\Entity\Book;

final class BookGrid extends AbstractGrid implements ResourceAwareGridInterface
{
    public static function getName(): string
    {
        return 'app_book';
    }

    public function buildGrid(GridBuilderInterface $gridBuilder): void
    {
        $gridBuilder
            // see https://github.com/Sylius/SyliusGridBundle/blob/master/docs/field_types.md
            ->addActionGroup(
                MainActionGroup::create(
                    CreateAction::create(),
                )
            )
            ->addActionGroup(
                ItemActionGroup::create(
                    // ShowAction::create(),
                    UpdateAction::create(),
                    DeleteAction::create()
                )
            )
            ->addActionGroup(
                BulkActionGroup::create(
                    DeleteAction::create()
                )
            )
            ->addField(
                TwigField::create(name: 'files', template: 'book/grid/field/files.html.twig')->setPath('files'),
            )
        ;
    }

    public function getResourceClass(): string
    {
        return Book::class;
    }
}


# src/Twig/Components/BookFormComponent.php

namespace App\Twig\Components;

use Sylius\TwigHooks\LiveComponent\HookableLiveComponentTrait;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Form\FormInterface;
use Symfony\UX\LiveComponent\Attribute\AsLiveComponent;
use Symfony\UX\LiveComponent\Attribute\LiveProp;
use Symfony\UX\LiveComponent\DefaultActionTrait;
use Symfony\UX\LiveComponent\LiveCollectionTrait;
use App\Entity\Book;
use App\Form\Type\BookType;

#[AsLiveComponent(template: '@SyliusAdmin/shared/crud/common/content/form.html.twig')]
class BookFormComponent extends AbstractController
{
    use LiveCollectionTrait;
    use DefaultActionTrait;
    use HookableLiveComponentTrait; // for Sylius Twig Hooks

    #[LiveProp]
    public Book $resource;

    protected function instantiateForm(): FormInterface
    {
        return $this->createForm(BookType::class, $this->resource);
    }
}


# src/Menu/AdminMenuListener.php


declare(strict_types=1);

namespace App\Menu;

use Sylius\Bundle\UiBundle\Menu\Event\MenuBuilderEvent;

final class AdminMenuListener
{

    public function addAdminMenuItems(MenuBuilderEvent $event): void
    {
        $menu = $event->getMenu();

        $contentAdmin = $menu
            ->addChild('new')
            ->setLabel('app.ui.nav.menu.content_admin');

        $contentAdmin->addChild('admin_book', ['route' => 'app_admin_book_index'])
            ->setLabel('book')
            ->setLabelAttribute('icon', 'window minimize');

    }
}