/** * @param \FSi\Component\DataGrid\Column\ColumnTypeInterface $column */ public function initOptions(ColumnTypeInterface $column) { $column->getOptionsResolver()->setNormalizer('actions', function (Options $options, $values) { foreach ($values as $action => $actionValues) { $values[$action] = $this->setRouteLocale($actionValues, $this->localeManager); } return $values; }); }
/** * @param \FSi\Component\DataGrid\Column\ColumnTypeInterface $column * @param string $action * @param array $actionOptions */ private function validateActionOptions(ColumnTypeInterface $column, $action, array $actionOptions) { if (!isset($actionOptions['element'])) { return false; } if (!$this->manager->hasElement($actionOptions['element'])) { throw new RuntimeException(sprintf('Unknown element "%s" specified in action "%s" of datagrid "%s"', $actionOptions['element'], $action, $column->getDataGrid()->getName())); } return true; }
public function buildCellView(ColumnTypeInterface $column, CellViewInterface $view) { $translatable = false; $notTranslated = false; foreach ($column->getOption('field_mapping') as $propertyPath) { if ($this->isPropertyPathTranslatable($view, $propertyPath)) { $translatable = true; if ($this->isPropertyPathTranslated($view, $propertyPath)) { $notTranslated = true; } } } $view->setAttribute('translatable', $translatable); $view->setAttribute('not_translated', $notTranslated); }
/** * {@inheritdoc} */ public function initOptions(ColumnTypeInterface $column) { $column->getOptionsResolver()->setDefaults(array('label' => $column->getName(), 'display_order' => null, 'field_mapping' => array($column->getName()))); $column->getOptionsResolver()->setAllowedTypes('label', 'string'); $column->getOptionsResolver()->setAllowedTypes('field_mapping', 'array'); $column->getOptionsResolver()->setAllowedTypes('display_order', array('integer', 'null')); }
/** * {@inheritDoc} */ public function initOptions(ColumnTypeInterface $column) { $column->getOptionsResolver()->setDefaults(array('true_value' => $this->translator->trans('datagrid.boolean.yes', array(), 'DataGridBundle'), 'false_value' => $this->translator->trans('datagrid.boolean.no', array(), 'DataGridBundle'))); $translator = $this->translator; $column->getOptionsResolver()->setNormalizer('form_options', function (Options $options, $value) use($translator) { if ($options['editable'] && count($options['field_mapping']) == 1) { $field = $options['field_mapping'][0]; return array_merge(array($field => array('choices' => array(0 => $translator->trans('datagrid.boolean.no', array(), 'DataGridBundle'), 1 => $translator->trans('datagrid.boolean.yes', array(), 'DataGridBundle')))), $value); } return $value; }); $column->getOptionsResolver()->setNormalizer('form_type', function (Options $options, $value) { if ($options['editable'] && count($options['field_mapping']) == 1) { $field = $options['field_mapping'][0]; return array_merge(array($field => 'choice'), $value); } return $value; }); }
/** * {@inheritdoc} */ public function initOptions(ColumnTypeInterface $column) { $column->getOptionsResolver()->setDefaults(array('glue_multiple' => ' ', 'value_glue' => ' ', 'value_format' => '%s', 'empty_value' => null)); $column->getOptionsResolver()->setAllowedTypes('glue_multiple', array('string')); $column->getOptionsResolver()->setAllowedTypes('value_glue', array('string', 'null')); $column->getOptionsResolver()->setAllowedTypes('value_format', array('string', 'null')); $column->getOptionsResolver()->setAllowedTypes('empty_value', array('array', 'string', 'null')); }
/** * @param \FSi\Component\DataGrid\Column\ColumnTypeInterface $column * @throws \InvalidArgumentException */ private function validateEmptyValueOption(ColumnTypeInterface $column) { $emptyValue = $column->getOption('empty_value'); $mappingFields = $column->getOption('field_mapping'); if (is_string($emptyValue)) { return; } if (!is_array($emptyValue)) { throw new \InvalidArgumentException(sprintf('Option "empty_value" in column: "%s" must be a array.', $column->getName())); } foreach ($emptyValue as $field => $value) { if (!in_array($field, $mappingFields)) { throw new \InvalidArgumentException(sprintf('Mapping field "%s" does\'t exists in column: "%s".', $field, $column->getName())); } if (!is_string($value)) { throw new \InvalidArgumentException(sprintf('Option "empty_value" for field "%s" in column: "%s" must be a valid string.', $field, $column->getName())); } } }
/** * @param ColumnTypeInterface $column * @param array $batchActions */ private function buildBatchForm(ColumnTypeInterface $column, array $batchActions) { if (count($batchActions) > 1) { $this->formBuilder->add('action', 'choice', array('choices' => $batchActions, 'translation_domain' => $column->getOption('translation_domain'))); $this->formBuilder->add('submit', 'submit', array('label' => 'crud.list.batch.confirm', 'translation_domain' => 'FSiAdminBundle')); } }
function it_sets_translatable_and_not_translated_to_true_when_column_has_not_translated_nested_translatable_property_in_field_mapping(ColumnTypeInterface $column, CellViewInterface $view, ClassMetadata $translatableMetadata) { $column->getOption('field_mapping')->willReturn(array('nested_object.translatable_property')); $nested_object = (object) array('translatable_property' => 'value', 'non_translatable_property' => 'value', 'locale' => 'de'); $data = (object) array('nested_object' => $nested_object); $view->getSource()->willReturn($data); $translatableMetadata->hasTranslatableProperties()->willReturn(true); $translatableMetadata->getTranslatableProperties()->willReturn(array('translations' => array('translatable_property' => 'translation_property'))); $translatableMetadata->localeProperty = 'locale'; $view->setAttribute('translatable', true)->shouldBeCalled(); $view->setAttribute('not_translated', true)->shouldBeCalled(); $this->buildCellView($column, $view); }
/** * @param \FSi\Component\DataGrid\Column\ColumnTypeInterface $column * @throws \InvalidArgumentException */ private function validateOptions(ColumnTypeInterface $column) { $actions = $column->getOption('actions'); if (!is_array($actions)) { throw new \InvalidArgumentException('Option "actions" must be an array.'); } if (!count($actions)) { throw new \InvalidArgumentException('Option actions can\'t be empty.'); } foreach ($actions as $actionName => &$options) { if (!is_array($options)) { throw new \InvalidArgumentException(sprintf('Options for action "%s" must be an array.', $actionName)); } foreach ($options as $optionName => $value) { if (!in_array($optionName, $this->actionOptionsAvailable)) { throw new \InvalidArgumentException(sprintf('Unknown option "%s" in action "%s".', $optionName, $actionName)); } } foreach ($this->actionOptionsRequired as $optionName) { if (!array_key_exists($optionName, $options)) { throw new \InvalidArgumentException(sprintf('Action "%s" require option "%s".', $actionName, $optionName)); } } foreach ($this->actionOptionsDefault as $optionName => $value) { if (!array_key_exists($optionName, $options)) { $options[$optionName] = $value; } } if (isset($options['parameters_values'])) { if (!is_array($options['parameters_values'])) { throw new \InvalidArgumentException(sprintf('Action "%s" require option "parameters_values" as array.', $actionName, $optionName)); } } if (isset($options['parameters'])) { if (!is_array($options['parameters'])) { throw new \InvalidArgumentException(sprintf('Action "%s" require option "parameters" as array.', $actionName, $optionName)); } $mappingFields = $column->getOption('field_mapping'); foreach ($options['parameters'] as $mappingField => $routerParameter) { if (!in_array($mappingField, $mappingFields, true)) { throw new \InvalidArgumentException(sprintf('Unknown mapping_field "%s". Maybe you should consider using option "parameters_values"?', $mappingField)); } } } } $column->setOption('actions', $actions); }
/** * Create Form Objects for column and rowset index. * * @param \FSi\Component\DataGrid\Column\ColumnTypeInterface $column * @param mixed $index * @param mixed $object * @return FormInterface */ private function createForm(ColumnTypeInterface $column, $index, $object) { $formId = implode(array($column->getName(), $column->getId(), $index)); if (array_key_exists($formId, $this->forms)) { return $this->forms[$formId]; } //Create fields array. There are column types like entity where field_mapping //should not be used to build field array. $fields = array(); switch ($column->getId()) { case 'entity': $field = array('name' => $column->getOption('relation_field'), 'type' => $this->isSymfony3() ? $this->getEntityTypeName() : 'entity', 'options' => array()); $fields[$column->getOption('relation_field')] = $field; break; default: foreach ($column->getOption('field_mapping') as $fieldName) { $field = array('name' => $fieldName, 'type' => null, 'options' => array()); $fields[$fieldName] = $field; } } //Pass fields form options from column into $fields array. $fieldsOptions = $column->getOption('form_options'); foreach ($fieldsOptions as $fieldName => $fieldOptions) { if (array_key_exists($fieldName, $fields)) { if (is_array($fieldOptions)) { $fields[$fieldName]['options'] = $fieldOptions; } } } //Pass fields form type from column into $fields array. $fieldsTypes = $column->getOption('form_type'); foreach ($fieldsTypes as $fieldName => $fieldType) { if (array_key_exists($fieldName, $fields)) { if (is_string($fieldType)) { $fields[$fieldName]['type'] = $fieldType; } } } //Build data array, the data array holds data that should be passed into //form elements. switch ($column->getId()) { case 'datetime': foreach ($fields as &$field) { $value = $column->getDataMapper()->getData($field['name'], $object); if (!isset($field['type'])) { $field['type'] = $this->isSymfony3() ? $this->getDateTimeTypeName() : 'datetime'; } if (is_numeric($value) && !isset($field['options']['input'])) { $field['options']['input'] = 'timestamp'; } if (is_string($value) && !isset($field['options']['input'])) { $field['options']['input'] = 'string'; } if ($value instanceof \DateTime && !isset($field['options']['input'])) { $field['options']['input'] = 'datetime'; } } break; } if ($this->isSymfony3()) { $formBuilderOptions = array('entry_type' => $this->getRowTypeName(), 'csrf_protection' => false); } else { $formBuilderOptions = array('type' => new RowType($fields), 'csrf_protection' => false); } if ($this->isSymfony3()) { $formBuilderOptions['entry_options']['fields'] = $fields; } $formData = []; foreach (array_keys($fields) as $fieldName) { $formData[$fieldName] = $column->getDataMapper()->getData($fieldName, $object); } //Create form builder. $formBuilder = $this->formFactory->createNamedBuilder($column->getDataGrid()->getName(), $this->isSymfony3() ? $this->getCollectionTypeName() : 'collection', array($index => $formData), $formBuilderOptions); //Create Form. $this->forms[$formId] = $formBuilder->getForm(); return $this->forms[$formId]; }
/** * {@inheritdoc} */ public function buildHeaderView(ColumnTypeInterface $column, HeaderViewInterface $view) { $view->setAttribute('header_attr', $column->getOption('header_attr')); }
/** * @param \FSi\Component\DataGrid\Column\ColumnTypeInterface $column * @param \FSi\Component\DataGrid\Column\HeaderViewInterface $view */ function it_passes_attributes_to_header_view($column, $view) { $column->getOption('header_attr')->willReturn(array('header attributes')); $view->setAttribute('header_attr', array('header attributes'))->shouldBeCalled(); $this->buildHeaderView($column, $view); }
/** * @param \Symfony\Component\HttpFoundation\ParameterBag $queryAttributes * @param \Symfony\Component\Routing\RouterInterface $router * @param \Symfony\Component\Form\Test\FormBuilderInterface $formBuilder * @param \Symfony\Component\Form\FormView $formView * @param \FSi\Component\DataGrid\Column\ColumnTypeInterface $column * @param \FSi\Component\DataGrid\Column\HeaderViewInterface $view */ function it_allows_to_pass_route_name_and_additional_parameters_to_batch_action($queryAttributes, $router, $formBuilder, $formView, $column, $view) { $column->getOption('actions')->willReturn(array('action_name' => array('route_name' => 'fsi_admin_custom_batch', 'additional_parameters' => array('element' => 'some_batch_element_id', 'param' => 'value')))); $column->getOption('translation_domain')->willReturn('FSiAdminBundle'); $queryAttributes->has('redirect_uri')->willReturn(true); $queryAttributes->get('redirect_uri')->willReturn('some_redirect_uri'); $router->generate('fsi_admin_custom_batch', array('element' => 'some_batch_element_id', 'param' => 'value', 'redirect_uri' => 'some_redirect_uri'))->willReturn('path_to_batch_action'); $formBuilder->add('action', 'choice', array('choices' => array(0 => 'crud.list.batch.empty_choice', 'path_to_batch_action' => 'action_name'), 'translation_domain' => 'FSiAdminBundle'))->willReturn(); $formBuilder->add('submit', 'submit', array('label' => 'crud.list.batch.confirm', 'translation_domain' => 'FSiAdminBundle'))->willReturn(); $view->setAttribute('batch_form', $formView)->shouldBeCalled(); $this->buildHeaderView($column, $view); }
/** * {@inheritDoc} */ public function initOptions(ColumnTypeInterface $column) { $column->getOptionsResolver()->setDefaults(array('translation_domain' => 'messages')); $column->getOptionsResolver()->setAllowedTypes('translation_domain', array('string', 'null')); }