2015-04-20 28 views
5

Bir TYPO3 örneğinin ön ve arka ucundaki dosyaları karşıya yüklemeye izin veren bir uzantı yazıyorum. Yükleme, her iki görünümde de çalışır, ancak yönetici, arka planda liste görünümünde bir yüklemeyi silmek istiyorsa, web sunucusunun sabit diskinde bulunan "fiziksel" dosya silinmez, yalnızca sys_file_reference kaydı.Sys_file_reference öğesini silerken dosyayı silme

Yükleme kaydının silinmesi durumunda ilişkili dosyanın da silinmesi gerektiğini tca'ya söyleme olanağı var mı? Ayrıca aşağıdaki kodla bir yuva uygulamak denedim ama hiçbir şey olmuyor:

ext_localconf.php:

\TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Extbase\\SignalSlot\\Dispatcher')->connect(
    'TYPO3\CMS\Extbase\Persistence\Generic\Backend', 
    'afterRemoveObject', 
    'Kmi\feupload\Slots\MyAfterRemoveObjectSlot', 
    'myAfterRemoveObjectMethod' 
); 

Sınıflar/Yuvaları/MyAfterRemoveObjectSlot.php:

namespace Kmi\feupload\Slots; 
class MyAfterRemoveObjectSlot { 
    public function myAfterRemoveObjectMethod($object) { 
    // do something 
    \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($object); 
    } 
} 

kimse bir Has fikir bu nasıl çözülür? Birçok yüklemeleri olması ve yönetici birini ilişkili dosya da silinmesi gerektiğini ... silerse

Ben tam oluşturmak için zaman yok maalesef

+0

https://forge.typo3.org/issues/52631 – Zeeshan

+0

Peki, bir dosya başvurusu silindiyse, temel dosyayı silmek istediğinizi size anlatabilir miyim? Ve dosya referansı "yükleme" nesnesinden bir ilişki mi? Lütfen netleştirin, sonra size yardımcı olabilirim. Arka uç, Extbase Kalıcılığı kullanmadığından SignalSlot'unuz çalışmaz.Ancak DataHandler'da kancaları kullanan çözümler var. Lütfen TYPO3 sürümünü de belirtin, eğer 6.2 veya 7 ise lütfen ilgili etiketi ekleyin. – lorenz

+0

Evet, bunu yapmak istediğim şey tam olarak bu. Dosya referansı, yükleme neslimin bir özelliğidir ve sınıf, \ TYPO3 \ CMS \ Extbase \ Domain \ Model \ FileReference dizinini genişletir. TYPO3 6.2 kullanıyorum. Teşekkür ederiz –

cevap

1

Yardımlarınız :) için şimdiden teşekkür ederiz olacak , ATM'yi test ettim ama gerekli adımları bir araya getiriyorum ve umarım bir çözüm üretebilir ve cevabımı tamamlayabilirim.

TCEFORM aracılığıyla yapılan her bir işlem, DataHandler (daha önce TCEmain olarak adlandırılır) ile kaydedilir. DataHandler çok sayıda kancaya sahiptir. "Yükleme" modelinizin file numaralı bir özelliğe sahip olduğunu varsayalım. Bu, \TYPO3\CMS\Extbase\Domain\Model\FileReference türünde (veya uzatılan) bir özelliktir.

TCEFORM'daki dosya referansları IRRE elemanları olarak eklenir. Eğer dosya referansı kaldırmak ve yükle nesneyi kaydederken Yani, aşağıdaki veriler DataHandler gönderilen (diğerleri amogst) 'dir: Bu uid 15011 dosya referansı silinmesi gerekir anlamına gelir

cmd[sys_file_reference][15011][delete]=1 

. Bunun için processCmdmap_deleteAction kancasını uygulamanızı öneririm. Bu nedenle, komutun "Yükleme" kaydının bir manipülasyonu yoluyla yürütülüp yürütülmediğini öğrenmek için veri haritasını kontrol etmeniz gerekmektedir.

ext_localconf.php:

$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tcemain.php']['processCmdmapClass']['your_extension'] = 'My\\Extension\\Hook\\DataHandler'; 

EXT: your_extension/Sınıflar/Kanca/DataHandler.php

Bu kod test edilmedi! Eğer kontroller Ne için gerekli olan bilmeleri

<?php 
namespace My\Extension\Hook 

class DataHandler { 

    /** 
    * @param string $table 
    * @param int $id 
    * @param array $recordToDelete 
    * @param $parentObject \TYPO3\CMS\Core\DataHandling\DataHandler 
    */ 
    public function processCmdmap_deleteAction($table, $id, $recordToDelete, $parentObject) { 
     if (array_key_exists('tx_myext_domain_model_upload', $parentObject->datamap)) { 
      // Parent record of record to delete is of type "tx_myext_domain_model_upload" 
      if ($table === 'sys_file_reference' && is_integer($id)) { 
       // A file reference was requested to delete 
       // Get an instance of the ResourceFactory 
       /** @var $resourceFactory \TYPO3\CMS\Core\Resource\ResourceFactory */ 
       $resourceFactory = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance('TYPO3\\CMS\\Core\\Resource\\ResourceFactory'); 
       // We get the FileReference object for the given id 
       $fileReferenceObject = $resourceFactory->getFileReferenceObject($id); 
       // Delete the original file of the file reference 
       $fileWasDeleted = $fileReferenceObject->getOriginalFile()->delete(); 
       // @TODO throw a warning if $fileWasDeleted is false     
      } 
     } 
    } 

} 

Ben kodu yorumladı.

ext_localconf.php dosyasındaki kanca tanımlandıktan sonra sistem önbelleğini temizlemeyi unutmayın.

+0

#lorenz, FAL referans kaydını silmek için günümü ve ayrıca ilgili klasörden silinen resim/dosyayı kaydettiniz. ama gördüğüm, sys_file_reference öğesinden silinen tüm satırı/kaydı silinmiş olarak silindi = 1. Benim durumumda bu anlaşma ile mutluyum;) tekrar teşekkür ederim adam :) –