Required
- php 7.1
- Bootstrap
- JQuery
- chomenko/app-webloader
- nette/application
- nette/utils
- tracy/tracy
- latte/latte
- nettpack/stage
composer require chomenko/modal
Add extension
extensions:
modals: Chomenko\Modal\DI\ModalExtension
Add to BasePresenter.php
namespace App;
use Chomenko\Modal\IWrappedModal;
abstract class BasePresenter extends Presenter
/**
* @var IWrappedModal @inject
*/
public $modalFactory;
public function createComponentModal()
{
/** @var WrappedModal $wrapped */
$wrapped = $this->modalFactory->create();
return $wrapped;
}
}
Add to layout.late
<!DOCTYPE html>
<html>
<head>
{control css}
</head>
<body class="skin-purple sidebar-mini fixed">
{control modal}
{control footerCss}
{block scripts}
{control js}
{/block}
</body>
</html>
Create your first modal. Create file HelloWorldModal.php podivej se na Chomenko\Modal\ModalControl
<?php
namespace App\Components;
use Chomenko\AutoInstall\AutoInstall;
use Chomenko\AutoInstall\Config;
use Chomenko\Modal\ModalHtml;
use Chomenko\Modal\WrappedHtml;
use Chomenko\Modal\ModalControl;
use Chomenko\Modal\ModalFactory;
use Chomenko\Modal\AccessAction;
use Nette\Http\Url;
/**
* @Config\Tag({"modal.factory"})
*/
class HelloWorldModal extends ModalControl implements AutoInstall
{
/**
* @var $id
*/
private $id;
/**
* @param int $id
*/
public function create($id)
{
$this->id = $id;
}
/**
* @param ModalFactory $factory
* @param Url $url
* @param array $parameters
* @throws \Exception
*/
public static function onCreateUrl(ModalFactory $factory, Url $url, array $parameters = [])
{
}
/**
* @param AccessAction $accessAction
* @return bool
*/
public function access(AccessAction $accessAction): bool
{
return $accessAction->getUser()->isLoggedIn();
}
/**
* @return string
*/
public function getTitle() :string
{
return "Hello World";
}
/**
* @param WrappedHtml $wrappedHtml
*/
public function renderBody(WrappedHtml $wrappedHtml, ModalHtml $body)
{
$this->template->id = $this->id;
$this->template->setFile(__DIR__ . "/body.latte");
$this->template->render();
}
}
Create file IHelloWorldModal.php
namespace App\Components;
interface IHelloWorldModal
{
/**
* @return HelloWorldModal
*/
public function create();
}
Create file body.latte
<div class="modal-body">
<h1>Hello World</h1>
</div>
And create modal link
<a href="{mlink 'bf1318e1', id => 123}">Hello world modal</a>
{* OR *}
<a href="{mlink 'App\Components\IHelloWorldModal', id => 123}">Hello world modal</a>
{* OR *}
<a n:mlink="'bf1318e1', id => 123">Hello world modal</a>
{* OR *}
<a n:mlink="'App\Components\IHelloWorldModal', id => 123">Hello world modal</a>
Link can also be created manually.
/** @var \Chomenko\Modal\ModalController $modalController */
$modalController = $this->container->getByType(ModalController::class);
/** @var \Chomenko\Modal\ModalFactory $factory */
$factory = $modalController->getByInterface(IHelloWorldModal::class);
/** @var \Nette\Http\Url $url */
$url = $factory->getUrl(["my" => "parameter"]);
If you do not use auto-install.
services:
helloWorldModal:
implement: App\Components\IHelloWorldModal
tags: ["modal.factory"]
Event list
- Subscriber::CREATE
- Subscriber::ACCESS
- Subscriber::ACCESS_FAILURE
- Subscriber::ACCESS_SUCCESS
- Subscriber::AFTER_RENDER
- Subscriber::BEFORE_RENDER
namespace App\Components;
use Chomenko\AutoInstall\AutoInstall;
use Chomenko\AutoInstall\Tag;
use Chomenko\Modal\AccessAction;
use Chomenko\Modal\Events\Subscriber;
use Chomenko\Modal\ModalControl;
/**
* @Tag({"modal.events"})
*/
class ModalEvent extends Subscriber implements AutoInstall
{
public function getSubscribedEvents(): array
{
return [
Subscriber::ACCESS
];
}
public function access(ModalControl $modalControl, AccessAction $accessAction): bool
{
return TRUE;
}
}