2017-01-05 6 views
0

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

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

поле не будет отображаться в редакторе форма - или в идеале, будет условно отображаться для глобальных админов.

Похоже, что использование API для обновления документа без использования CheckOut не работает. Однако, если я сделаю Checkout/Update/CheckIn на странице выписки, автор потеряет свою работу, которую я предполагаю?

Любой способ справиться с этим «безрежимным» полем с помощью модели данных Kentico и API?

ответ

-1

К сожалению, вам придется проверять его с помощью API. См. Примеры here.

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

+0

Итак, что произойдет, если автор уже проверил содержимое? – techphoria414

+0

Ничего не случится, так как выполнение остановит @ if (! Page.IsCheckedOut) строка –

+0

Это не относится к моей проблеме вообще. Я знаю, как проверить, но мне нужно обновить это поле независимо. – techphoria414

2

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

Единственный способ решить вашу проблему - создать другую таблицу, которая отображает значения, которые вы хотите на странице. Тогда вам не нужно беспокоиться о проверенных страницах, вам просто нужно захватить documentID или что-то в этом роде. Поскольку значение не отображается в редакторе, у вас есть поле, которое выполняет поиск в этой таблице.

+0

Я пробовал это, но мне нужны данные в моем индексе Smart Search. Я попытался добавить настраиваемое поле с помощью обработчика 'CMS.DocumentEngine.DocumentEvents.GetContent.Execute', но запросы интеллектуального поиска не кажутся хорошими с добавленными полями. – techphoria414

+0

Может потребоваться создать индекс пользовательского поиска. Может быть самым простым решением. –

+0

Я использую много полей из документов в моем поиске, и я не уверен, что это решит проблему разбора запроса, с которой я столкнулся, но потенциально стоит сделать снимок. – techphoria414

1

Предпочитаемый и правильный путь - это использование API, но, как вы заявили, это создает проблемы, если у пользователя есть что-то уже проверенное и работающее над ним или оно находится в рабочем процессе и еще не опубликовано.

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

Примечание: это не рекомендуется, если вы не знаете, что конкретно вы делаете, и сделали полное тестирование на нем

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

  1. Перейти к самому документу в cms_documents таблице и получить документ, который вы работаете.
  2. Затем с помощью полей DocumentCheckedOutVersionHistoryID и DocumentPublishedVersionHistoryID' you can get the version history IDs of the document from the Таблица CMS_VersionHistory`.
  3. Затем вы можете выполнить обновление для CMS_VersionHistory и полей пользовательского типа страницы.
  4. Затем вам нужно посмотреть в таблице CMS_WorkflowHistory и узнать, находится ли этот документ в рабочем процессе и на каком этапе.
  5. После того, как у вас есть этот этап истории операций, используйте поле VersionHistoryID, чтобы вернуться в таблицу CMS_VersionHistory и обновить эту запись своими данными.

Опять же, не изящное решение, так как вы используете проверку/выход и рабочий процесс, но после некоторых проб и ошибок и тестирования вы сможете понять это.

UPDATE
Вы также можете иметь возможность добавлять пользовательские таблицы или какой-либо другой связанной таблицы базы данных, которая позволит вам создать глобальный обработчик. Связанная таблица будет содержать ваши обновления через API и другие вызовы без управления версиями или рабочего процесса. Затем, когда пользователь обновляет конкретный тип страницы, вы можете сделать проверку, чтобы увидеть, когда последний раз, когда связанная таблица была обновлена, и обновите поля (ов), необходимые для обновления этой конкретной страницы (конечно, по идентификаторам узлов и документов).

+0

Спасибо. Это большая часть копания в базе данных (и требующая обновления некоторых полей XML из того, что я видел), но до сих пор кажется единственным решением. Похоже, что Кентико должен рассмотреть концепцию неверсированных полей. – techphoria414

+0

Как бы вы это сделали @ techphoria414? Определено ли это поле в объекте? Просто появилась другая идея, проверьте обновление. –

+0

Ahh Я вижу, что Зак уже предложил что-то в строке обновленного мной обновления. –

Смежные вопросы