diff --git a/app/AppKernel.php b/app/AppKernel.php index 3789b32..c8e1f81 100644 --- a/app/AppKernel.php +++ b/app/AppKernel.php @@ -16,6 +16,7 @@ public function registerBundles() new Doctrine\Bundle\DoctrineBundle\DoctrineBundle(), new Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle(), new AppBundle\AppBundle(), + new Knp\Bundle\PaginatorBundle\KnpPaginatorBundle(), ]; if (in_array($this->getEnvironment(), ['dev', 'test'], true)) { diff --git a/app/Resources/views/homepage/homepage.html.twig b/app/Resources/views/homepage/homepage.html.twig index 13b9283..26ee20f 100644 --- a/app/Resources/views/homepage/homepage.html.twig +++ b/app/Resources/views/homepage/homepage.html.twig @@ -4,5 +4,9 @@
{% include 'components/list.html.twig' %}
+ + {% endblock %} diff --git a/app/config/config.yml b/app/config/config.yml index 3292445..b1eb3b0 100644 --- a/app/config/config.yml +++ b/app/config/config.yml @@ -66,3 +66,14 @@ swiftmailer: username: "%mailer_user%" password: "%mailer_password%" spool: { type: memory } + +knp_paginator: + page_range: 8 + default_options: + page_name: page + sort_field_name: sort + sort_direction_name: direction + distinct: true + template: + pagination: KnpPaginatorBundle:Pagination:twitter_bootstrap_v3_pagination.html.twig + sortable: KnpPaginatorBundle:Pagination:sortable_link.html.twig \ No newline at end of file diff --git a/bin/symfony_requirements b/bin/symfony_requirements index 8825a96..a7bf65a 100755 --- a/bin/symfony_requirements +++ b/bin/symfony_requirements @@ -22,7 +22,6 @@ echo '> Checking Symfony requirements:'.PHP_EOL.' '; $messages = array(); foreach ($symfonyRequirements->getRequirements() as $req) { - /** @var $req Requirement */ if ($helpText = get_error_message($req, $lineSize)) { echo_style('red', 'E'); $messages['error'][] = $helpText; @@ -121,10 +120,14 @@ function echo_block($style, $title, $message) echo PHP_EOL.PHP_EOL; - echo_style($style, str_repeat(' ', $width).PHP_EOL); - echo_style($style, str_pad(' ['.$title.']', $width, ' ', STR_PAD_RIGHT).PHP_EOL); - echo_style($style, str_pad($message, $width, ' ', STR_PAD_RIGHT).PHP_EOL); - echo_style($style, str_repeat(' ', $width).PHP_EOL); + echo_style($style, str_repeat(' ', $width)); + echo PHP_EOL; + echo_style($style, str_pad(' ['.$title.']', $width, ' ', STR_PAD_RIGHT)); + echo PHP_EOL; + echo_style($style, $message); + echo PHP_EOL; + echo_style($style, str_repeat(' ', $width)); + echo PHP_EOL; } function has_color_support() diff --git a/composer.json b/composer.json index 88499d0..649d813 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,8 @@ "symfony/polyfill-apcu": "^1.0", "sensio/distribution-bundle": "^5.0", "sensio/framework-extra-bundle": "^3.0.2", - "incenteev/composer-parameter-handler": "^2.0" + "incenteev/composer-parameter-handler": "^2.0", + "knplabs/knp-paginator-bundle": "^2.5" }, "require-dev": { "sensio/generator-bundle": "^3.0", diff --git a/src/AppBundle/Controller/HomepageController.php b/src/AppBundle/Controller/HomepageController.php index 16d2edb..4c1b89e 100644 --- a/src/AppBundle/Controller/HomepageController.php +++ b/src/AppBundle/Controller/HomepageController.php @@ -1,5 +1,6 @@ render("homepage/homepage.html.twig", [ - "products" => $this->getDoctrine()->getRepository(Product::class)->findBy( - [], - [ - "rank" => "desc" - ], - 20 - ), - "categories" => $this->getDoctrine()->getRepository(Category::class)->findBy( - [], - [ - "rank" => "desc", - ] - ), - ]); - } - - - /** - * @Route("/hello", name="hello") - * @param Request $request - * @return \Symfony\Component\HttpFoundation\Response - */ - public function helloAction(Request $request) - { - return $this->render("homepage/hello.html.twig", [ - "who" => "world", - ]); - } - + + /** + * @Route("/", name="homepage") + * @param Request $request + * @return \Symfony\Component\HttpFoundation\Response + */ + public function homepageAction(Request $request) + { + + $paginator = $this->get('knp_paginator'); + $em = $this->getDoctrine()->getManager(); + $all = $em->getRepository(Product::class)->findAll(); + $products = $paginator->paginate( + $all, + $request->query->getInt('page', 1), + 9 + ); + + return $this->render( + "homepage/homepage.html.twig", + [ + "products" => $products + , + "categories" => $em->getRepository(Category::class)->findBy( + [], + [ + "rank" => "desc", + ] + ), + ] + ); + } + + + /** + * @Route("/hello", name="hello") + * @param Request $request + * @return \Symfony\Component\HttpFoundation\Response + */ + public function helloAction(Request $request) + { + return $this->render( + "homepage/hello.html.twig", + [ + "who" => "world", + ] + ); + } + } \ No newline at end of file diff --git a/var/SymfonyRequirements.php b/var/SymfonyRequirements.php index 0a5de54..7e7723a 100644 --- a/var/SymfonyRequirements.php +++ b/var/SymfonyRequirements.php @@ -168,6 +168,9 @@ public function __construct($cfgName, $evaluation, $approveCfgAbsence = false, $ */ class RequirementCollection implements IteratorAggregate { + /** + * @var Requirement[] + */ private $requirements = array(); /** @@ -265,7 +268,7 @@ public function addCollection(RequirementCollection $collection) /** * Returns both requirements and recommendations. * - * @return array Array of Requirement instances + * @return Requirement[] */ public function all() { @@ -275,7 +278,7 @@ public function all() /** * Returns all mandatory requirements. * - * @return array Array of Requirement instances + * @return Requirement[] */ public function getRequirements() { @@ -292,7 +295,7 @@ public function getRequirements() /** * Returns the mandatory requirements that were not met. * - * @return array Array of Requirement instances + * @return Requirement[] */ public function getFailedRequirements() { @@ -309,7 +312,7 @@ public function getFailedRequirements() /** * Returns all optional recommendations. * - * @return array Array of Requirement instances + * @return Requirement[] */ public function getRecommendations() { @@ -326,7 +329,7 @@ public function getRecommendations() /** * Returns the recommendations that were not met. * - * @return array Array of Requirement instances + * @return Requirement[] */ public function getFailedRecommendations() { @@ -376,7 +379,8 @@ public function getPhpIniConfigPath() */ class SymfonyRequirements extends RequirementCollection { - const REQUIRED_PHP_VERSION = '5.3.3'; + const LEGACY_REQUIRED_PHP_VERSION = '5.3.3'; + const REQUIRED_PHP_VERSION = '5.5.9'; /** * Constructor that initializes the requirements. @@ -386,16 +390,26 @@ public function __construct() /* mandatory requirements follow */ $installedPhpVersion = phpversion(); + $requiredPhpVersion = $this->getPhpRequiredVersion(); - $this->addRequirement( - version_compare($installedPhpVersion, self::REQUIRED_PHP_VERSION, '>='), - sprintf('PHP version must be at least %s (%s installed)', self::REQUIRED_PHP_VERSION, $installedPhpVersion), - sprintf('You are running PHP version "%s", but Symfony needs at least PHP "%s" to run. - Before using Symfony, upgrade your PHP installation, preferably to the latest version.', - $installedPhpVersion, self::REQUIRED_PHP_VERSION), - sprintf('Install PHP %s or newer (installed version is %s)', self::REQUIRED_PHP_VERSION, $installedPhpVersion) + $this->addRecommendation( + $requiredPhpVersion, + 'Vendors should be installed in order to check all requirements.', + 'Run the composer install command.', + 'Run the "composer install" command.' ); + if (false !== $requiredPhpVersion) { + $this->addRequirement( + version_compare($installedPhpVersion, $requiredPhpVersion, '>='), + sprintf('PHP version must be at least %s (%s installed)', $requiredPhpVersion, $installedPhpVersion), + sprintf('You are running PHP version "%s", but Symfony needs at least PHP "%s" to run. + Before using Symfony, upgrade your PHP installation, preferably to the latest version.', + $installedPhpVersion, $requiredPhpVersion), + sprintf('Install PHP %s or newer (installed version is %s)', $requiredPhpVersion, $installedPhpVersion) + ); + } + $this->addRequirement( version_compare($installedPhpVersion, '5.3.16', '!='), 'PHP version must not be 5.3.16 as Symfony won\'t work properly with it', @@ -433,7 +447,7 @@ public function __construct() ); } - if (version_compare($installedPhpVersion, self::REQUIRED_PHP_VERSION, '>=')) { + if (false !== $requiredPhpVersion && version_compare($installedPhpVersion, $requiredPhpVersion, '>=')) { $timezones = array(); foreach (DateTimeZone::listAbbreviations() as $abbreviations) { foreach ($abbreviations as $abbreviation) { @@ -689,7 +703,7 @@ function_exists('posix_isatty'), $this->addRecommendation( \Symfony\Component\Intl\Intl::getIcuDataVersion() === \Symfony\Component\Intl\Intl::getIcuVersion(), sprintf('intl ICU version installed on your system (%s) does not match the ICU data bundled with Symfony (%s)', \Symfony\Component\Intl\Intl::getIcuVersion(), \Symfony\Component\Intl\Intl::getIcuDataVersion()), - 'To avoid internationalization data incosistencies upgrade the symfony/intl component.' + 'To avoid internationalization data inconsistencies upgrade the symfony/intl component.' ); } } @@ -725,9 +739,9 @@ function_exists('posix_isatty'), if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { $this->addRecommendation( - $this->getRealpathCacheSize() > 1000, - 'realpath_cache_size should be above 1024 in php.ini', - 'Set "realpath_cache_size" to e.g. "1024" in php.ini* to improve performance on windows.' + $this->getRealpathCacheSize() >= 5 * 1024 * 1024, + 'realpath_cache_size should be at least 5M in php.ini', + 'Setting "realpath_cache_size" to e.g. "5242880" or "5M" in php.ini* may improve performance on Windows significantly in some cases.' ); } @@ -778,4 +792,28 @@ protected function getRealpathCacheSize() return (int) $size; } } + + /** + * Defines PHP required version from Symfony version. + * + * @return string|false The PHP required version or false if it could not be guessed + */ + protected function getPhpRequiredVersion() + { + if (!file_exists($path = __DIR__.'/../composer.lock')) { + return false; + } + + $composerLock = json_decode(file_get_contents($path), true); + foreach ($composerLock['packages'] as $package) { + $name = $package['name']; + if ('symfony/symfony' !== $name && 'symfony/http-kernel' !== $name) { + continue; + } + + return (int) $package['version'][1] > 2 ? self::REQUIRED_PHP_VERSION : self::LEGACY_REQUIRED_PHP_VERSION; + } + + return false; + } } diff --git a/web/config.php b/web/config.php index 5e36d79..1368c8a 100644 --- a/web/config.php +++ b/web/config.php @@ -28,6 +28,8 @@ $majorProblems = $symfonyRequirements->getFailedRequirements(); $minorProblems = $symfonyRequirements->getFailedRecommendations(); +$hasMajorProblems = (bool) count($majorProblems); +$hasMinorProblems = (bool) count($minorProblems); ?> @@ -158,7 +160,7 @@ ready to run Symfony applications.

- +

Major problems

Major problems have been detected and must be fixed before continuing:

    @@ -170,10 +172,10 @@
- +

Recommendations

- Additionally, toTo enhance your Symfony experience, + Additionally, toTo enhance your Symfony experience, it’s recommended that you fix the following:

    @@ -195,12 +197,12 @@

    - +

    All checks passed successfully. Your system is ready to run Symfony applications.