Расширение GUI - получить тип публикации


3

Мне нужно найти тип публикации в расширении GUI (T2011 SP1), чтобы расширение (расширение контекстного меню) доступно только для определенного типа публикации (например, «Веб»).

Расширение было настроено и работает правильно, но теперь расширение доступно для всех типов публикаций.

Это то, что я до сих пор:

Extensions.ConfigurationManager.prototype.isAvailable = function ConfigurationManager $isAvailable(selection){  
  //add logic to catch publication type 
  var itemID = selection.getItem(0); 
  var typeOfSelection =$ models.getItemType(itemID); 

  if (typeOfSelection == $const.ItemType.STRUCTURE_GROUP || 
   typeOfSelection ==$ const.ItemType.PAGE) { 
   return true; 
  } 
  else { 
   return false; 
  } 
} 
5

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

Теперь вы могли бы использовать следующую команду для проверки Тип публикации:

var isWebType = true; 
var pub = $models.getItem(selection.getItem(0)).getPublication(); 
if (pub) { 
  var pubType = pub.getPublicationType(); 
  if (pubType) { 
   isWebType = pubType == "Web"; 
  } 
} 
return isWebType; 

Если бы не то, что метод getPublicationType() работает только на полностью загруженном объекта публикации и загрузки элементов в рамках пользовательского интерфейса асинхронное действие.

Как уже обсуждалось в this question, я не думаю, что есть способ дождаться загрузки элемента в этом методе (помимо того факта, что это сделает этот очень тяжелый метод, который вы, вероятно, также не используете хотеть).

Таким образом, мое предложение состояло в том, чтобы просто вернуть true из isAvailable(), когда дело доходит до типа публикации (вы можете использовать мой примерный код и поместить его там, если публикация будет загружена случайно, тогда у вас будет доступ к его тип публикации и код будут делать правильную проверку) и обрабатывать любые исключения в вызове execute(), когда у вас будет время загрузить публикацию, чтобы получить ее правильный тип публикации.


6

Действительно, как объяснил Барт, дело в том, что у вас не будет достаточной информации, когда дело доходит до isAvailable/isEnabled.

Информация об элементе, может быть собрана из свойств элемента списка (когда список загружается, он содержит простейшее представление элемента) или из свойств объекта (при загрузке элемента он имеет полный набор свойств, связанных с элементом) ,

В вашем случае PublicationType не содержит часть свойств списка. Поэтому, даже если у вас есть загруженный список, вам все равно нужно загрузить элемент, чтобы собрать это свойство.

Я хотел бы предложить следующие действия, чтобы достичь нужных функций:

  1. Создание расширитель данных, чтобы добавить свойство, на основе которого вы будете иметь возможность правильно обновить команду контекстного меню состояния.

  2. Добавить расширение ItemType, которое будет расширять Tridion.ContentManager.Publication, чтобы иметь возможность собирать свойство либо из узла публикации, либо из списка.

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


Update:

Я только что проверил, узел Список Публикация уже содержит PublicationType в узле публикации.

Это делает его немного проще.

Вы можете сделать следующий трюк:

if (selection.getItemType(0) == $const.ItemType.PUBLICATION) 
{ 
  var itemId = selection.getItem(0); 
  var item =$ models.getItem(itemId); 

  var publicationType = item.getPublicationType(); 

  // If publication Type is not defined, then try to find it from lists loaded 
  if (!publicationType) 
  { 

   // Loop over already loaded lists, and try to find a list node there. 
   for (var i = 0, lists = $models.getListsRegistry(), list; list =$ models.getItem(lists[i]); i++) 
   { 
   // you only need navigation lists 
   if (Tridion.OO.implementsInterface(list, "Tridion.ContentManager.ListNavigation")/* && list.hasItem(itemId)*/) 
   { 
    publicationType = $xml.getInnerText(list.getXmlDocument(), "/tcm:*/tcm:Item[@ID=\"{0}\"]/@PublicationType".format(itemId)); 
    if (publicationType) 
    { 
    break; 
    } 
   } 
   } 
  } 

  if (publicationType == "0") 
  { 
   return true; 
  } 
}