Skip to content

Instantly share code, notes, and snippets.

@dpobel
Created October 30, 2012 22:11
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save dpobel/3983418 to your computer and use it in GitHub Desktop.
Save dpobel/3983418 to your computer and use it in GitHub Desktop.
<?php
use \eZ\Publish\API\Repository\Values\Content\Query;
$locationService = $this->getRepository()->getLocationService();
$searchService = $this->getRepository()->getSearchService();
$urlAliasService = $this->getRepository()->getUrlAliasService();
$typeService = $this->getRepository()->getContentTypeService();
$identifiers = array( 'folder', 'page', 'contact' );
$ids = array();
foreach ( $identifiers as $identifier )
{
$ids[] = $typeService->loadByIdentifier( $identifier )->id;
}
$root = $locationService->loadLocation( 2 );
$query = new Query();
$query->criterion = new Criterion\LogicalAND(
array(
new Criterion\Subtree( $root->pathString ),
new Criterion\ContentTypeId( $ids ),
new Criterion\Visibility( Criterion\Visibility::VISIBLE )
)
);
$query->sortClauses = array(
new SortClause\LocationPriority( Query::SORT_DESC )
);
$results = $searchService->findContent( $query );
$items = array( );
foreach ( $results->searchHits as $hit )
{
$location = $locationService->loadLocation(
$hit->valueObject->contentInfo->mainLocationId
);
$locationUrl = $urlAliasService->reverseLookup( $location )->path;
$items[$locationUrl] = $location;
}
foreach ( $items as $url => $location )
{
echo "url: {$url} name: {$location->contentInfo->name}\n";
}
<?php
$items = eZContentObject::subTreeByNodeID(
array(
'ClassFilterType' => 'include',
'ClassFilterArray' => array( 'folder', 'page', 'contact' ),
'SortBy' => array( array( 'priority', false ) )
),
2
);
foreach ( $items as $node )
{
echo "url: {$node->attribute( 'url_alias' )} name: {$node->attribute( 'name' )}\n";
}
@brucem
Copy link

brucem commented Dec 17, 2012

Looking at this I think there is a place for a legacy data access layer on top of the new public API. It would decrease the verbosity of the code required to do the retrieval & aid in converting to the new platform.

e.g. Mimic the functionality of eZContentObject::subTreeByNodeID but use the new Public API to do the work.

@charlycoste
Copy link

Actually... There is much more code. But it's easier to extend and improves testability thanks to dependency injection. Here, you are building everything in the same script. But it's possible to have a set of defined queries:

$results = $searchService->findContent(  new MyArticlesQuery );

or:

$results = $searchService->findContent(  new MyConfigurableQuery('articles') );

or:

$results = $searchService->findContent(  new MockObjectForTestPurpose );

This was not possible with eZContentObject::subTreeByNodeID()

So... I'm still confident in this new API ;)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment