0 follower

Final Class Yiisoft\Yii\DataView\GridView\Column\DataColumnRenderer

InheritanceYiisoft\Yii\DataView\GridView\Column\DataColumnRenderer
ImplementsYiisoft\Yii\DataView\GridView\Column\FilterableColumnRendererInterface, Yiisoft\Yii\DataView\GridView\Column\SortableColumnRendererInterface

DataColumnRenderer handles rendering and filtering of data columns in a grid.

Method Details

Hide inherited methods

__construct() public method

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;
}

            
getOrderProperties() public method

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];
}

            
makeFilter() public method

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);
}

            
renderBody() public method

public renderBody( Yiisoft\Yii\DataView\GridView\Column\ColumnInterface $column, Yiisoft\Yii\DataView\GridView\Column\Base\Cell $cell, Yiisoft\Yii\DataView\GridView\Column\Base\DataContext $context ): Yiisoft\Yii\DataView\GridView\Column\Base\Cell
$column Yiisoft\Yii\DataView\GridView\Column\ColumnInterface
$cell Yiisoft\Yii\DataView\GridView\Column\Base\Cell
$context Yiisoft\Yii\DataView\GridView\Column\Base\DataContext

                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);
}

            
renderColumn() public method

public renderColumn( Yiisoft\Yii\DataView\GridView\Column\ColumnInterface $column, Yiisoft\Yii\DataView\GridView\Column\Base\Cell $cell, Yiisoft\Yii\DataView\GridView\Column\Base\GlobalContext $context ): Yiisoft\Yii\DataView\GridView\Column\Base\Cell
$column Yiisoft\Yii\DataView\GridView\Column\ColumnInterface
$cell Yiisoft\Yii\DataView\GridView\Column\Base\Cell
$context Yiisoft\Yii\DataView\GridView\Column\Base\GlobalContext

                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);
}

            
renderFilter() public method

public renderFilter( Yiisoft\Yii\DataView\GridView\Column\ColumnInterface $column, Yiisoft\Yii\DataView\GridView\Column\Base\Cell $cell, Yiisoft\Yii\DataView\GridView\Column\Base\FilterContext $context ): Yiisoft\Yii\DataView\GridView\Column\Base\Cell|null
$column Yiisoft\Yii\DataView\GridView\Column\ColumnInterface
$cell Yiisoft\Yii\DataView\GridView\Column\Base\Cell
$context Yiisoft\Yii\DataView\GridView\Column\Base\FilterContext

                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);
}

            
renderFooter() public method

public renderFooter( Yiisoft\Yii\DataView\GridView\Column\ColumnInterface $column, Yiisoft\Yii\DataView\GridView\Column\Base\Cell $cell, Yiisoft\Yii\DataView\GridView\Column\Base\GlobalContext $context ): Yiisoft\Yii\DataView\GridView\Column\Base\Cell
$column Yiisoft\Yii\DataView\GridView\Column\ColumnInterface
$cell Yiisoft\Yii\DataView\GridView\Column\Base\Cell
$context Yiisoft\Yii\DataView\GridView\Column\Base\GlobalContext

                public function renderFooter(ColumnInterface $column, Cell $cell, GlobalContext $context): Cell
{
    /** @var DataColumn $column This annotation is for IDE only */
    if ($column->footer !== null) {
        $cell = $cell->content($column->footer);
    }
    return $cell;
}

            
renderHeader() public method

public renderHeader( Yiisoft\Yii\DataView\GridView\Column\ColumnInterface $column, Yiisoft\Yii\DataView\GridView\Column\Base\Cell $cell, Yiisoft\Yii\DataView\GridView\Column\Base\GlobalContext $context ): Yiisoft\Yii\DataView\GridView\Column\Base\Cell
$column Yiisoft\Yii\DataView\GridView\Column\ColumnInterface
$cell Yiisoft\Yii\DataView\GridView\Column\Base\Cell
$context Yiisoft\Yii\DataView\GridView\Column\Base\GlobalContext

                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);
}