Final Class Yiisoft\Yii\DataView\GridView\Column\DataColumnRenderer
DataColumnRenderer handles rendering and filtering of data columns in a grid.
Public Methods
Method Details
Creates a new DataColumnRenderer instance.
| public __construct( \Psr\Container\ContainerInterface $filterFactoryContainer, \Yiisoft\Validator\ValidatorInterface $validator, Yiisoft\Yii\DataView\ValuePresenter\ValuePresenterInterface $defaultValuePresenter = new SimpleValuePresenter(), Yiisoft\Yii\DataView\Filter\Factory\FilterFactoryInterface|string $defaultFilterFactory = LikeFilterFactory::class, Yiisoft\Yii\DataView\Filter\Factory\FilterFactoryInterface|string $defaultArrayFilterFactory = EqualsFilterFactory::class, boolean|callable $defaultFilterEmpty = true ): mixed | ||
| $filterFactoryContainer | \Psr\Container\ContainerInterface |
Container for filter factory instances. |
| $validator | \Yiisoft\Validator\ValidatorInterface |
Validator for filter values. |
| $defaultValuePresenter | Yiisoft\Yii\DataView\ValuePresenter\ValuePresenterInterface |
Service to present values when Yiisoft\Yii\DataView\GridView\Column\DataColumn::$content is not set. |
| $defaultFilterFactory | Yiisoft\Yii\DataView\Filter\Factory\FilterFactoryInterface|string |
Default filter factory for non-array filters. |
| $defaultArrayFilterFactory | Yiisoft\Yii\DataView\Filter\Factory\FilterFactoryInterface|string |
Default filter factory for array filters. |
| $defaultFilterEmpty | boolean|callable |
Default function to determine if a filter value is empty. |
public function __construct(
private readonly ContainerInterface $filterFactoryContainer,
private readonly ValidatorInterface $validator,
private readonly ValuePresenterInterface $defaultValuePresenter = new SimpleValuePresenter(),
private readonly string|FilterFactoryInterface $defaultFilterFactory = LikeFilterFactory::class,
private readonly string|FilterFactoryInterface $defaultArrayFilterFactory = EqualsFilterFactory::class,
bool|callable $defaultFilterEmpty = true,
) {
$this->defaultFilterEmpty = $defaultFilterEmpty;
}
| public getOrderProperties( Yiisoft\Yii\DataView\GridView\Column\ColumnInterface $column ): array | ||
| $column | Yiisoft\Yii\DataView\GridView\Column\ColumnInterface | |
public function getOrderProperties(ColumnInterface $column): array
{
/** @var DataColumn $column This annotation is for IDE only */
if (!$column->withSorting || $column->property === null) {
return [];
}
return [$column->property];
}
| public makeFilter( Yiisoft\Yii\DataView\GridView\Column\ColumnInterface $column, Yiisoft\Yii\DataView\GridView\Column\Base\MakeFilterContext $context ): \Yiisoft\Data\Reader\FilterInterface|null | ||
| $column | Yiisoft\Yii\DataView\GridView\Column\ColumnInterface | |
| $context | Yiisoft\Yii\DataView\GridView\Column\Base\MakeFilterContext | |
public function makeFilter(ColumnInterface $column, MakeFilterContext $context): ?FilterInterface
{
/** @var DataColumn $column This annotation is for IDE only */
if ($column->filter === false || $column->property === null) {
return null;
}
$value = $context->getQueryValue($column->property);
if ($value === null) {
return null;
}
$filterEmpty = $this->normalizeFilterEmpty($column->filterEmpty ?? $this->defaultFilterEmpty);
if ($filterEmpty($value)) {
return null;
}
if ($column->filterValidation !== null) {
$result = $this->validator->validate($value, $column->filterValidation);
if (!$result->isValid()) {
foreach ($result->getErrors() as $error) {
$context->validationResult->addError(
$error->getMessage(),
$error->getParameters(),
[$column->property],
);
}
return null;
}
}
return $this
->getFilterFactory($column)
->create($column->property, $value);
}
public function renderBody(ColumnInterface $column, Cell $cell, DataContext $context): Cell
{
/** @var DataColumn $column This annotation is for IDE only */
$content = $this->prepareRawBodyContent($column, $context);
if ($column->encodeContent
|| ($column->encodeContent === null && !($content instanceof NoEncodeStringableInterface))
) {
$content = Html::encode($content);
}
if (is_callable($column->bodyAttributes)) {
/** @var array $attributes Remove annotation after fix https://github.com/vimeo/psalm/issues/11062 */
$attributes = ($column->bodyAttributes)(
$context->data,
$context,
);
} else {
$attributes = $column->bodyAttributes;
}
$bodyClass = is_callable($column->bodyClass)
? ($column->bodyClass)($context->data, $context)
: $column->bodyClass;
return $cell
->addAttributes($attributes)
->addClass($bodyClass)
->content($content)
->encode(false);
}
public function renderColumn(ColumnInterface $column, Cell $cell, GlobalContext $context): Cell
{
/** @var DataColumn $column This annotation is for IDE only */
return $cell
->addAttributes($column->columnAttributes)
->addClass($column->columnClass);
}
public function renderFilter(ColumnInterface $column, Cell $cell, FilterContext $context): ?Cell
{
/** @var DataColumn $column This annotation is for IDE only */
if ($column->property === null || $column->filter === false) {
return null;
}
if ($column->filter === true) {
$widget = TextInputFilter::widget();
} elseif (is_array($column->filter)) {
$widget = DropdownFilter::widget()->optionsData($column->filter);
} else {
$widget = $column->filter;
}
$content = [
$widget->withContext(
new Context(
$column->property,
$context->getQueryValue($column->property),
$context->formId,
),
),
];
$errors = $context->validationResult->getPropertyErrorMessages($column->property);
if (!empty($errors)) {
$cell = $cell->addClass($context->cellInvalidClass);
$content[] = Html::div(attributes: $context->errorsContainerAttributes)
->content(...array_map(static fn(string $error) => Html::div($error), $errors));
}
return $cell->content(...$content)->encode(false);
}
public function renderHeader(ColumnInterface $column, Cell $cell, GlobalContext $context): Cell
{
/** @var DataColumn $column This annotation is for IDE only */
$cell = $cell
->addAttributes($column->headerAttributes)
->addClass($column->headerClass)
->encode(false);
if ($column->header === null) {
$label = $column->property === null ? '' : Html::encode(ucfirst($column->property));
} else {
$label = $column->encodeHeader ? Html::encode($column->header) : $column->header;
}
$cell = $cell->content($label);
if (!$column->withSorting || $column->property === null) {
return $cell;
}
[$cell, $link, $prepend, $append] = $context->prepareSortable($cell, $column->property);
if ($link !== null) {
$link = $link->content($label)->encode(false);
}
return $cell->content($prepend . ($link ?? $label) . $append);
}
Signup or Login in order to comment.