mirror of
https://github.com/torrentpier/torrentpier-lts.git
synced 2025-03-01 15:21:02 +03:00
157 lines
4.8 KiB
PHP
157 lines
4.8 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Zend Framework (http://framework.zend.com/)
|
||
|
*
|
||
|
* @link http://github.com/zendframework/zf2 for the canonical source repository
|
||
|
* @copyright Copyright (c) 2005-2014 Zend Technologies USA Inc. (http://www.zend.com)
|
||
|
* @license http://framework.zend.com/license/new-bsd New BSD License
|
||
|
*/
|
||
|
|
||
|
namespace Zend\Form;
|
||
|
|
||
|
use Zend\InputFilter\InputFilterInterface;
|
||
|
use Zend\ServiceManager\AbstractFactoryInterface;
|
||
|
use Zend\ServiceManager\ServiceLocatorInterface;
|
||
|
|
||
|
class FormAbstractServiceFactory implements AbstractFactoryInterface
|
||
|
{
|
||
|
/**
|
||
|
* @var array
|
||
|
*/
|
||
|
protected $config;
|
||
|
|
||
|
/**
|
||
|
* @var string Top-level configuration key indicating forms configuration
|
||
|
*/
|
||
|
protected $configKey = 'forms';
|
||
|
|
||
|
/**
|
||
|
* @var Factory Form factory used to create forms
|
||
|
*/
|
||
|
protected $factory;
|
||
|
|
||
|
/**
|
||
|
* Can we create the requested service?
|
||
|
*
|
||
|
* @param ServiceLocatorInterface $serviceLocator
|
||
|
* @param string $name Service name (as resolved by ServiceManager)
|
||
|
* @param string $requestedName Name by which service was requested
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function canCreateServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
|
||
|
{
|
||
|
$config = $this->getConfig($serviceLocator);
|
||
|
if (empty($config)) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return (isset($config[$requestedName]) && is_array($config[$requestedName]) && !empty($config[$requestedName]));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Create a form
|
||
|
*
|
||
|
* @param ServiceLocatorInterface $serviceLocator
|
||
|
* @param string $name Service name (as resolved by ServiceManager)
|
||
|
* @param string $requestedName Name by which service was requested
|
||
|
* @return Form
|
||
|
*/
|
||
|
public function createServiceWithName(ServiceLocatorInterface $serviceLocator, $name, $requestedName)
|
||
|
{
|
||
|
$config = $this->getConfig($serviceLocator);
|
||
|
$config = $config[$requestedName];
|
||
|
$factory = $this->getFormFactory($serviceLocator);
|
||
|
|
||
|
$this->marshalInputFilter($config, $serviceLocator, $factory);
|
||
|
return $factory->createForm($config);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get forms configuration, if any
|
||
|
*
|
||
|
* @param ServiceLocatorInterface $services
|
||
|
* @return array
|
||
|
*/
|
||
|
protected function getConfig(ServiceLocatorInterface $services)
|
||
|
{
|
||
|
if ($this->config !== null) {
|
||
|
return $this->config;
|
||
|
}
|
||
|
|
||
|
if (!$services->has('Config')) {
|
||
|
$this->config = array();
|
||
|
return $this->config;
|
||
|
}
|
||
|
|
||
|
$config = $services->get('Config');
|
||
|
if (!isset($config[$this->configKey])
|
||
|
|| !is_array($config[$this->configKey])
|
||
|
) {
|
||
|
$this->config = array();
|
||
|
return $this->config;
|
||
|
}
|
||
|
|
||
|
$this->config = $config[$this->configKey];
|
||
|
return $this->config;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Retrieve the form factory, creating it if necessary
|
||
|
*
|
||
|
* @param ServiceLocatorInterface $services
|
||
|
* @return Factory
|
||
|
*/
|
||
|
protected function getFormFactory(ServiceLocatorInterface $services)
|
||
|
{
|
||
|
if ($this->factory instanceof Factory) {
|
||
|
return $this->factory;
|
||
|
}
|
||
|
|
||
|
$elements = null;
|
||
|
if ($services->has('FormElementManager')) {
|
||
|
$elements = $services->get('FormElementManager');
|
||
|
}
|
||
|
|
||
|
$this->factory = new Factory($elements);
|
||
|
return $this->factory;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Marshal the input filter into the configuration
|
||
|
*
|
||
|
* If an input filter is specified:
|
||
|
* - if the InputFilterManager is present, checks if it's there; if so,
|
||
|
* retrieves it and resets the specification to the instance.
|
||
|
* - otherwise, pulls the input filter factory from the form factory, and
|
||
|
* attaches the FilterManager and ValidatorManager to it.
|
||
|
*
|
||
|
* @param array $config
|
||
|
* @param ServiceLocatorInterface $services
|
||
|
* @param Factory $formFactory
|
||
|
*/
|
||
|
protected function marshalInputFilter(array &$config, ServiceLocatorInterface $services, Factory $formFactory)
|
||
|
{
|
||
|
if (!isset($config['input_filter'])) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if ($config['input_filter'] instanceof InputFilterInterface) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (is_string($config['input_filter'])
|
||
|
&& $services->has('InputFilterManager')
|
||
|
) {
|
||
|
$inputFilters = $services->get('InputFilterManager');
|
||
|
if ($inputFilters->has($config['input_filter'])) {
|
||
|
$config['input_filter'] = $inputFilters->get($config['input_filter']);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$inputFilterFactory = $formFactory->getInputFilterFactory();
|
||
|
$inputFilterFactory->getDefaultFilterChain()->setPluginManager($services->get('FilterManager'));
|
||
|
$inputFilterFactory->getDefaultValidatorChain()->setPluginManager($services->get('ValidatorManager'));
|
||
|
}
|
||
|
}
|