在 extbase 中,如何通过 uid 以外的其他值访问项目
In extbase, how to access item by another value than uid
在自定义的 extbase 扩展中,我需要调用一个显示操作,将另一个值传递给它 uid
(这是 Use other than primary key as RealURL id_field 的延续)。
由于值"other than 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();
//}
是的,当您在参数中使用带有模型绑定的操作时,它将始终按定义为 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 行问题 ;)
其他样本
根据您粘贴的代码,我会像这样使用它,在这种情况下,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();
}
在自定义的 extbase 扩展中,我需要调用一个显示操作,将另一个值传递给它 uid
(这是 Use other than primary key as RealURL id_field 的延续)。
由于值"other than 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();
//}
是的,当您在参数中使用带有模型绑定的操作时,它将始终按定义为 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 行问题 ;)
其他样本
根据您粘贴的代码,我会像这样使用它,在这种情况下,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();
}