public generateURL ( string $url, string $class, string $method, array $parameters = [] ) : string | ||
$url | string | The base-url to start from. |
$class | string | The Fully Qualified Class Name or service name |
$method | string | The method that needs to be called |
$parameters | array | The parameters for the callback |
Результат | string |
public function generateURL($url, $class, $method, array $parameters = [])
{
// check if the class is a service
if (Model::getContainer()->has($class)) {
$class = Model::getContainer()->get($class);
}
// validate (check if the function exists)
if (!is_callable([$class, $method])) {
throw new Exception('The callback-method doesn\'t exist.');
}
// when using ->getValue() in SpoonFormText fields the function is using htmlentities(),
// so we must decode it again first!
$url = SpoonFilter::htmlentitiesDecode($url);
$actualParameters = [];
// build parameters for use in the callback
$actualParameters[] = Uri::getUrl($url);
// add parameters set by user
if (!empty($parameters)) {
foreach ($parameters as $parameter) {
$actualParameters[] = $parameter;
}
}
// get the real url
return call_user_func_array([$class, $method], $actualParameters);
}
/** * @param string $baseFieldName * * @return Closure */ private function getSubmitEventFunction($baseFieldName) { return function (FormEvent $event) use($baseFieldName) { $metaForm = $event->getForm(); $metaData = $event->getData(); $parentForm = $metaForm->getParent(); if ($parentForm === null) { throw new LogicException('The MetaType is not a stand alone type, it needs to be used in a parent form'); } if (!$parentForm->has($baseFieldName)) { throw new InvalidArgumentException('The base_field_name does not exist in the parent form'); } $defaultValue = $parentForm->get($baseFieldName)->getData(); $overwritableFields = $this->getOverwritableFields(); array_walk($overwritableFields, function ($fieldName) use($metaForm, $defaultValue, &$metaData) { if ($metaForm->get($fieldName . 'Overwrite')->getData()) { // we are overwriting it so we don't need to set the fallback return; } $metaData[$fieldName] = $defaultValue; }); $generatedUrl = $this->metaRepository->generateURL(SpoonFilter::htmlspecialcharsDecode($metaData['url']), $metaForm->getConfig()->getOption('generate_url_callback_class'), $metaForm->getConfig()->getOption('generate_url_callback_method'), $metaForm->getConfig()->getOption('generate_url_callback_parameters')); if ($generatedUrl !== $metaData['url'] && $metaData['urlOverwrite']) { $metaForm->get('url')->addError(new FormError($this->translator->trans('err.URLAlreadyExists'))); $event->setData($metaData); return; } $metaData['url'] = $generatedUrl; $event->setData($metaData); }; }