Install
$ agentstack add skill-jeffsenso-prestashop-skills-create-grid-query-builder ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
create-grid-query-builder
Read @.ai/Component/Grid/CONTEXT.md for the factory trilogy and GridDataFactory decoration pattern.
1. Query Builder
Create src/Adapter/{Domain}/Grid/Query/{Domain}QueryBuilder.php implementing DoctrineQueryBuilderInterface or extending AbstractDoctrineQueryBuilder:
Two required methods:
getSearchQueryBuilder(SearchCriteriaInterface $searchCriteria): QueryBuilder— returns rows for the current pagegetCountQueryBuilder(SearchCriteriaInterface $searchCriteria): QueryBuilder— returns total count (no LIMIT/OFFSET)
Building the query
- Base query:
SELECT c.id_{domain}, c.name, c.active FROM ps_{domain} c - For each filter in
$searchCriteria->getFilters(), add a WHERE clause with parameterized values - Apply sorting: map
$searchCriteria->getOrderBy()to actual column expressions - Apply pagination:
->setFirstResult($offset)->setMaxResults($limit)(search query only, not count) - For multilingual columns: LEFT JOIN the
_langtable with the current language ID
Reference: src/Core/Grid/Query/LanguageQueryBuilder.php (simple), src/Adapter/Manufacturer/QueryBuilder/ManufacturerQueryBuilder.php (with joins)
2. GridDataFactory (standard)
For most grids, the standard DoctrineGridDataFactory is sufficient — it calls the query builder automatically. Just wire it in DI:
prestashop.core.grid.data.factory.{domain}:
class: 'PrestaShop\PrestaShop\Core\Grid\Data\Factory\DoctrineGridDataFactory'
arguments:
- '@prestashop.core.admin.{domain}.query_builder'
# ... hook dispatcher, query parser, etc.
3. GridDataFactory decorator (if post-processing needed)
When grid data needs transformation after query execution (e.g. resolving image URLs from IDs, formatting computed columns), create a decorator:
- Create a class implementing
GridDataFactoryInterface - Inject the original
GridDataFactory - In
getData(SearchCriteriaInterface $searchCriteria): call the wrapped factory, then modify theRecordCollection - Register with
decorates:in DI YAML
class {Domain}GridDataFactory implements GridDataFactoryInterface
{
public function __construct(
private readonly GridDataFactoryInterface $dataFactory,
) {}
public function getData(SearchCriteriaInterface $searchCriteria): GridData
{
$gridData = $this->dataFactory->getData($searchCriteria);
$modifiedRecords = $this->applyModifications($gridData->getRecords());
return new GridData($modifiedRecords, $gridData->getRecordsTotal(), $gridData->getQuery());
}
}
Reference: Check existing *GridDataFactory decorators in src/Adapter/ for examples.
Rules
Conventions (column alias matching, parameterized queries, PK aliasing, count query rules, decoration preference) are in [Grid/CONTEXT.md](../../CONTEXT.md#query-builders).
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: jeffsenso
- Source: jeffsenso/prestashop-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.