X-Git-Url: https://git.rapsys.eu/packbundle/blobdiff_plain/3ddf076ca3e59ab12b7237bd31702300dcbb3164..4cbd6aeb6b995561ff19c41f000d29c177ef4a58:/README.md diff --git a/README.md b/README.md index ebc9136..81cd07a 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,60 @@ +Contribute +========== + +You may buy me a Beer, a Tea or help with Server fees with a paypal donation to +the address . + +Don't forget to show your love for this project, feel free to report bugs to +the author, issues which are security relevant should be disclosed privately +first. + +Patches are welcomed and grant credit when requested. + Installation ============ Applications that use Symfony Flex ---------------------------------- -Open a command console, enter your project directory and execute: +Add bundle custom repository to your project's `composer.json` file: + +```json +{ + ..., + "repositories": [ + { + "type": "package", + "package": { + "name": "rapsys/packbundle", + "version": "dev-master", + "source": { + "type": "git", + "url": "https://git.rapsys.eu/packbundle", + "reference": "master" + }, + "autoload": { + "psr-4": { + "Rapsys\\PackBundle\\": "" + } + }, + "require": { + "symfony/asset": "^4.0|^5.0|^6.0|^7.0", + "symfony/flex": "^1.0|^2.0", + "symfony/framework-bundle": "^4.0|^5.0|^6.0|^7.0", + "symfony/process": "^4.0|^5.0|^6.0|^7.0", + "symfony/twig-bundle": "^4.0|^5.0|^6.0|^7.0" + } + } + } + ], + ... +} +``` + +Then open a command console, enter your project directory and execute: ```console -$ composer require +$ composer require rapsys/packbundle dev-master ``` Applications that don't use Symfony Flex @@ -19,7 +66,7 @@ Open a command console, enter your project directory and execute the following command to download the latest stable version of this bundle: ```console -$ composer require +$ composer require rapsys/packbundle dev-master ``` This command requires you to have Composer installed globally, as explained @@ -38,16 +85,265 @@ in the `app/AppKernel.php` file of your project: // ... class AppKernel extends Kernel { - public function registerBundles() - { - $bundles = array( - // ... - new \\(), - ); + public function registerBundles() + { + $bundles = array( + // ... + new Rapsys\PackBundle\RapsysPackBundle(), + ); + + // ... + } + + // ... +} +``` + +### Step 3: Configure the Bundle + +Setup configuration file `config/packages/rapsys_pack.yaml` with the following +content available in `Resources/config/packages/rapsys_pack.yaml`: + +```yaml +#Services configuration +services: + #Replace assets.packages definition + assets.packages: + class: 'Symfony\Component\Asset\Packages' + arguments: [ '@rapsys_pack.path_package' ] + #Replace assets.context definition + assets.context: + class: 'Rapsys\PackBundle\Context\RequestStackContext' + arguments: [ '@request_stack', '%asset.request_context.base_path%', '%asset.request_context.secure%' ] + #Register assets pack package + rapsys_pack.path_package: + class: 'Rapsys\PackBundle\Package\PathPackage' + arguments: [ '/', '@assets.empty_version_strategy', '@assets.context' ] + public: true + #Register twig pack extension + rapsys_pack.pack_extension: + class: 'Rapsys\PackBundle\Extension\PackExtension' + arguments: [ '@service_container', '@rapsys_pack.intl_util', '@file_locator', '@rapsys_pack.path_package', '@rapsys_pack.slugger_util' ] + tags: [ 'twig.extension' ] + #Register intl util service + rapsys_pack.intl_util: + class: 'Rapsys\PackBundle\Util\IntlUtil' + public: true + #Register facebook event subscriber + Rapsys\PackBundle\Subscriber\FacebookSubscriber: + arguments: [ '@router', [] ] + tags: [ 'kernel.event_subscriber' ] + #Register intl util class alias + Rapsys\PackBundle\Util\IntlUtil: + alias: 'rapsys_pack.intl_util' + #Register facebook util service + rapsys_pack.facebook_util: + class: 'Rapsys\PackBundle\Util\FacebookUtil' + arguments: [ '@router', '%kernel.project_dir%/var/cache', '%rapsys_pack.path%' ] + public: true + #Register facebook util class alias + Rapsys\PackBundle\Util\FacebookUtil: + alias: 'rapsys_pack.facebook_util' + #Register image util service + rapsys_pack.image_util: + class: 'Rapsys\PackBundle\Util\ImageUtil' + arguments: [ '@router', '@rapsys_pack.slugger_util', '%kernel.project_dir%/var/cache', '%rapsys_pack.path%' ] + public: true + #Register image util class alias + Rapsys\PackBundle\Util\ImageUtil: + alias: 'rapsys_pack.image_util' + #Register map util service + rapsys_pack.map_util: + class: 'Rapsys\PackBundle\Util\MapUtil' + arguments: [ '@router', '@rapsys_pack.slugger_util' ] + public: true + #Register map util class alias + Rapsys\PackBundle\Util\MapUtil: + alias: 'rapsys_pack.map_util' + #Register slugger util service + rapsys_pack.slugger_util: + class: 'Rapsys\PackBundle\Util\SluggerUtil' + arguments: [ '%kernel.secret%' ] + public: true + #Register slugger util class alias + Rapsys\PackBundle\Util\SluggerUtil: + alias: 'rapsys_pack.slugger_util' + #Register image controller + Rapsys\PackBundle\Controller\ImageController: + arguments: [ '@service_container', '@rapsys_pack.image_util', '@rapsys_pack.slugger_util', '%kernel.project_dir%/var/cache', '%rapsys_pack.path%' ] + tags: [ 'controller.service_arguments' ] + #Register map controller + Rapsys\PackBundle\Controller\MapController: + arguments: [ '@service_container', '@rapsys_pack.map_util', '@rapsys_pack.slugger_util', '%kernel.project_dir%/var/cache', '%rapsys_pack.path%' ] + tags: [ 'controller.service_arguments' ] + Rapsys\PackBundle\Form\CaptchaType: + arguments: [ '@rapsys_pack.image_util', '@rapsys_pack.slugger_util', '@translator' ] + tags: [ 'form.type' ] +``` + +Setup configuration file `config/packages/myproject.yaml` with the following +content available in `Resources/config/packages/rapsys_pack.yaml`: + +```yaml +#Services configuration +services: + #Register facebook event subscriber + Rapsys\PackBundle\Subscriber\FacebookSubscriber: + arguments: [ '@router', [ 'en', 'en_gb', 'en_us', 'fr', 'fr_fr' ] ] + tags: [ 'kernel.event_subscriber' ] + #Register facebook util service + rapsys_blog.facebook_util: + class: 'Rapsys\PackBundle\Util\FacebookUtil' + arguments: [ '@router', '%kernel.project_dir%/var/cache', '%rapsys_pack.path%', 'facebook', '%kernel.project_dir%/public/png/facebook.png' ] + public: true +``` + +Open a command console, enter your project directory and execute the following +command to see default bundle configuration: + +```console +$ bin/console config:dump-reference RapsysPackBundle +``` + +Open a command console, enter your project directory and execute the following +command to see current bundle configuration: + +```console +$ bin/console debug:config RapsysPackBundle +``` + +### Step 4: Use the twig extension in your Template + +You can use a template like this to generate your first `rapsys_pack` enabled +template: + +```twig + + + + + {% block title %}Welcome!{% endblock %} + {% stylesheet '//fonts.googleapis.com/css?family=Irish+Grover|La+Belle+Aurore' '@NamedBundle/Resources/public/css/{reset,screen}.css' '@Short/css/example.css' %} + + {% endstylesheet %} + + + {% block body %}{% endblock %} + {% javascript '@Short/js/*.js' %} + + {% endjavascript %} + + +``` + +### Step 5: Make sure you have local binary installed - // ... - } +You need to have cpack and jpack scripts from https://git.rapsys.eu/packer/ repository +set as executable and installed in /usr/local/bin. - // ... +To install cpack and jpack required packages open a root console and execute the +following command: + +```console +# urpmi perl-base perl-CSS-Packer perl-JavaScript-Packer +``` + +or stone age distributions: + +```console +# apt-get install libcss-packer-perl libjavascript-packer-perl +``` + +or other distributions through cpan: + +```console +# cpan App::cpanminus +# cpanm CSS::Packer +# cpanm JavaScript::Packer +``` + +### Step 6: Create your own filter + +You can create you own mypackfilter class which call a mypack binary: + +```php +fileName = $fileName; + + //Set line + $this->line = $line; + + //Set bin + $this->bin = $bin; + + //Check argument presence + if (!empty($this->...)) { + //Append argument + if ($this->... == '...') { + $this->bin .= ' ...'; + } else { + //Throw an error on ... + throw new Error(sprintf('Got ... for %s: %s', $this->bin, $this->...), $this->line, $this->fileName); + } + } + } + + //Pass merge of all inputs in content + public function process(string $content): string { + //Create descriptors + $descriptorSpec = array( + 0 => array('pipe', 'r'), + 1 => array('pipe', 'w'), + 2 => array('pipe', 'w') + ); + + //Open process + if (is_resource($proc = proc_open($this->bin, $descriptorSpec, $pipes))) { + //Set stderr as non blocking + stream_set_blocking($pipes[2], false); + + //Send content to stdin + fwrite($pipes[0], $content); + + //Close stdin + fclose($pipes[0]); + + //Read content from stdout + if ($stdout = stream_get_contents($pipes[1])) { + $content = $stdout; + } + + //Close stdout + fclose($pipes[1]); + + //Read content from stderr + if (($stderr = stream_get_contents($pipes[2]))) { + throw new Error(sprintf('Got unexpected strerr for %s: %s', $this->bin, $stderr), $this->line, $this->fileName); + } + + //Close stderr + fclose($pipes[2]); + + //Close process + if (($ret = proc_close($proc))) { + throw new Error(sprintf('Got unexpected non zero return code %s: %d', $this->bin, $ret), $this->line, $this->fileName); + } + } + + //Return content + return $content; + } } ``` + +The class must implements FilterInterface and get it's arguments through constructor.