Привет. Сегодня столкнулся с интересной задачей
надо было на странице проверить что за объект пришел контексте и в зависимости от этого строить страницу.
Задача кажется простая.
Начал решил попробовать так:
контроллер
SomeObject__c instance = new SomeObject__c ();
Schema.SObjectType objectType = instance.getsObjectType();
{!objectType == $ObjectType.SomeObject__c}
SomeObject__c instance = new SomeObject__c ();
String objectClassName = instance.getsObjectType().getDescribe().getName();
{!objectClassName == $ObjectType.SomeObject__c.name}
SomeObject__c instance = new SomeObject__c ();
String objectClassType = instance.getsObjectType().getDescribe().getKeyPrefix();;
{!objectClassType == $ObjectType.SomeObject__c}
Привет. Сегодня столкнулся с интересной задачей надо было на странице проверить что за объект пришел контексте и в зависимости от этого строить страницу. Задача кажется простая. Начал решил попробовать так: контроллер [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}
Упростил немного задачу :) Если есть Id у instance. Чтобы не вычислять object prefix в контроллере делаем все простой скромной строчкой на VF [code] {!LEFT(instance.Id, 3) == $ObjectType.SomeObject__c} [/code] И пихаем его в rendered где надо.
[quote="Dmitry Shnyrev"] [code] String objectClassName = instance.getsObjectType().getDescribe().getName(); [/code] [/quote] Дим, я не знаю в каком контексте это используется, но совершенно точно это будет плохо работать, если объекты пойдут с неймспейсами.
Как раз все будет отлично работать - у меня неймспейсы.
Ты выдрал строчку из контекста.
Да вот это вернет имя класса с неймспейсом
String objectClassName = instance.getsObjectType().getDescribe().getName();
$ObjectType.SomeObject__c.name
Как раз все будет отлично работать - у меня неймспейсы. Ты выдрал строчку из контекста. Да вот это вернет имя класса с неймспейсом [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]