2015-03-02 32 views
0

在自定義extbase擴展中,我需要調用show操作,並將其傳遞給另一個值,而不是uid(這是Use other than primary key as RealURL id_field的延續)。在extbase中,如何通過除uid之外的其他值訪問項目

當值「比UID等」不解決,它導致異常http://wiki.typo3.org/Exception/CMS/1297759968

編輯:這裏是當前工作(但醜陋的)控制器代碼:

/** 
* ItemController 
*/ 
class ItemController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController { 

    /** 
    * itemRepository 
    * 
    * @var \STUBR\Weiterbildung\Domain\Repository\ItemRepository 
    * @inject 
    */ 
    protected $itemRepository = NULL; 

    /** 
    * action list 
    * 
    * @return void 
    */ 
    public function listAction(\STUBR\Weiterbildung\Domain\Model\Item $item=null) { 
     if (!empty(\TYPO3\CMS\Core\Utility\GeneralUtility::_GET('tx_weiterbildung_pi1'))){ 
      $this->forward('show'); 
     } 
     $items = $this->itemRepository->findAll(); 
     $this->view->assign('items', $items); 
    } 

    /** 
    * action show 
    * 
    * @param \STUBR\Weiterbildung\Domain\Model\Item $item 
    * @return void 
    */ 
    public function showAction(\STUBR\Weiterbildung\Domain\Model\Item $item=null) { 
     $tx_weiterbildung_pi1_get = \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('tx_weiterbildung_pi1'); 
     if (!empty($tx_weiterbildung_pi1_get)){ 
     $dfid = intval($tx_weiterbildung_pi1_get['durchfuehrungId']); 
     } 
     $items = $this->itemRepository->findByDurchfuehrungId($dfid); 
     // helpful: 
     //\TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($item); 
     $this->view->assign('item', $items[0]); 
    } 
} 

PS這裏有如果神奇的方法不起作用,可以在存儲庫中使用5行:

//public function findByDurchfuehrungId($dfid) { 
// $query = $this->createQuery(); 
// $query->matching($query->equals('durchfuehrungId', $dfid)); 
// return $query->execute(); 
//} 

回答

1

是的,當您在param中使用模型綁定操作時,它會總是按字段定義爲ID來查找對象 - 在我們的例子中,它始終是uid,但請記住,您不需要自動綁定模型,因爲您可以自己回收模型。

最可能的是,你還記得,前一段時間我建議使用<f:link.page additionalParams="{originalUid:myObj.originalUid}"Click here</f:link.page>,而不是<f:link.action...>

在這種情況下,你的表演動作應該是這樣的:

public function showAction() { 
    $item = $this->itemRepository->findByOriginalUid(intval(GeneralUtility::_GET('originalUid'))); 
    $this->view->assign('item', $item); 
} 

findByOriginalUid應該工作神奇沒有聲明,但即使它不是它只是在回購5行的問題;)

Ot她的樣本

根據你貼我會使用它,而這樣的,在這種情況下listAction的代碼獲取調度員對整個插件作用:

public function listAction() { 
    // access get param in array 
    $tx_weiterbildung_pi1_get = \TYPO3\CMS\Core\Utility\GeneralUtility::_GET('tx_weiterbildung_pi1'); 
    $dfId = intval($tx_weiterbildung_pi1_get['durchfuehrungId']); 

    if ($dfId > 0) { // tx_weiterbildung_pi1 exists and is positive, that means you want to go to showAction 
     $item = $this->itemRepository->findByDurchfuehrungId($dfId); 
     if (!is_null($item)) { // Forward to showAction with found $item 
      $this->forward('show', null, null, array('item' => $item)); 
     }else { // Or redirect to the view URL after excluding single item ID from GET params 
      $this->redirectToUri($this->uriBuilder->setArgumentsToBeExcludedFromQueryString(array('tx_weiterbildung_pi1'))->build()); 
     } 
    } 

    // No `tx_weiterbildung_pi1` param, so it should be displayed as a listAction 

    $items = $this->itemRepository->findAll(); 
    $this->view->assign('items', $items); 
} 

/** 
* @param \STUBR\Weiterbildung\Domain\Model\Item $item 
*/ 
public function showAction(\STUBR\Weiterbildung\Domain\Model\Item $item = null) { 
    $this->view->assign('item', $item); 
} 

你的取景器也應該getFirst()對象,如果可能的:

public function findByDurchfuehrungId($DfId) { 
    $query = $this->createQuery(); 
    $query->matching($query->equals('durchfuehrungId', $DfId)); 
    return $query->execute()->getFirst(); 
} 
+0

是不是魔術功能'findByUid()'?作爲存儲庫中的所有魔術功能'findBy [COLUMNNAME]()' – konsolenfreddy 2015-03-02 23:45:39

+0

@konsolenfreddy我的問題是有點不完整original_uid/originalUid是我必須查找的字段。將嘗試儘快 – Urs 2015-03-03 06:38:22

+0

爲什麼你不使用''? 不應該這樣做:' ... in fluid ,並使用action方法:'public function showAction($ originalUid){...}',其中'$ originalUid'註解了正確的類型? 這種方式似乎更「正確」:避免參數名稱衝突更容易。 – Jost 2015-03-03 09:06:15

相關問題