Регистрация  |  Вход

Приколы с $ObjectType.SomeObject

Привет. Сегодня столкнулся с интересной задачей
надо было на странице проверить что за объект пришел контексте и в зависимости от этого строить страницу.

Задача кажется простая.
Начал решил попробовать так:
контроллер

SomeObject__c instance = new SomeObject__c ();
Schema.SObjectType objectType = instance.getsObjectType();

страница
{!objectType == $ObjectType.SomeObject__c}

Первый облом - false
Ладно, логика не сработала, будем действовать в лоб
Продолжил с проверки по имени
контроллер
SomeObject__c instance = new SomeObject__c ();
String objectClassName = instance.getsObjectType().getDescribe().getName();

страница
{!objectClassName == $ObjectType.SomeObject__c.name}

!Опять облом - вся логика в мозгу сломалась. Пробую вывести на страницу оба значения - абсолютно одинаковые.
Погуглил - оказалось что это известная ошибка и на VF странице $ObjectType.SomeObject__c.name является объектом а не строкой!!!
А теперь совсем нелогичный воркараунд которые, мля, заработал
контроллер
SomeObject__c instance = new SomeObject__c ();
String objectClassType = instance.getsObjectType().getDescribe().getKeyPrefix();;

страница
{!objectClassType == $ObjectType.SomeObject__c}

По логике пытаемся сравнить String и Object (Schema.SObjectType по логике)
Ответ True!!!
Жесть.

Привет. Сегодня столкнулся с интересной задачей
надо было на странице проверить что за объект пришел контексте и в зависимости от этого строить страницу.

Задача кажется простая.
Начал решил попробовать так:
контроллер
[code]
SomeObject__c instance = new SomeObject__c ();
Schema.SObjectType objectType = instance.getsObjectType();
[/code]
страница
[code]
{!objectType == $ObjectType.SomeObject__c}
[/code]
Первый облом - false
Ладно, логика не сработала, будем действовать в лоб
Продолжил с проверки по имени
контроллер
[code]
SomeObject__c instance = new SomeObject__c ();
String objectClassName = instance.getsObjectType().getDescribe().getName();
[/code]
страница
[code]
{!objectClassName == $ObjectType.SomeObject__c.name}
[/code]
!Опять облом - вся логика в мозгу сломалась. Пробую вывести на страницу оба значения - абсолютно одинаковые.
Погуглил - оказалось что это известная ошибка и на VF странице $ObjectType.SomeObject__c.name является объектом а не строкой!!!
А теперь совсем нелогичный воркараунд которые, мля, заработал
контроллер
[code]
SomeObject__c instance = new SomeObject__c ();
String objectClassType = instance.getsObjectType().getDescribe().getKeyPrefix();;
[/code]
страница
[code]
{!objectClassType == $ObjectType.SomeObject__c}
[/code]
По логике пытаемся сравнить String и Object (Schema.SObjectType по логике)
Ответ True!!!
Жесть.

Известная проблема, сам сталкивался. А твое решение впринципе тоже логичное, так как ObjectType идентифицируется префиксом объекта, скорее всего для этого типа данных оператор == переопределен для сравнения, как раз по префиксу.

Известная проблема, сам сталкивался. А твое решение впринципе тоже логичное, так как ObjectType идентифицируется префиксом объекта, скорее всего для этого типа данных оператор == переопределен для сравнения, как раз по префиксу.

Упростил немного задачу Если есть Id у instance.
Чтобы не вычислять object prefix в контроллере делаем все простой скромной строчкой на VF

{!LEFT(instance.Id, 3) == $ObjectType.SomeObject__c}

И пихаем его в rendered где надо.

Упростил немного задачу :) Если есть Id у instance.
Чтобы не вычислять object prefix в контроллере делаем все простой скромной строчкой на VF
[code]
{!LEFT(instance.Id, 3) == $ObjectType.SomeObject__c}
[/code]
И пихаем его в rendered где надо.

Dmitry Shnyrev
String objectClassName = instance.getsObjectType().getDescribe().getName();

Дим, я не знаю в каком контексте это используется, но совершенно точно это будет плохо работать, если объекты пойдут с неймспейсами.

[quote="Dmitry Shnyrev"]
[code]
String objectClassName = instance.getsObjectType().getDescribe().getName();
[/code]
[/quote]
Дим, я не знаю в каком контексте это используется, но совершенно точно это будет плохо работать, если объекты пойдут с неймспейсами.

Как раз все будет отлично работать - у меня неймспейсы.
Ты выдрал строчку из контекста.
Да вот это вернет имя класса с неймспейсом

String objectClassName = instance.getsObjectType().getDescribe().getName();

Но вот это тоже вернет имя класса с неймспейсом
$ObjectType.SomeObject__c.name

поэтому их сравнение по логике должно работать (если не учитывать что оно в SF не работает как я выше описал).
Я же нигде не сравниваю с хардкодным названием объекта.

Как раз все будет отлично работать - у меня неймспейсы.
Ты выдрал строчку из контекста.
Да вот это вернет имя класса с неймспейсом
[code]String objectClassName = instance.getsObjectType().getDescribe().getName();[/code]
Но вот это тоже вернет имя класса с неймспейсом
[code]$ObjectType.SomeObject__c.name[/code]
поэтому их сравнение по логике должно работать (если не учитывать что оно в SF не работает как я выше описал).
Я же нигде не сравниваю с хардкодным названием объекта.

С неймспейсом оно будет если твой package куда-то уже поставили. А если ты его разрабатываешь (в Developer org, например) - то там неймспейса не будет.

С неймспейсом оно будет если твой package куда-то уже поставили. А если ты его разрабатываешь (в Developer org, например) - то там неймспейса не будет.

Mike V, что-то я не могу понять про что ты хочешь сказать. Можешь привести пример?

У меня и тот и тот тип орга (и пакет и дев орг с неймспейсом где я разрабатываю)
name, getName() возвращают имя полностью и естественно я не сравниваю их с голым текстом.
Если надо сравнить без неймспейчас, имея голое название объекта в виде строки, то можно использовать getLocalName() - которое вернет имя без префикса.

Mike V, что-то я не могу понять про что ты хочешь сказать. Можешь привести пример?

У меня и тот и тот тип орга (и пакет и дев орг с неймспейсом где я разрабатываю)
name, getName() возвращают имя полностью и естественно я не сравниваю их с голым текстом.
Если надо сравнить без неймспейчас, имея голое название объекта в виде строки, то можно использовать getLocalName() - которое вернет имя без префикса. 

Я наверное плохо выразился, имелось ввиду что если сравнивать getName() с текстов, то результат зависит от того, есть неймспейс (пакет уже поставлен) или нету (если его разрабатывают). Я так понял, ты публикуешь пакет из того же Dev Org, где и разрабатываешь. Если да, тогда для тебя это некритично.

Я наверное плохо выразился, имелось ввиду что если сравнивать getName() с текстов, то результат зависит от того, есть неймспейс (пакет уже поставлен) или нету (если его разрабатывают). Я так понял, ты публикуешь пакет из того же Dev Org, где и разрабатываешь. Если да, тогда для тебя это некритично.

Понял тебя. Все правильно говоришь. Главное никогда не сравнивать с текстом. В принципе для этого все необходимое в SF есть. Главное немного покопаться в теме
Understanding Apex Describe Information

Понял тебя. Все правильно говоришь. Главное никогда не сравнивать с текстом. В принципе для этого все необходимое в SF есть. Главное немного покопаться в теме 
[url=https://www.salesforce.com/us/developer/docs/apexcode/Content/apex_dynamic_describe_objects_understanding.htm]Understanding Apex Describe Information[/url]