Как настроить configureDatagridFilters в Sonata Admin для использования несвязанных документов mongodb

В моем MongoDB я получил документ passenger, это типичный элемент:

{
    "_id" : ObjectId("51efdf818d6b408449000002"),
    "createdAt" : 1374674817,
    "phone" : "222222",
    ..
}

У меня также есть документ device, который ссылается на документ passenger, вот пример:

{
    "_id" : ObjectId("51efdf818d6b408449000001"),
    "os" : "android.gcm",
    "passenger" : ObjectId("51efdf818d6b408449000002"),
    ..
}

другими словами, я никак не могу узнать устройство, принадлежащее пассажиру, выполнив запрос на пассажире.. это должен быть запрос на устройстве.

В моем PassengerAdmin.php я получил следующее определение поля списка настроек:

public function configureListFields(ListMapper $listMapper)
{
    $listMapper
        ->addIdentifier('name', 'text', array('label' => 'Name'))
        ->addIdentifier('phone', 'text', array('label' => 'Phone #'))
        ->addIdentifier('createdAt', 'datetime', array('label' => 'Created At'))
        ->addIdentifier('device.os', 'text', array('label' => 'Device OS Type')) 
        ..
    ;
}

который отлично работает (я понятия не имею, как сонате удалось сопоставить device.os с пассажирами... ну да ладно).

Внутри моего configureDataGridFilters это вернет ошибку:

protected function configureDatagridFilters(DatagridMapper $datagrid)
{
    $datagrid->add('device.os');
}

ошибка:

Примечание. Неопределенный индекс: device.os в ../vendor/sonata-project/doctrine-mongodb-admin-bundle/Sonata/DoctrineMongoDBAdminBundle/Builder/DatagridBuilder.php, строка 60.

что, я думаю, имеет смысл.. и даже если я создам этот индекс, ничего не будет возвращено.. (кстати, я получил эту идею от здесь: см. отображаемую подсущность характеристики

вопрос:

как я могу настроить фильтр в отношении версии ОС устройства, чтобы он включал информацию, связанную с документом устройства. Позвольте мне показать, что я хочу сделать, используя этот пример (смесь кода и псевдокода):

->add('osVersion', 'doctrine_mongo_callback', [
    'callback' => function ($queryBuilder, $alias, $field, $params) {
            if ($params['value'] === null) {
                return;
            }
            // for each passengers as passenger
            // get passenger.id = %passengerID%
            // grab device that has passenger = %passengerID%
            // filter so that device.os == $params['value']

    'field_type' => 'choice',
    'field_options' => ['choices'=> ['android.gcm'=> "Android", "os.ios"=>"iOS"]]
]);

Я заметил, что метод createQuery суперкласса Admin может быть переопределен.. но кажется, что это глобально так, и это не поможет мне в этом конкретном случае.


person abbood    schedule 27.06.2014    source источник
comment
Вы нашли решение?   -  person addex03    schedule 16.10.2014