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