/** * {@inheritdoc} */ public function buildCellView(ColumnTypeInterface $column, CellViewInterface $view) { $value = array(); $values = $view->getValue(); if (($emptyValue = $column->getOption('empty_value')) !== null) { $values = $this->populateValues($values, $emptyValue); } $glue = $column->getOption('value_glue'); $format = $column->getOption('value_format'); foreach ($values as $val) { $objectValue = null; if (isset($glue) && !isset($format)) { $objectValue = implode($glue, $val); } if (isset($format)) { if (isset($glue)) { $formatedValues = array(); foreach ($val as $fieldValue) { $formatedValues[] = sprintf($format, $fieldValue); } $objectValue = implode($glue, $formatedValues); } else { $objectValue = vsprintf($format, $val); } } $value[] = $objectValue; } $value = implode($column->getOption('glue_multiple'), $value); $view->setValue($value); }
/** * {@inheritdoc} */ public function buildHeaderView(ColumnTypeInterface $column, HeaderViewInterface $view) { $view->setLabel($column->getOption('label')); if (!is_null($order = $column->getOption('display_order'))) { $view->setAttribute('display_order', $order); } }
/** * @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())); } } }
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); }
/** * @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 buildHeaderView(ColumnTypeInterface $column, HeaderViewInterface $view) { $view->setAttribute('translation_domain', $column->getOption('translation_domain')); }