2017-04-20 56 views
1

我在我自己的擴展模型中擴展了TYPO3的FE用戶擴展類7.6調用CommunityManager,我想使用調用common到存儲庫如findByUid()findAll()但它們不起作用,返回值爲Null我自己的域名存儲庫的擴展,使得TYPO3 7.6的FE用戶擴展不起作用

我一直在研究它,即使在幾個這裏的問題,但它仍然無法正常工作。目前,我有以下設置

在我CommunityManagerController

/** 
* communityManagerRepository 
* 
* @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository 
* @inject 
*/ 
protected $communityManagerRepository = null; 

/** 
* action list 
* 
* @return void 
*/ 
public function listAction() 
    { 
    $this->communityManagerRepository = $this->objectManager->get('VENDOR\MyExt\Domain\Repository\CommunityManagerRepository'); 
    $communityManagers = $this->communityManagerRepository->findAll(); 
    $this->view->assign('communityManagers', $communityManagers); 
    } 

的CommunityManagerRepository

class CommunityManagerRepository extends TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository 
{ 
    public function initializeObject() 
    { 
    $defaultQuerySettings = $this->objectManager->get(\TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings::class); 
    $defaultQuerySettings->setRespectStoragePage(false); 
    $this->setDefaultQuerySettings($defaultQuerySettings); 
    } 
} 

而且Typo腳本代碼

在常量

plugin.tx_myext_nameofmyplugin { 
    persistence { 
    storagePid = 5 
    } 
} 

在設置

config.tx_extbase { 
    persistence { 
    classes { 

     TYPO3\CMS\Extbase\Domain\Model\FrontendUser { 
     subclasses { 
      Tx_MyExt_CommunityManager = VENDOR\MyExt\Domain\Model\CommunityManager 

     } 
     } 
     VENDOR\MyExt\Domain\Model\CommunityManager { 
     mapping { 
      tableName = fe_users 
      recordType = Tx_MyExt_CommunityManager 
     } 
     } 

    } 
    } 
} 

我會感激你指導我解決問題

回答

1

我假設您的設置中的VENDOR和MyExt是正確的,並且模型CommunityManager存在。

class CommunityManager extends \TYPO3\CMS\Extbase\Domain\Model\FrontendUser { 
} 

class CommunityManagerRepository extends \TYPO3\CMS\Extbase\Persistence\Repository { 
} 

在類似的情況下,我不得不延長設置一個位與子類和RECORDTYPE:

config.tx_extbase { 
     persistence { 
       classes { 
         TYPO3\CMS\Extbase\Domain\Model\FrontendUser { 
           subclasses { 
             Tx_MyExt_CommunityManager = VENDOR\MyExt\Domain\Model\CommunityManager 

           } 
         } 
         VENDOR\MyExt\Domain\Model\CommunityManager { 
           mapping { 
             tableName = fe_users 
             recordType = Tx_MyExt_CommunityManager 
           } 
         } 

       } 
     } 
} 

參見https://stackoverflow.com/a/22374970/7896428

+0

是的,模型'CommunityManager'直接延伸到'FrontendUser'。我設置了輸入框,改變了擴展或'CommunityManagerRepository'爲extbase'Repository',但它仍然不起作用 –

+0

我在文件ext_typoscript_setup.txt中找到了這個Typoscript,由Extension Builder生成 –

+0

只需修改類型字段fe_users表並將它與我們自己的擴展相關聯 –

2

首先,您使用的是注入的註釋加載\TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository類型的庫,但是你在你的行動覆蓋它與您的VENDOR\MyExt\Domain\Repository\CommunityManagerRepository。您可以簡單地在您的communityManagerRepository屬性的類型註釋中添加自己的存儲庫類名。 第二:不要使用注入註釋。用這樣的注射方法進行注射:

class CommunityManagerController extends TYPO3\CMS\Extbase\Mvc\Controller\ActionController{ 
     /** 
    * The communityManagerRepository 
    * 
    * @var \VENDOR\MyExt\Domain\Model\CommunityManagerRepository 
    */ 
    protected $communityManagerRepository; 

    /** 
    * Inject the communityManagerRepository 
    * 
    * @param \VENDOR\MyExt\Domain\Model\CommunityManagerRepository $communityManagerRepository 
    */ 
    public function injectCommunityManagerRepository(\VENDOR\MyExt\Domain\Model\CommunityManagerRepository $communityManagerRepository){ 
     $this->communityManagerRepository = $communityManagerRepository; 
    } 
} 

注射 - 註釋不好使用。你可以在這裏閱讀,爲什麼它是:https://gist.github.com/NamelessCoder/3b2e5931a6c1af19f9c3f8b46e74f837

現在你不需要與objectManager行,因爲注入方法爲你做這個。

最後,根據您的配置,communityManagerRepository將返回\VENDOR\MyExt\Domain\Model\CommunityManager類型的對象,但您的storagePid設置將因$defaultQuerySettings->setRespectStoragePage(false);而被忽略。 無論如何,除非您在模型的持久性設置(不根據您的示例)持久性設置中爲fe_users添加新的recordType,否則您應該獲取系統中現有的所有fe_users記錄。然後extbase只會將正確的recordType的fe_users記錄返回給你。

+0

不過這是行不通的。調用'$ this-> injectCommunityManagerRepository($ communityManagerRepository)'的正確方法是什麼,什麼對象應該發送它,因爲我看到的唯一對象是屬性'$ communityManagerRepository'? –

+0

注射方法不必由您來調用。實例化控制器的對象管理器將自行完成。 –

1

有幾點要在這裏檢查:

1。 檢查是否在fe_users中有pid 5您有用戶存儲。

2.檢查是否將擴展typoscript添加到template

進去安裝工具,按clear cache button

4.在那裏,在控制器,如果你使用不使用從extbaseCommunityManagerRepositoryFrontendUserRepository你可以先通過與第二步CommunityManagerRepository,因爲您在那裏設置了respectStoragefalse

+0

隨着4點的變化,行爲是相同的 –

+0

但是,您的存儲庫已加載,只有數據不會返回,是嗎? –

+0

不好意思,怎麼可能檢查它?在控制器 –

1

對於這篇文章,我的回答可能太晚了。但是我遇到了同樣的問題,在調試extbase類之後,我找到了解決方案。

你的設置很好;除了1個缺失變量recordTypeColumnName(這應該是包含值「Tx_MyExt_CommunityManager」的fe_users表記錄中的字段)。

在我自己的解決方案中,我利用了表格行中的pid列。因爲我知道我的存儲文件夾的ID,對於我所有的擴展記錄,這個ID將保持不變。

有2種方式來設置recordTypeColumnName的值:

方法1:在CTRL陣列

在TCA集類型。

$GLOBALS['TCA'][$tableName]['ctrl']['type'] = 'pid'; 

方法2:

在Typo腳本constants.txt

PID.myStorage = 5 

在Typo腳本SETUP.TXT

plugin.tx_MyExt.persistence.storagePid = {$PID.myStorage} 

    config.tx_extbase { 
    persistence { 
     classes { 
     TYPO3\CMS\Extbase\Domain\Model\FrontendUser { 
      subclasses { 
      {$PID.myStorage} = VENDOR\MyExt\Domain\Model\CommunityManager 
      } 
      recordTypeColumnName = pid 
     } 

     VENDOR\MyExt\Domain\Model\CommunityManager { 
      mapping { 
      tableName = fe_users 
      recordType = {$PID.myStorage} 
      } 
     } 
     } 
    } 
    }