簡體   English   中英

TYPO3 ConnectionPool在文件引用的uid之后查找文件並更新數據

[英]TYPO3 ConnectionPool find a file after the uid of the file reference and update data

這個概念是,在成功保存對象之后,它應該更新數據庫中的文本(帶有掛鈎)。 讓我們將字段稱為“ succText ”。 我要訪問的表是sys_file,但是當我保存對象時,我僅獲得sys_file_reference ID。 因此,我認為我可以使用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 id,而不是sys_file表的id和字段值。

至於更新,我還沒有嘗試過,因為我還沒有弄清楚如何獲取需要更新的行。 找到行后,我猜測一個子查詢,我真的不知道。

processDatamap_preProcessFieldArray將重命名為post。 我只有通過這種方式才能在后端獲得結果。

提前致謝,

您可能要在這里使用FileRepository類。

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

其中$ uid是文件通過文件引用連接到的記錄的ID。

您將取回要處理的文件對象數組。

我通過刪除第一個代碼並添加了文件存儲庫實例來解決了我的問題。

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

很重要!

如果要創建新元素,則TYPO3會分配一個臨時UID變量,其名稱類似於此NEW45643476 為了從processDatamap_afterDatabaseOperations獲取$ uid,您需要在獲取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()函數了。

文檔資料

如果我錯過了任何事情,請告訴我,我將其添加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM