Создание древовидной структуры в VisualForce/Apex из самоссылающейся таблицы/sObject

Мои контроллеры все пользовательские.

У меня есть объект/таблица с полем, которое ссылается на тот же объект и обозначает родительский объект.

В объекте/таблице много строк.

Я хочу сбросить их все в VF и позволить пользователям проверять, какие строки применимы к ним. Если родительский объект неприменим к пользователю, дочерний объект никогда не будет применим.

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

Как это лучше всего сделать в VisualForce и Apex?

Спасибо!


person Matthew Moisen    schedule 10.04.2013    source источник


Ответы (1)


Чтобы отобразить, например, только родительские учетные записи, все, что вам нужно, это

SELECT Id, Name FROM Account WHERE ParentId = null

Когда ваш пользователь решит, что он хочет просмотреть дочерние элементы одной записи (что можно сделать, например, как <apex:actionFunction> в флажке), вы сможете запрашивать до 5 + 1 уровней в глубину. Начните с этого запроса и поэкспериментируйте

SELECT Id, Name, (optional subquery here)
FROM Account
WHERE ParentId = :selectedId
    OR Parent.ParentId = :selectedId
    OR Parent.Parent.ParentId = :selectedId
    ... // We can use up to 5 dots
ORDER BY ParentId, Parent.ParentId, Parent.Parent.ParentId ...

Под 5+1 я подразумеваю 5 «точек» и возможность подзапроса. Это не будет работать на учетных записях, но на вашем пользовательском объекте вы также сможете поместить туда (SELECT Id FROM CustomObjects__r).

Тогда вам придется каким-то образом красиво отобразить их в виде дерева ;) Существует множество инструментов Javascript, которые принимают иерархические данные JSON, или вы можете решить построить много вложенных <apex:repeat>... Просто следите за ограничениями состояния просмотра!

Проверьте эти ссылки для вдохновения / предостережений:

  1. https://salesforce.stackexchange.com/questions/4537/how-to-reduce-a-large-internal-view-state-what-is-in-the-internal-view-state
  2. https://appexchange.salesforce.com/listingDetail?listingId=a0N300000016chCEAQ (бесплатно)
  3. https://appexchange.salesforce.com/listingDetail?listingId=a0N30000001gFEWEA2 (платный, понятия не имею, есть ли опция «пробного запуска», которую вы могли бы использовать, чтобы просмотреть хотя бы используемую Visualforce. Я никак не связан с этой компанией)
person eyescream    schedule 11.04.2013