TYPO3 ConnectionPool находит файл после идентификатора файла и обновляет данные - PullRequest
0 голосов
/ 15 апреля 2019

Концепция заключается в том, что после успешного сохранения моего объекта он должен обновить текст в базе данных (с помощью крючка).Позволяет вызвать поле ' succText '.Таблица, к которой я хотел бы получить доступ, это sys_file, но я получаю идентификатор sys_file_reference только когда сохраняю объект.Поэтому я подумал, что мог бы использовать ConnectionPool, чтобы выбрать sys_file строку этой ссылки на файл, а затем вставить данные в поле ' succText '.

Я пробовал это:

public function processDatamap_preProcessFieldArray(array &$fieldArray, $table, $id, \TYPO3\CMS\Core\DataHandling\DataHandler &$pObj) {
    $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_file_reference');
    $findItemsId = $queryBuilder
       ->select('*')
       ->from('sys_file_reference')
       ->join(
          'sys_file_reference',
          'sys_file',
          'reference',
          $queryBuilder->expr()->eq('reference.uid', $queryBuilder->quoteIdentifier('uid_local'))
       )
       ->where(
            $queryBuilder->expr()->eq('uid_local', $queryBuilder->createNamedParameter($fieldArray['downloads'], \PDO::PARAM_INT))
       )
      ->execute();
}

Но это возвращает мне идентификатор sys_file_reference, а не идентификатор и значения полей таблицы sys_file.

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

processDatamap_preProcessFieldArray будет переименован в публикацию.У меня так только для того, чтобы получить результаты на бэкэнде.

Заранее спасибо,

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Вы можете использовать класс FileRepository здесь.

$fileRepository = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Resource\FileRepository::class);
$fileObjects = $fileRepository->findByRelation('tablename', 'fieldname', $uid);

Где $ uid - это идентификатор записи, к которой файлы подключены через ссылку на файл.

Youвернет массив файловых объектов для работы.

0 голосов
/ 16 апреля 2019

Я решил свою проблему, удалив первый код и добавив экземпляр репозитория файла.

 $fileRepository = GeneralUtility::makeInstance(FileRepository::class);
 $fileObjects = $fileRepository->findByRelation('targetTable', 'targetField', $uid);

ОЧЕНЬ ВАЖНО!

Если вы создаете новый элемент, TYPO3 назначает переменную temp UID с именем, похожим на это NEW45643476 . Чтобы получить $ uid из processDatamap_afterDatabaseOperations, вам нужно добавить этот код, прежде чем вы получите экземпляр fileRepository.

if (GeneralUtility::isFirstPartOfStr($uid, 'NEW')) {
    $uid = $pObj->substNEWwithIDs[$uid];
 }

Теперь, что касается текста, я извлек из pdf. Сначала я должен был получить базовое имя файла, чтобы найти его место хранения и имя. Поскольку у меня есть только один файл, мне не нужен цикл foreach, и я также могу использовать [0]. Итак, код выглядел так:

$fileID = $fileObjects[0]->getOriginalFile()->getProperties()['uid'];
$fullPath[] = [PathUtility::basename($fileObjects[0]->getOriginalFile()->getStorage()->getConfiguration()['basePath']), PathUtility::basename($fileObjects[0]->getOriginalFile()->getIdentifier())];

Это возвращает мне массив, похожий на этот:

array(1 item)
   0 => array(2 items)
      0 => 'fileadmin' (9 chars)
      1 => 'MyPdf.pdf' (9 chars)

Теперь мне нужно сохранить текст с каждой страницы в переменной. Итак, код выглядит так:

$getPdfText = '';
foreach ($fullPath as $file) {
    $parser = new Parser();
    $pdf    = $parser->parseFile(PATH_site . $file[0] . '/' . $file[1]);
    $pages  = $pdf->getPages();
    foreach ($pages as $page) {
         $getPdfText .= $page->getText();
     }
  }

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

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('sys_file');
$queryBuilder
      ->update('sys_file')
      ->where(
          $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter($fileID))
        )
        ->set('pdf_text', $getPdfText)
        ->execute();

Теперь каждый раз, когда я выбираю PDF из своего расширения, я сохраняю его текст в базе данных.

ДОПОЛНИТЕЛЬНОЕ СОДЕРЖАНИЕ

Если вы также хотите включить PDFParser и находитесь в режиме композитора, добавьте это в ваш composer.json:

"smalot/pdfparser" : "*"

и при автозагрузке:

"Smalot\\PdfParser\\" : "Packages/smalot/pdfparser/src/"

Затем в: yourExtension / Classes / Hooks / DataHandler.php добавить пространство имен:

use Smalot\PdfParser\Parser;

Теперь вы можете использовать функции getPages() и getText().

Документация

Если я что-то пропустил, дайте мне знать, и я добавлю это.

...