Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我自己的域存储库的调用扩展了TYPO3 7.6 don';行不通_Typo3_Typoscript_Extbase_Typo3 7.6.x - Fatal编程技术网

我自己的域存储库的调用扩展了TYPO3 7.6 don';行不通

我自己的域存储库的调用扩展了TYPO3 7.6 don';行不通,typo3,typoscript,extbase,typo3-7.6.x,Typo3,Typoscript,Extbase,Typo3 7.6.x,我在自己扩展的模型中有一个类,它扩展了TYPO3 7.6的FE用户call CommunityManager,我想使用存储库的公共调用,如findByUid()或findAll(),但它们不起作用,返回值为Null 我一直在研究它,甚至在这里的几个问题,但它仍然不起作用。我目前有以下设置 在我的社区管理控制器中 /** * communityManagerRepository * * @var \TYPO3\CMS\Extbase\Domain\Repository\FrontendUse

我在自己扩展的模型中有一个类,它扩展了TYPO3 7.6的FE用户call CommunityManager,我想使用存储库的公共调用,如
findByUid()
findAll()
,但它们不起作用,返回值为
Null

我一直在研究它,甚至在这里的几个问题,但它仍然不起作用。我目前有以下设置

在我的社区管理控制器中

/**
 * 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);
  }
社区管理机构

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);
  }
 }
还有打字代码

不变

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
        }
      }

    }
  }
}

我希望您能指导我解决这个问题

首先,您正在使用inject注释加载类型为
\TYPO3\CMS\Extbase\Domain\repository\FrontendUserRepository
的存储库,但您在操作中使用
供应商\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;
    }
}
inject注释不适合使用。你可以在这里阅读,为什么是:

现在您不需要objectManager的代码行,因为inject方法可以为您完成这项工作

最后,根据您的配置,communityManagerRepository将返回
\VENDOR\MyExt\Domain\Model\CommunityManager
类型的对象,但是由于
$defaultQuerySettings->setreservestagepage(false),您的storagePid设置将被忽略
无论如何,您现在应该获得系统中存在的所有fe_用户记录,除非您在模型的持久性设置中为fe_用户添加了新的记录类型(根据您的示例,您没有添加)。然后extbase将只向您返回正确记录类型的fe_用户记录。

首先,您正在使用注入注释加载类型为
\TYPO3\CMS\extbase\Domain\repository\FrontendUserRepository的存储库,但您可以在操作中使用
供应商\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;
    }
}
inject注释不适合使用。你可以在这里阅读,为什么是:

现在您不需要objectManager的代码行,因为inject方法可以为您完成这项工作

最后,根据您的配置,communityManagerRepository将返回
\VENDOR\MyExt\Domain\Model\CommunityManager
类型的对象,但是由于
$defaultQuerySettings->setreservestagepage(false),您的storagePid设置将被忽略
无论如何,您现在应该获得系统中存在的所有fe_用户记录,除非您在模型的持久性设置中为fe_用户添加了新的记录类型(根据您的示例,您没有添加)。然后extbase将只向您返回正确记录类型的fe_用户记录。

我假设供应商和MyExt在您的设置中是正确的,并且模型CommunityManager存在

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

class CommunityManagerRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
}
在类似的情况下,我必须使用子类和记录类型稍微扩展设置:

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
                                }
                        }

                }
        }
}

另请参见

我假设供应商和MyText在您的设置中是正确的,并且模型CommunityManager存在

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

class CommunityManagerRepository extends \TYPO3\CMS\Extbase\Persistence\Repository {
}
在类似的情况下,我必须使用子类和记录类型稍微扩展设置:

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. 检查在具有
pid
5的fe_用户中是否存储了用户

2.检查扩展名
typoscript
是否添加到
模板中

3.进入安装工具并按
清除缓存按钮


4.在控制器中,您不使用
CommunityManagerRepository
,但是
extbase
中的
FrontendUserRepository
如果您使用
CommunityManagerRepository
,您可以通过第一步和第二步,因为在这里您将
respectStorage
设置为
false
需要检查的点很少此处:

1. 检查在具有
pid
5的fe_用户中是否存储了用户

2.检查扩展名
typoscript
是否添加到
模板中

3.进入安装工具并按
清除缓存按钮


4.在控制器中,您不使用
CommunityManagerRepository
,但是
extbase
中的
FrontendUserRepository
如果您使用
CommunityManagerRepository
,您可以通过第一步和第二步,因为在这里您将
respectStorage
设置为
false
,我的答案对于这篇文章来说可能太晚了。但我遇到了同样的问题,在调试extbase类之后,我找到了解决方案

你的设置很好;除了1个缺少的变量recordTypeColumnName(这应该是fe_users表记录中包含值“Tx_MyExt_CommunityManager”的字段)

在我自己的解决方案中,我利用了表行中的pid列。正如我所知,我的存储文件夹的id对于扩展中的所有记录都将保持不变

有两种方法可以设置recordTypeColumnName的值:

方法1:

在TCA中,在ctrl数组中键入集合

  $GLOBALS['TCA'][$tableName]['ctrl']['type'] = 'pid';
方法2:

在TypoScript constants.txt中

  PID.myStorage = 5
在TypoScript 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}
          }
        }
      }
    }
  }

我的回答对这篇文章来说可能太晚了。但我遇到了同样的问题,在调试extbase类之后,我找到了解决方案

你的设置很好;除了1个缺少的变量