Как сделать управление версиями файлов при загрузке файлов в Alfresco с использованием CMIS Stack Overflow

Я использую Apache Chemistry CMIS PHP клиент загружать документы из локальной папки в Alfresco Community Edition 5.1 через ATOM. Вот скрипт, который я использую для этого:

require_once ('cmis_repository_wrapper.php');
require_once ('cmis_service.php');

$repo_url = "http://127.0.0.1:8080/alfresco/api/-default-/public/cmis/versions/1.1/atom";
$repo_username = "user";
$repo_password = "pass";

$client = new CMISService($repo_url, $repo_username, $repo_password);

$repo_folder = "/alfrescoFolder";
$source_folder = "localFolder/";
$source_files = array_diff(scandir("$source_folder", 1), array('..', '.'));
$myfolder = $client->getObjectByPath($repo_folder);

foreach($source_files as $file)
{
try
{
$upload = $client->createDocumentFromSource($myfolder->id, $file, "$source_folder/$file");
}
catch(Exception $e)
{
echo "Some error here.";
}
}

Этот скрипт работает нормально, и документы загружаются без проблем, при условии, что документ еще не существует в хранилище Alfresco. Например, предположим, у меня есть документ в моем хранилище Alfresco с именем example.txtи поэтому, если я пытаюсь загрузить документ из моей локальной папки с тем же именем, я получаю исключение ограничения CMIS. Я не знаю, как я могу загрузить новую версию существующего документа.

Это то, что я пробовал до сих пор, но это не работает:

$objs = $client->getChildren($myfolder->id);

foreach($source_files as $file)
{
foreach($objs->objectList as $obj)
{
if($obj->properties['cmis:name'] == $file)
{
try
{
$checkedout = $client->checkOut($obj->id);
$client->checkIn($checkedout->id);
}
catch(Exception $e)
{
echo "Some error here.";
}
}
else
{
try
{
$upload = $client->createDocumentFromSource($myfolder->id, $file, "$source_folder/$file", array('cmis:objectTypeId'=>'D:ex:document'));
}
catch(Exception $e)
{
echo "Some error here";
}
}
}
}

Я получаю эту ошибку:

DEBUG: postEntry: myURL = http://127.0.0.1:8080/alfresco/api/-default-/public/cmis/versions/1.1/atom/checkedoutDEBUG: postEntry: entry_template = {title} {SUMMARY} {CONTENT} {PROPERTIES} DEBUG: postEntry: properties_xml = b549c715-9a9d-427c-bd4b-c6ea29d222cb;1.0 DEBUG: postEntry: hash_values = Array ( [PROPERTIES] => b549c715-9a9d-427c-bd4b-c6ea29d222cb;1.0 [SUMMARY] => {summary} ) DEBUG: postEntry: post_value = b549c715-9a9d-427c-bd4b-c6ea29d222cb;1.0

Что забавно, так это то, что документ заблокирован для редактирования, поэтому я не знаю, что происходит. Я также не знаю, проверяет ли я документ, а затем проверяет документ.

TL; DR

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

0

Решение

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

Конечно, базовая спецификация CMIS поддерживает ее, поэтому вы можете либо обновить библиотеку для поддержки извлечения / регистрации, либо использовать необработанную привязку.

1

Другие решения

Я не эксперт по CMIS, но я думаю, что это сообщение на форуме отвечает на вопрос. Смотрите ответ от «Jevon», который предоставляет пример и ссылку на эта страница (см. раздел «Обновление документа»)

1

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

Редактировать: добавлена ​​дополнительная информация.

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

<?php

require_once(__DIR__ . '/../vendor/autoload.php');
if (!is_file(__DIR__ . '/conf/Configuration.php')) {
die("Please add your connection credentials to the file \"" . __DIR__ . "/conf/Configuration.php\".\n");
} else {
require_once(__DIR__ . '/conf/Configuration.php');
}

$major = (boolean) isset($argv[1]) ? $argv[1] : false;

$httpInvoker = new \GuzzleHttp\Client(
array(
'defaults' => array(
'auth' => array(
CMIS_BROWSER_USER,
CMIS_BROWSER_PASSWORD
)
)
)
);

$parameters = array(
\Dkd\PhpCmis\SessionParameter::BINDING_TYPE => \Dkd\PhpCmis\Enum\BindingType::BROWSER,
\Dkd\PhpCmis\SessionParameter::BROWSER_URL => CMIS_BROWSER_URL,
\Dkd\PhpCmis\SessionParameter::BROWSER_SUCCINCT => false,
\Dkd\PhpCmis\SessionParameter::HTTP_INVOKER_OBJECT => $httpInvoker,
);

$sessionFactory = new \Dkd\PhpCmis\SessionFactory();

// If no repository id is defined use the first repository
if (CMIS_REPOSITORY_ID === null) {
$repositories = $sessionFactory->getRepositories($parameters);
$repositoryId = $repositories[0]->getId();
} else {
$repositoryId = CMIS_REPOSITORY_ID;
}

$parameters[\Dkd\PhpCmis\SessionParameter::REPOSITORY_ID] = $repositoryId;

$session = $sessionFactory->createSession($parameters);
$rootFolder = $session->getObject($session->createObjectId($session->getRootFolder()->getId()));

try {

$document = null;
$stream = \GuzzleHttp\Stream\Stream::factory(fopen($filePath, 'r'));
foreach ($rootFolder->getChildren() as $child) {
if ($child->getName() === $fileName) {
$document = $child;
break;
}
}

if (!$document) {

$properties = array(
\Dkd\PhpCmis\PropertyIds::OBJECT_TYPE_ID => 'cmis:document',
\Dkd\PhpCmis\PropertyIds::NAME => $fileName
);

$document = $session->createDocument($properties, $rootFolder, $stream);
$document = $session->getObject($document);
}

$checkedOutDocumentId = $document->getVersionSeriesCheckedOutId();
if ($checkedOutDocumentId) {
$checkedOutDocumentId = $session->createObjectId($checkedOutDocumentId);
} else {
$checkedOutDocumentId = $document->checkOut();
}

$checkedInDocumentId = $session->getObject($checkedOutDocumentId)->checkIn(
$major,
array(
\Dkd\PhpCmis\PropertyIds::DESCRIPTION => 'New description'
),
$stream,
'Comments'
);} catch (\Dkd\PhpCmis\Exception\CmisVersioningException $e) {
echo "********* ERROR **********\n";
echo $e->getMessage() . "\n";
echo "**************************\n";
exit();
}
1