From c4f725623696c11c1c54ffd42a8b0f5d11010e81 Mon Sep 17 00:00:00 2001 From: nobohan Date: Wed, 4 Apr 2018 10:16:26 +0200 Subject: [PATCH 1/6] fix deprecations: options array -> no array for options resolver --- Form/UserType.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Form/UserType.php b/Form/UserType.php index 5d82f6351..0b6df9994 100644 --- a/Form/UserType.php +++ b/Form/UserType.php @@ -48,7 +48,7 @@ class UserType extends AbstractType $resolver ->setDefaults(array('is_creation' => false)) - ->addAllowedValues(array('is_creation' => array(true, false))) + ->addAllowedValues('is_creation', array(true, false)) ; } From 56a695e66eec10f01adfc08b28cc438dfbb2f375 Mon Sep 17 00:00:00 2001 From: nobohan Date: Wed, 4 Apr 2018 10:29:57 +0200 Subject: [PATCH 2/6] fix deprecations: use the fqcn for choiceType --- Export/Formatter/CSVFormatter.php | 190 +++++++-------- Export/Formatter/SpreadSheetFormatter.php | 270 +++++++++++----------- Form/Type/AppendScopeChoiceTypeTrait.php | 52 ++--- Form/Type/ComposedRoleScopeType.php | 4 +- Form/Type/Export/PickFormatterType.php | 18 +- Form/UserType.php | 3 +- 6 files changed, 269 insertions(+), 268 deletions(-) diff --git a/Export/Formatter/CSVFormatter.php b/Export/Formatter/CSVFormatter.php index 1beebdef4..8b860d07e 100644 --- a/Export/Formatter/CSVFormatter.php +++ b/Export/Formatter/CSVFormatter.php @@ -30,7 +30,7 @@ use Symfony\Component\Form\Extension\Core\Type\FormType; // command to get the report with curl : curl --user "center a_social:password" "http://localhost:8000/fr/exports/generate/count_person?export[filters][person_gender_filter][enabled]=&export[filters][person_nationality_filter][enabled]=&export[filters][person_nationality_filter][form][nationalities]=&export[aggregators][person_nationality_aggregator][order]=1&export[aggregators][person_nationality_aggregator][form][group_by_level]=country&export[submit]=&export[_token]=RHpjHl389GrK-bd6iY5NsEqrD5UKOTHH40QKE9J1edU" --globoff /** - * + * * * @author Julien Fastré * @deprecated this formatter is not used any more. @@ -42,49 +42,49 @@ class CSVFormatter implements FormatterInterface * @var TranslatorInterface */ protected $translator; - + protected $result; - + protected $formatterData; - + protected $export; - + protected $aggregators; - + protected $exportData; - + protected $aggregatorsData; - + protected $filtersData; - + protected $labels; - + /** * * @var ExportManager */ protected $exportManager; - - - public function __construct(TranslatorInterface $translator, + + + public function __construct(TranslatorInterface $translator, ExportManager $manager) { $this->translator = $translator; $this->exportManager = $manager; } - + public function getType() { return 'tabular'; } - + public function getName() { return 'Comma separated values (CSV)'; } - + /** - * + * * @uses appendAggregatorForm * @param FormBuilderInterface $builder * @param type $exportAlias @@ -94,7 +94,7 @@ class CSVFormatter implements FormatterInterface { $aggregators = $this->exportManager->getAggregators($aggregatorAliases); $nb = count($aggregatorAliases); - + foreach ($aggregators as $alias => $aggregator) { $builderAggregator = $builder->create($alias, FormType::class, array( 'label' => $aggregator->getTitle(), @@ -104,19 +104,19 @@ class CSVFormatter implements FormatterInterface $builder->add($builderAggregator); } } - + /** * append a form line by aggregator on the formatter form. - * - * This form allow to choose the aggregator position (row or column) and + * + * This form allow to choose the aggregator position (row or column) and * the ordering - * + * * @param FormBuilderInterface $builder * @param string $nbAggregators */ private function appendAggregatorForm(FormBuilderInterface $builder, $nbAggregators) { - $builder->add('order', 'choice', array( + $builder->add('order', ChoiceType::class, array( 'choices' => array_combine( range(1, $nbAggregators), range(1, $nbAggregators) @@ -124,8 +124,8 @@ class CSVFormatter implements FormatterInterface 'multiple' => false, 'expanded' => false )); - - $builder->add('position', 'choice', array( + + $builder->add('position', ChoiceType::class, array( 'choices' => array( 'row' => 'r', 'column' => 'c' @@ -135,13 +135,13 @@ class CSVFormatter implements FormatterInterface 'expanded' => false )); } - + public function getResponse( - $result, - $formatterData, - $exportAlias, - array $exportData, - array $filtersData, + $result, + $formatterData, + $exportAlias, + array $exportData, + array $filtersData, array $aggregatorsData ) { $this->result = $result; @@ -153,25 +153,25 @@ class CSVFormatter implements FormatterInterface $this->aggregatorsData = $aggregatorsData; $this->labels = $this->gatherLabels(); $this->filtersData = $filtersData; - + $response = new Response(); $response->setStatusCode(200); $response->headers->set('Content-Type', 'text/csv; charset=utf-8'); //$response->headers->set('Content-Disposition','attachment; filename="export.csv"'); $response->setContent($this->generateContent()); - + return $response; } - + /** * ordering aggregators, preserving key association. - * + * * This function do not mind about position. - * - * If two aggregators have the same order, the second given will be placed + * + * If two aggregators have the same order, the second given will be placed * after. This is not significant for the first ordering. - * + * * @param type $formatterData * @return type */ @@ -179,11 +179,11 @@ class CSVFormatter implements FormatterInterface { $this->formatterData = $formatterData; uasort($this->formatterData, function($a, $b) { - + return ($a['order'] <= $b['order'] ? -1 : 1); }); } - + protected function generateContent() { $rowKeysNb = count($this->getRowHeaders()); @@ -195,7 +195,7 @@ class CSVFormatter implements FormatterInterface /* @var $data string[] the data of the csv file */ $contentData = array(); $content = array(); - + function findColumnPosition(&$columnHeaders, $columnToFind) { $i = 0; foreach($columnHeaders as $set) { @@ -204,13 +204,13 @@ class CSVFormatter implements FormatterInterface } $i++; } - + //we didn't find it, adding the column $columnHeaders[] = $columnToFind; - + return $i++; } - + // create a file pointer connected to the output stream $output = fopen('php://output', 'w'); @@ -218,18 +218,18 @@ class CSVFormatter implements FormatterInterface fputcsv($output, array($this->translator->trans($this->export->getTitle()))); //blank line fputcsv($output, array("")); - + // add filtering description foreach($this->gatherFiltersDescriptions() as $desc) { fputcsv($output, array($desc)); } // blank line fputcsv($output, array("")); - + // iterate on result to : 1. populate row headers, 2. populate column headers, 3. add result foreach ($results as $row) { $rowHeaders = array_slice($row, 0, $rowKeysNb); - + //first line : we create line and adding them row headers if (!isset($line)) { $line = array_slice($row, 0, $rowKeysNb); @@ -245,49 +245,49 @@ class CSVFormatter implements FormatterInterface /* @var $columns string[] the column for this row */ $columns = array_slice($row, $rowKeysNb, $columnKeysNb); $columnPosition = findColumnPosition($columnHeaders, $columns); - + //fill with blank at the position given by the columnPosition + nbRowHeaders for ($i=0; $i < $columnPosition; $i++) { if (!isset($line[$rowKeysNb + $i])) { $line[$rowKeysNb + $i] = ""; } } - + $resultData = array_slice($row, $resultsKeysNb*-1); foreach($resultData as $data) { $line[] = $data; } - + } - + // we add the last line $contentData[] = $line; - + //column title headers for ($i=0; $i < $columnKeysNb; $i++) { $line = array_fill(0, $rowKeysNb, ''); - + foreach($columnHeaders as $set) { $line[] = $set[$i]; } - + $content[] = $line; } - - + + //row title headers $headerLine = array(); foreach($this->getRowHeaders() as $headerKey) { - $headerLine[] = array_key_exists('_header', $this->labels[$headerKey]) ? + $headerLine[] = array_key_exists('_header', $this->labels[$headerKey]) ? $this->labels[$headerKey]['_header'] : ''; } foreach($this->export->getQueryKeys($this->exportData) as $key) { - $headerLine[] = array_key_exists('_header', $this->labels[$key]) ? + $headerLine[] = array_key_exists('_header', $this->labels[$key]) ? $this->labels[$key]['_header'] : ''; } fputcsv($output, $headerLine); unset($headerLine); //free memory - + //generate CSV foreach($content as $line) { fputcsv($output, $line); @@ -295,14 +295,14 @@ class CSVFormatter implements FormatterInterface foreach($contentData as $line) { fputcsv($output, $line); } - + $text = stream_get_contents($output); fclose($output); - + return $text; } - - + + private function getOrderedResults() { $r = array(); @@ -312,24 +312,24 @@ class CSVFormatter implements FormatterInterface $columnKeys = $this->getColumnHeaders(); $resultsKeys = $this->export->getQueryKeys($this->exportData); $headers = array_merge($rowKeys, $columnKeys); - + foreach ($results as $row) { $line = array(); foreach ($headers as $key) { - + $line[] = call_user_func($labels[$key], $row[$key]); } - + //append result foreach ($resultsKeys as $key) { $line[] = call_user_func($labels[$key], $row[$key]); } - + $r[] = $line; } - + array_multisort($r); - + return $r; } @@ -338,14 +338,14 @@ class CSVFormatter implements FormatterInterface { return $this->getPositionnalHeaders('r'); } - + protected function getColumnHeaders() { return $this->getPositionnalHeaders('c'); } - + /** - * + * * @param string $position may be 'c' (column) or 'r' (row) * @return string[] * @throws \RuntimeException @@ -359,19 +359,19 @@ class CSVFormatter implements FormatterInterface . "aggregator with alias $alias, but the export do not " . "contains data about it"); } - + $aggregator = $this->aggregators[$alias]; - + if ($data['position'] === $position) { $headers = array_merge($headers, $aggregator->getQueryKeys($this->aggregatorsData[$alias])); } } - + return $headers; } - + /** - * + * * @param mixed $result * @param \Chill\MainBundle\Export\AggregatorInterface[] $aggregators */ @@ -382,14 +382,14 @@ class CSVFormatter implements FormatterInterface $this->gatherLabelsFromExport() ); } - + protected function gatherLabelsFromAggregators() { $labels = array(); /* @var $aggretator \Chill\MainBundle\Export\AggregatorInterface */ foreach ($this->aggregators as $alias => $aggregator) { $keys = $aggregator->getQueryKeys($this->aggregatorsData[$alias]); - + // gather data in an array foreach($keys as $key) { $values = array_map(function($row) use ($key, $alias) { @@ -398,57 +398,57 @@ class CSVFormatter implements FormatterInterface . "the aggregator with alias '".$alias."' but is not " . "present in results"); } - + return $row[$key]; }, $this->result); - $labels[$key] = $aggregator->getLabels($key, array_unique($values), + $labels[$key] = $aggregator->getLabels($key, array_unique($values), $this->aggregatorsData[$alias]); } } - + return $labels; } - + protected function gatherLabelsFromExport() { $labels = array(); $export = $this->export; $keys = $this->export->getQueryKeys($this->exportData); - + foreach($keys as $key) { - $values = array_map(function($row) use ($key, $export) { + $values = array_map(function($row) use ($key, $export) { if (!array_key_exists($key, $row)) { throw new \LogicException("the key '".$key."' is declared by " . "the export with title '".$export->getTitle()."' but is not " . "present in results"); } - + return $row[$key]; }, $this->result); $labels[$key] = $this->export->getLabels($key, array_unique($values), $this->exportData); } - + return $labels; } - + public function gatherFiltersDescriptions() { $descriptions = array(); - + foreach($this->filtersData as $key => $filterData) { - + $statement = $this->exportManager ->getFilter($key) ->describeAction($filterData); - + if ($statement === null) { continue; } - + if (is_array($statement)) { $descriptions[] = $this->translator->trans( - $statement[0], + $statement[0], $statement[1], isset($statement[2]) ? $statement[2] : null, isset($statement[3]) ? $statement[3] : null); @@ -456,8 +456,8 @@ class CSVFormatter implements FormatterInterface $descriptions[] = $statement; } } - + return $descriptions; } - + } diff --git a/Export/Formatter/SpreadSheetFormatter.php b/Export/Formatter/SpreadSheetFormatter.php index fcd7e8ad6..71037f5bd 100644 --- a/Export/Formatter/SpreadSheetFormatter.php +++ b/Export/Formatter/SpreadSheetFormatter.php @@ -27,7 +27,7 @@ use PhpOffice\PhpSpreadsheet\Worksheet\Worksheet; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; /** - * + * * * @author Julien Fastré */ @@ -38,119 +38,119 @@ class SpreadSheetFormatter implements FormatterInterface * @var TranslatorInterface */ protected $translator; - + /** * * @var ExportManager */ protected $exportManager; - + /** * The result, as returned by the export * * replaced when `getResponse` is called. - * - * @var type + * + * @var type */ protected $result; - + /** * * replaced when `getResponse` is called. - * - * @var type + * + * @var type */ protected $formatterData; - + /** * The export - * + * * replaced when `getResponse` is called. - * + * * @var \Chill\MainBundle\Export\ExportInterface */ protected $export; - + /** - * + * * replaced when `getResponse` is called. * - * @var type + * @var type */ //protected $aggregators; - + /** * array containing value of export form * * replaced when `getResponse` is called. - * - * @var array + * + * @var array */ protected $exportData; - + /** * an array where keys are the aggregators aliases and * values are the data * * replaced when `getResponse` is called. - * - * @var type + * + * @var type */ protected $aggregatorsData; - + /** * * replaced when `getResponse` is called. - * - * @var array + * + * @var array */ protected $filtersData; - + /** * * replaced when `getResponse` is called. - * - * @var array + * + * @var array */ //protected $labels; - + /** * temporary file to store spreadsheet * * @var string */ protected $tempfile; - + /** * cache for displayable result. - * + * * This cache is reset when `getResponse` is called. - * - * The array's keys are the keys in the raw result, and - * values are the callable which will transform the raw result to + * + * The array's keys are the keys in the raw result, and + * values are the callable which will transform the raw result to * displayable result. * * @var array */ private $cacheDisplayableResult; - + /** * Whethe `cacheDisplayableResult` is initialized or not. * * @var boolean */ private $cacheDisplayableResultIsInitialized = false; - + public function __construct(TranslatorInterface $translatorInterface, ExportManager $exportManager) { $this->translator = $translatorInterface; $this->exportManager = $exportManager; } - + public function buildForm( - FormBuilderInterface $builder, - $exportAlias, + FormBuilderInterface $builder, + $exportAlias, array $aggregatorAliases ) { // choosing between formats @@ -163,11 +163,11 @@ class SpreadSheetFormatter implements FormatterInterface 'choices_as_values' => true, 'placeholder' => 'Choose the format' )); - + // ordering aggregators $aggregators = $this->exportManager->getAggregators($aggregatorAliases); $nb = count($aggregatorAliases); - + foreach ($aggregators as $alias => $aggregator) { $builderAggregator = $builder->create($alias, FormType::class, array( 'label' => $aggregator->getTitle(), @@ -177,19 +177,19 @@ class SpreadSheetFormatter implements FormatterInterface $builder->add($builderAggregator); } } - + /** * append a form line by aggregator on the formatter form. - * - * This form allow to choose the aggregator position (row or column) and + * + * This form allow to choose the aggregator position (row or column) and * the ordering - * + * * @param FormBuilderInterface $builder * @param string $nbAggregators */ private function appendAggregatorForm(FormBuilderInterface $builder, $nbAggregators) { - $builder->add('order', 'choice', array( + $builder->add('order', ChoiceType::class, array( 'choices' => array_combine( range(1, $nbAggregators), range(1, $nbAggregators) @@ -197,7 +197,7 @@ class SpreadSheetFormatter implements FormatterInterface 'multiple' => false, 'expanded' => false )); - + } public function getName() @@ -206,11 +206,11 @@ class SpreadSheetFormatter implements FormatterInterface } public function getResponse( - $result, - $formatterData, - $exportAlias, - array $exportData, - array $filtersData, + $result, + $formatterData, + $exportAlias, + array $exportData, + array $filtersData, array $aggregatorsData ) { // store all data when the process is initiated @@ -220,46 +220,46 @@ class SpreadSheetFormatter implements FormatterInterface $this->exportData = $exportData; $this->filtersData = $filtersData; $this->aggregatorsData = $aggregatorsData; - + // reset cache $this->cacheDisplayableResult = array(); $this->cacheDisplayableResultIsInitialized = false; - + $response = new Response(); - $response->headers->set('Content-Type', + $response->headers->set('Content-Type', $this->getContentType($this->formatterData['format'])); - + $this->tempfile = \tempnam(\sys_get_temp_dir(), ''); $this->generatecontent(); - + $f = \fopen($this->tempfile, 'r'); $response->setContent(\stream_get_contents($f)); fclose($f); - + // remove the temp file from disk \unlink($this->tempfile); - + return $response; } - + /** * Generate the content and write it to php://temp */ protected function generateContent() { list($spreadsheet, $worksheet) = $this->createSpreadsheet(); - + $this->addTitleToWorkSheet($worksheet); $line = $this->addFiltersDescription($worksheet); - + // at this point, we are going to sort retsults for an easier manipulation - list($sortedResult, $exportKeys, $aggregatorKeys, $globalKeys) = + list($sortedResult, $exportKeys, $aggregatorKeys, $globalKeys) = $this->sortResult(); - + $line = $this->addHeaders($worksheet, $globalKeys, $line); - + $line = $this->addContentTable($worksheet, $sortedResult, $line); - + switch ($this->formatterData['format']) { case 'ods': @@ -279,32 +279,32 @@ class SpreadSheetFormatter implements FormatterInterface // throw an exception to ensure that the error is catched throw new \LogicException(); } - + $writer->save($this->tempfile); } - + /** * Create a spreadsheet and a working worksheet - * + * * @return array where 1st member is spreadsheet, 2nd is worksheet */ protected function createSpreadsheet() { $spreadsheet = new \PhpOffice\PhpSpreadsheet\Spreadsheet(); $worksheet = $spreadsheet->getActiveSheet(); - + // setting the worksheet title and code name $worksheet ->setTitle($this->getTitle()) ->setCodeName('result'); - + return [$spreadsheet, $worksheet]; } - + /** * Add the title to the worksheet and merge the cell containing * the title - * + * * @param Worksheet $worksheet */ protected function addTitleToWorkSheet(Worksheet &$worksheet) @@ -312,50 +312,50 @@ class SpreadSheetFormatter implements FormatterInterface $worksheet->setCellValue('A1', $this->getTitle()); $worksheet->mergeCells('A1:G1'); } - + /** * Add filter description since line 3. - * + * * return the line number after the last description - * + * * @param Worksheet $worksheet * @return int the line number after the last description */ protected function addFiltersDescription(Worksheet &$worksheet) { $line = 3; - + foreach ($this->filtersData as $alias => $data) { $filter = $this->exportManager->getFilter($alias); $description = $filter->describeAction($data, 'string'); - + if (is_array($description)) { $description = $this->translator ->trans( - $description[0], + $description[0], isset($description[1]) ? $description[1] : [] ); } - + $worksheet->setCellValue('A'.$line, $description); - $line ++; + $line ++; } - + return $line; } - + /** - * sort the results, and return an array where : + * sort the results, and return an array where : * - 0 => sorted results * - 1 => export keys - * - 2 => aggregator keys + * - 2 => aggregator keys * - 3 => global keys (aggregator keys and export keys) - * - * - * Example, assuming that the result contains two aggregator keys : - * - * array in result : - * + * + * + * Example, assuming that the result contains two aggregator keys : + * + * array in result : + * * ``` * array( * array( //row 1 @@ -370,54 +370,54 @@ class SpreadSheetFormatter implements FormatterInterface * ) * ) * ``` - * + * * the sorted result will be : - * + * * ``` * array( * array( 2, 3, 1 ), * array( 5, 6, 4 ) * ) * ``` - * + * */ protected function sortResult() { // get the keys for each row $exportKeys = $this->export->getQueryKeys($this->exportData); $aggregatorKeys = $this->getAggregatorKeysSorted(); - + $globalKeys = \array_merge($aggregatorKeys, $exportKeys); - + $sortedResult = \array_map(function ($row) use ($globalKeys) { $newRow = array(); - + foreach ($globalKeys as $key) { $newRow[] = $this->getDisplayableResult($key, $row[$key]); } - + return $newRow; }, $this->result); - + \array_multisort($sortedResult); - + return array($sortedResult, $exportKeys, $aggregatorKeys, $globalKeys); } - + /** * get an array of aggregator keys. The keys are sorted as asked * by user in the form. - * + * * @return string[] an array containing the keys of aggregators */ protected function getAggregatorKeysSorted() { // empty array for aggregators keys $keys = array(); - // this association between key and aggregator alias will be used + // this association between key and aggregator alias will be used // during sorting $aggregatorKeyAssociation = array(); - + foreach ($this->aggregatorsData as $alias => $data) { $aggregator = $this->exportManager->getAggregator($alias); $aggregatorsKeys = $aggregator->getQueryKeys($data); @@ -428,12 +428,12 @@ class SpreadSheetFormatter implements FormatterInterface $aggregatorKeyAssociation[$key] = $alias; } } - + // sort the result using the form usort($keys, function ($a, $b) use ($aggregatorKeyAssociation) { $A = $this->formatterData[$aggregatorKeyAssociation[$a]]['order']; $B = $this->formatterData[$aggregatorKeyAssociation[$b]]['order']; - + if ($A === $B) { return 0; } elseif ($A > $B) { @@ -441,18 +441,18 @@ class SpreadSheetFormatter implements FormatterInterface } else { return -1; } - + }); - + return $keys; } - + /** * add headers to worksheet - * + * * return the line number where the next content (i.e. result) should * be appended. - * + * * @param Worksheet $worksheet * @param array $aggregatorKeys * @param array $exportKeys @@ -460,8 +460,8 @@ class SpreadSheetFormatter implements FormatterInterface * @return int */ protected function addHeaders( - Worksheet &$worksheet, - array $globalKeys, + Worksheet &$worksheet, + array $globalKeys, $line ) { // get the displayable form of headers @@ -471,36 +471,36 @@ class SpreadSheetFormatter implements FormatterInterface $this->getDisplayableResult($key, '_header') ); } - + // add headers on worksheet $worksheet->fromArray( - $displayables, - NULL, + $displayables, + NULL, 'A'.$line); - + return $line + 1; } - + protected function addContentTable(Worksheet $worksheet, - $sortedResults, + $sortedResults, $line ) { $worksheet->fromArray( $sortedResults, NULL, 'A'.$line); - + return $line + count($sortedResults) + 1; } - + protected function getTitle() { return $this->translator->trans($this->export->getTitle()); } - + /** * Get the displayable result. - * + * * @param string $key * @param string $value * @return string @@ -510,40 +510,40 @@ class SpreadSheetFormatter implements FormatterInterface if ($this->cacheDisplayableResultIsInitialized === false) { $this->initializeCache($key); } - + return call_user_func($this->cacheDisplayableResult[$key], $value); } - + protected function initializeCache($key) { /* * this function follows the following steps : - * - * 1. associate all keys used in result with their export element + * + * 1. associate all keys used in result with their export element * (export or aggregator) and data; * 2. associate all keys used in result with all the possible values : - * this array will be necessary to call `getLabels` + * this array will be necessary to call `getLabels` * 3. store the `callable` in an associative array, in cache */ // 1. create an associative array with key and export / aggregator $keysExportElementAssociation = array(); // keys for export foreach ($this->export->getQueryKeys($this->exportData) as $key) { - $keysExportElementAssociation[$key] = [$this->export, + $keysExportElementAssociation[$key] = [$this->export, $this->exportData]; } // keys for aggregator foreach ($this->aggregatorsData as $alias => $data) { $aggregator = $this->exportManager->getAggregator($alias); - + foreach ($aggregator->getQueryKeys($data) as $key) { $keysExportElementAssociation[$key] = [$aggregator, $data]; } } - - // 2. collect all the keys before iteration + + // 2. collect all the keys before iteration $keys = array_keys($keysExportElementAssociation); - + $allValues = array(); // store all the values in an array foreach ($this->result as $row) { @@ -551,18 +551,18 @@ class SpreadSheetFormatter implements FormatterInterface $allValues[$key][] = $row[$key]; } } - + // 3. iterate on `keysExportElementAssociation` to store the callable // in cache foreach ($keysExportElementAssociation as $key => list($element, $data)) { - $this->cacheDisplayableResult[$key] = + $this->cacheDisplayableResult[$key] = $element->getLabels($key, \array_unique($allValues[$key]), $data); } - + // the cache is initialized ! $this->cacheDisplayableResultIsInitialized = true; } - + protected function getContentType($format) { switch ($format) diff --git a/Form/Type/AppendScopeChoiceTypeTrait.php b/Form/Type/AppendScopeChoiceTypeTrait.php index ddf13a7ba..14f33f351 100644 --- a/Form/Type/AppendScopeChoiceTypeTrait.php +++ b/Form/Type/AppendScopeChoiceTypeTrait.php @@ -34,9 +34,9 @@ use Chill\MainBundle\Form\Type\DataTransformer\ScopeTransformer; /** * Trait to add an input with reachable scope for a given center and role. - * + * * Example usage : - * + * * ``` * class AbcType extends Symfony\Component\Form\AbstractType * { @@ -45,9 +45,9 @@ use Chill\MainBundle\Form\Type\DataTransformer\ScopeTransformer; * protected $translatableStringHelper; * protected $user; * protected $om; - * + * * public function __construct(AuthorizationHelper $helper, - * TokenStorageInterface $tokenStorage, + * TokenStorageInterface $tokenStorage, * TranslatableStringHelper $translatableStringHelper, * ObjectManager $om) * { @@ -56,39 +56,39 @@ use Chill\MainBundle\Form\Type\DataTransformer\ScopeTransformer; * $this->translatableStringHelper = $translatableStringHelper; * $this->om = $om; * } - * + * * public function buildForm(FormBuilder $builder, array $options) * { * // ... add your form there - * + * * // append the scope using FormEvents: PRE_SET_DATA - * $this->appendScopeChoices($builder, $options['role'], - * $options['center'], $this->user, $this->authorizationHelper, + * $this->appendScopeChoices($builder, $options['role'], + * $options['center'], $this->user, $this->authorizationHelper, * $this->translatableStringHelper, $this->om); * } - * + * * public function configureOptions(OptionsResolver $resolver) * { * // ... add your options - * + * * // add an option 'role' and 'center' to your form (optional) * $this->appendScopeChoicesOptions($resolver); * } - * + * * } * ``` * * @author Julien Fastré * @author Champs Libres */ -trait AppendScopeChoiceTypeTrait +trait AppendScopeChoiceTypeTrait { /** * Append a scope choice field, with the scopes reachable by given * user for the given role and center. - * + * * The field is added on event FormEvents::PRE_SET_DATA - * + * * @param FormBuilderInterface $builder * @param Role $role * @param Center $center @@ -97,29 +97,29 @@ trait AppendScopeChoiceTypeTrait * @param TranslatableStringHelper $translatableStringHelper * @param string $name */ - protected function appendScopeChoices(FormBuilderInterface $builder, + protected function appendScopeChoices(FormBuilderInterface $builder, Role $role, Center $center, User $user, - AuthorizationHelper $authorizationHelper, + AuthorizationHelper $authorizationHelper, TranslatableStringHelper $translatableStringHelper, ObjectManager $om, $name = 'scope') { $reachableScopes = $authorizationHelper ->getReachableScopes($user, $role, $center); - + $choices = array(); foreach($reachableScopes as $scope) { $choices[$scope->getId()] = $translatableStringHelper ->localize($scope->getName()); } - + $dataTransformer = new ScopeTransformer($om); - - $builder->addEventListener(FormEvents::PRE_SET_DATA, + + $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use ($choices, $name, $dataTransformer, $builder) { $form = $event->getForm(); $form->add( $builder - ->create($name, 'choice', array( + ->create($name, ChoiceType::class, array( 'choices' => $choices, 'auto_initialize' => false ) @@ -129,14 +129,14 @@ trait AppendScopeChoiceTypeTrait ); }); } - + /** * Append a `role` and `center` option to the form. - * - * The allowed types are : + * + * The allowed types are : * - Chill\MainBundle\Entity\Center for center * - Symfony\Component\Security\Core\Role\Role for role - * + * * @param OptionsResolver $resolver */ public function appendScopeChoicesOptions(OptionsResolver $resolver) @@ -149,5 +149,5 @@ trait AppendScopeChoiceTypeTrait )) ; } - + } diff --git a/Form/Type/ComposedRoleScopeType.php b/Form/Type/ComposedRoleScopeType.php index 84c1929b7..c7608c6f5 100644 --- a/Form/Type/ComposedRoleScopeType.php +++ b/Form/Type/ComposedRoleScopeType.php @@ -85,7 +85,7 @@ class ComposedRoleScopeType extends AbstractType } $builder - ->add('role', 'choice', array( + ->add('role', ChoiceType::class, array( 'choices' => $values, 'placeholder' => 'Choose amongst roles', 'choice_attr' => function($role) use ($rolesWithoutScopes) { @@ -109,7 +109,7 @@ class ComposedRoleScopeType extends AbstractType )); } - + public function configureOptions(OptionsResolver $resolver) { $resolver->setDefault('data_class', 'Chill\MainBundle\Entity\RoleScope'); diff --git a/Form/Type/Export/PickFormatterType.php b/Form/Type/Export/PickFormatterType.php index 7dbee991d..92fe29b47 100644 --- a/Form/Type/Export/PickFormatterType.php +++ b/Form/Type/Export/PickFormatterType.php @@ -26,43 +26,43 @@ use Chill\MainBundle\Export\ExportManager; /** * Choose a formatter amongst the available formatters - * + * * * @author Julien Fastré */ class PickFormatterType extends AbstractType { protected $exportManager; - + public function __construct(ExportManager $exportManager) { $this->exportManager = $exportManager; } - + public function buildForm(FormBuilderInterface $builder, array $options) { $export = $this->exportManager->getExport($options['export_alias']); $allowedFormatters = $this->exportManager ->getFormattersByTypes($export->getAllowedFormattersTypes()); - + //build choices $choices = array(); foreach($allowedFormatters as $alias => $formatter) { $choices[$formatter->getName()] = $alias; } - - $builder->add('alias', 'choice', array( + + $builder->add('alias', ChoiceType::class, array( 'choices' => $choices, 'choices_as_values' => true, 'multiple' => false )); - + //$builder->get('type')->addModelTransformer($transformer); } - + public function configureOptions(OptionsResolver $resolver) { $resolver->setRequired(array('export_alias')); } - + } diff --git a/Form/UserType.php b/Form/UserType.php index 0b6df9994..d8705aa3e 100644 --- a/Form/UserType.php +++ b/Form/UserType.php @@ -5,6 +5,7 @@ namespace Chill\MainBundle\Form; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Chill\MainBundle\Form\UserPasswordType; class UserType extends AbstractType @@ -25,7 +26,7 @@ class UserType extends AbstractType } else { $builder->add($builder - ->create('enabled', 'choice', array( + ->create('enabled', ChoiceType::class, array( 'choices' => array( 0 => 'Disabled, the user is not allowed to login', 1 => 'Enabled, the user is active' From 1b16b8e1daecc02c0b2a7fb8f2172ae9651a39e6 Mon Sep 17 00:00:00 2001 From: nobohan Date: Wed, 4 Apr 2018 10:51:35 +0200 Subject: [PATCH 3/6] fix deprecations: set choices_as_values = true + flip content of choices options --- Export/Formatter/CSVFormatter.php | 1 + Form/Type/AppendScopeChoiceTypeTrait.php | 1 + Form/Type/ComposedRoleScopeType.php | 1 + Form/Type/Export/PickFormatterType.php | 2 ++ Form/UserType.php | 8 +++++--- 5 files changed, 10 insertions(+), 3 deletions(-) diff --git a/Export/Formatter/CSVFormatter.php b/Export/Formatter/CSVFormatter.php index 8b860d07e..c58d24fec 100644 --- a/Export/Formatter/CSVFormatter.php +++ b/Export/Formatter/CSVFormatter.php @@ -26,6 +26,7 @@ use Symfony\Component\Translation\TranslatorInterface; use Symfony\Component\Form\FormBuilderInterface; use Chill\MainBundle\Export\ExportManager; use Symfony\Component\Form\Extension\Core\Type\FormType; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; // command to get the report with curl : curl --user "center a_social:password" "http://localhost:8000/fr/exports/generate/count_person?export[filters][person_gender_filter][enabled]=&export[filters][person_nationality_filter][enabled]=&export[filters][person_nationality_filter][form][nationalities]=&export[aggregators][person_nationality_aggregator][order]=1&export[aggregators][person_nationality_aggregator][form][group_by_level]=country&export[submit]=&export[_token]=RHpjHl389GrK-bd6iY5NsEqrD5UKOTHH40QKE9J1edU" --globoff diff --git a/Form/Type/AppendScopeChoiceTypeTrait.php b/Form/Type/AppendScopeChoiceTypeTrait.php index 14f33f351..77c937645 100644 --- a/Form/Type/AppendScopeChoiceTypeTrait.php +++ b/Form/Type/AppendScopeChoiceTypeTrait.php @@ -31,6 +31,7 @@ use Chill\MainBundle\Entity\User; use Chill\MainBundle\Entity\Center; use Symfony\Component\Security\Core\Role\Role; use Chill\MainBundle\Form\Type\DataTransformer\ScopeTransformer; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; /** * Trait to add an input with reachable scope for a given center and role. diff --git a/Form/Type/ComposedRoleScopeType.php b/Form/Type/ComposedRoleScopeType.php index c7608c6f5..31df765c3 100644 --- a/Form/Type/ComposedRoleScopeType.php +++ b/Form/Type/ComposedRoleScopeType.php @@ -28,6 +28,7 @@ use Chill\MainBundle\Entity\Scope; use Chill\MainBundle\Security\RoleProvider; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; /** * Form to Edit/create a role scope. If the role scope does not diff --git a/Form/Type/Export/PickFormatterType.php b/Form/Type/Export/PickFormatterType.php index 92fe29b47..88a0b7ba8 100644 --- a/Form/Type/Export/PickFormatterType.php +++ b/Form/Type/Export/PickFormatterType.php @@ -22,6 +22,8 @@ namespace Chill\MainBundle\Form\Type\Export; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; +use Symfony\Component\Form\Extension\Core\Type\ChoiceType; + use Chill\MainBundle\Export\ExportManager; /** diff --git a/Form/UserType.php b/Form/UserType.php index d8705aa3e..404461423 100644 --- a/Form/UserType.php +++ b/Form/UserType.php @@ -6,6 +6,7 @@ use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; + use Chill\MainBundle\Form\UserPasswordType; class UserType extends AbstractType @@ -28,11 +29,12 @@ class UserType extends AbstractType $builder->add($builder ->create('enabled', ChoiceType::class, array( 'choices' => array( - 0 => 'Disabled, the user is not allowed to login', - 1 => 'Enabled, the user is active' + 'Disabled, the user is not allowed to login' => 0, + 'Enabled, the user is active' => 1 ), 'expanded' => false, - 'multiple' => false + 'multiple' => false, + 'choices_as_values' => true // Can be removed when upgraded to Sf3. )) ); } From 51a1b23e0d6e5ad160ef80cf49f1a2bb505b6c40 Mon Sep 17 00:00:00 2001 From: nobohan Date: Wed, 4 Apr 2018 11:07:49 +0200 Subject: [PATCH 4/6] fix deprecations: use fqcn for entity, ComposedGroupCenterType. --- Controller/UserController.php | 2 +- Form/Type/ComposedGroupCenterType.php | 6 ++++-- Form/Type/ComposedRoleScopeType.php | 11 +++++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Controller/UserController.php b/Controller/UserController.php index 3e4c0c560..c7e06ebd3 100644 --- a/Controller/UserController.php +++ b/Controller/UserController.php @@ -413,7 +413,7 @@ class UserController extends Controller ->setAction($this->generateUrl('admin_user_add_group_center', array('uid' => $user->getId()))) ->setMethod('POST') - ->add(self::FORM_GROUP_CENTER_COMPOSED, new ComposedGroupCenterType()) + ->add(self::FORM_GROUP_CENTER_COMPOSED, ComposedGroupCenterType::class) ->add('submit', SubmitType::class, array('label' => 'Add a new groupCenter')) ->getForm() ; diff --git a/Form/Type/ComposedGroupCenterType.php b/Form/Type/ComposedGroupCenterType.php index a01579737..0fe628401 100644 --- a/Form/Type/ComposedGroupCenterType.php +++ b/Form/Type/ComposedGroupCenterType.php @@ -22,6 +22,8 @@ namespace Chill\MainBundle\Form\Type; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; +use Symfony\Bridge\Doctrine\Form\Type\EntityType; + use Chill\MainBundle\Entity\PermissionsGroup; use Chill\MainBundle\Entity\Center; @@ -35,12 +37,12 @@ class ComposedGroupCenterType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options) { - $builder->add('permissionsgroup', 'entity', array( + $builder->add('permissionsgroup', EntityType::class, array( 'class' => 'Chill\MainBundle\Entity\PermissionsGroup', 'choice_label' => function(PermissionsGroup $group) { return $group->getName(); } - ))->add('center', 'entity', array( + ))->add('center', EntityType::class, array( 'class' => 'Chill\MainBundle\Entity\Center', 'choice_label' => function(Center $center) { return $center->getName(); diff --git a/Form/Type/ComposedRoleScopeType.php b/Form/Type/ComposedRoleScopeType.php index 31df765c3..e26edfcfb 100644 --- a/Form/Type/ComposedRoleScopeType.php +++ b/Form/Type/ComposedRoleScopeType.php @@ -23,13 +23,16 @@ namespace Chill\MainBundle\Form\Type; use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; -use Chill\MainBundle\Templating\TranslatableStringHelper; -use Chill\MainBundle\Entity\Scope; -use Chill\MainBundle\Security\RoleProvider; +use Symfony\Bridge\Doctrine\Form\Type\EntityType; use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; +use Chill\MainBundle\Templating\TranslatableStringHelper; +use Chill\MainBundle\Entity\Scope; +use Chill\MainBundle\Security\RoleProvider; + + /** * Form to Edit/create a role scope. If the role scope does not * exists in the database, he is generated. @@ -100,7 +103,7 @@ class ComposedRoleScopeType extends AbstractType return $this->roleProvider->getRoleTitle($role); } )) - ->add('scope', 'entity', array( + ->add('scope', EntityType::class, array( 'class' => 'ChillMainBundle:Scope', 'choice_label' => function(Scope $scope) use ($translatableStringHelper) { return $translatableStringHelper->localize($scope->getName()); From f8a61bd1780fc9918fc54275a77481271afeffe2 Mon Sep 17 00:00:00 2001 From: nobohan Date: Wed, 4 Apr 2018 11:35:53 +0200 Subject: [PATCH 5/6] fix deprecations: use fqcn for 'password' and 'repeated' --- Form/UserPasswordType.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Form/UserPasswordType.php b/Form/UserPasswordType.php index 0fdd09014..5e00dd707 100644 --- a/Form/UserPasswordType.php +++ b/Form/UserPasswordType.php @@ -8,6 +8,8 @@ use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\Validator\Constraints\Length; use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Constraints\Regex; +use Symfony\Component\Form\Extension\Core\Type\RepeatedType; +use Symfony\Component\Form\Extension\Core\Type\PasswordType; class UserPasswordType extends AbstractType { @@ -18,8 +20,8 @@ class UserPasswordType extends AbstractType public function buildForm(FormBuilderInterface $builder, array $options) { $builder - ->add('password', 'repeated', array( - 'type' => 'password', + ->add('password', RepeatedType::class, array( + 'type' => PasswordType::class, 'required' => false, 'options' => array(), 'first_options' => array( From ae9db21633e4701bdb8d1b0a1554ae2fd7212ad2 Mon Sep 17 00:00:00 2001 From: nobohan Date: Wed, 4 Apr 2018 12:21:08 +0200 Subject: [PATCH 6/6] use fqcn for chill classes --- Form/Type/Select2CountryType.php | 3 ++- Form/Type/Select2LanguageType.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Form/Type/Select2CountryType.php b/Form/Type/Select2CountryType.php index c769a8816..7887ec898 100644 --- a/Form/Type/Select2CountryType.php +++ b/Form/Type/Select2CountryType.php @@ -26,6 +26,7 @@ use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\Form\FormBuilderInterface; use Chill\MainBundle\Form\Type\DataTransformer\ObjectToIdTransformer; use Doctrine\Common\Persistence\ObjectManager; +use Chill\MainBundle\Form\Type\Select2ChoiceType; /** * Extends choice to allow adding select2 library on widget @@ -64,7 +65,7 @@ class Select2CountryType extends AbstractType public function getParent() { - return 'select2_choice'; + return Select2ChoiceType::class; } public function configureOptions(OptionsResolver $resolver) diff --git a/Form/Type/Select2LanguageType.php b/Form/Type/Select2LanguageType.php index 5e55b98f8..ab92466cb 100644 --- a/Form/Type/Select2LanguageType.php +++ b/Form/Type/Select2LanguageType.php @@ -26,6 +26,7 @@ use Symfony\Component\HttpFoundation\RequestStack; use Symfony\Component\Form\FormBuilderInterface; use Chill\MainBundle\Form\Type\DataTransformer\MultipleObjectsToIdTransformer; use Doctrine\Common\Persistence\ObjectManager; +use Chill\MainBundle\Form\Type\Select2ChoiceType; /** * Extends choice to allow adding select2 library on widget for languages (multiple) @@ -61,7 +62,7 @@ class Select2LanguageType extends AbstractType public function getParent() { - return 'select2_choice'; + return Select2ChoiceType::class; } public function configureOptions(OptionsResolver $resolver)