【问题标题】:The calls of my own domain repository that extend FE user of TYPO3 7.6 don't work我自己的扩展 TYPO3 7.6 FE 用户的域存储库的调用不起作用
【发布时间】:2017-04-20 02:19:14
【问题描述】:

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

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

在我的 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);
  }
 }

还有排版代码

在常量中

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

    }
  }
}

感谢您指导我解决问题

【问题讨论】:

    标签: typo3 typoscript extbase typo3-7.6.x


    【解决方案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

    【讨论】:

    • 是的,模型CommunityManager 直接扩展自FrontendUser。我设置了打字稿并更改了extbase Repository 的extend 或CommunityManagerRepository,但它还不起作用
    • 我在文件 ext_typoscript_setup.txt 中找到了这个 Typoscript,由 Extension Builder 生成
    • 只需要修改fe_users表中的type字段并关联到我们自己的扩展
    【解决方案2】:

    首先,您正在使用注入注解加载\TYPO3\CMS\Extbase\Domain\Repository\FrontendUserRepository 类型的存储库,但您在操作中使用VENDOR\MyExt\Domain\Repository\CommunityManagerRepository 覆盖它。您可以简单地在 communityManagerRepository-property 的类型注释中添加自己的存储库类名。 第二:不要使用注入注解。使用像这样的注入方法进行注射:

    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-annotation 不好用。你可以在这里阅读,为什么会这样:https://gist.github.com/NamelessCoder/3b2e5931a6c1af19f9c3f8b46e74f837

    现在您不需要使用 objectManager 的行,因为注入方法会为您执行此操作。

    最后,根据您的配置,communityManagerRepository 将返回类型为\VENDOR\MyExt\Domain\Model\CommunityManager 的对象,但由于$defaultQuerySettings->setRespectStoragePage(false);,您的 storagePid 设置将被忽略。 无论如何,您现在应该获得系统中存在的所有 fe_users 记录,除非您在模型的持久性设置中为 fe_users 添加了新的记录类型(根据您的示例,您没有这样做)。那么 extbase 只会返回正确 recordType 的 fe_users 记录给你。

    【讨论】:

    • 还是不行。调用$this->injectCommunityManagerRepository($communityManagerRepository) 的正确方法是什么,应该发送什么对象,因为我看到的唯一对象是属性$communityManagerRepository
    • 注入方法不必由您调用。实例化您的控制器的对象管理器将自行完成。
    【解决方案3】:

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

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

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

    recordTypeColumnName的值有两种设置方式:

    方法一:

    在 ctrl 数组中的 TCA 集合类型中。

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

    方法二:

    在 TypoScript 常量.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}
              }
            }
          }
        }
      }
    

    【讨论】:

      【解决方案4】:

      这里有几点需要检查:

      1. 检查 fe_users 中是否有 pid 5 存储用户。

      2.检查扩展名typoscript是否添加到template

      3.进入安装工具并按clear cache button

      4.在那里,在Controller中,您不使用CommunityManagerRepository,而是使用extbase中的FrontendUserRepository,如果您使用CommunityManagerRepository,则可以通过第一步和第二步,因为有您将respectStorage 设置为false

      【讨论】:

      • 但是你的repository被加载了,只有数据没有返回,是吗?
      • 请问,怎么查?已加载的存储库
      • \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($this->communityManagerRepository) this in Controller
      • 谢谢。我的存储库没有加载,当我调用你发给我的函数时,答案是Extbase Variable Dump: NULL
      • 从安装工具中清除缓存并删除文件夹typo3temp/autoload。然后重新加载页面,加载页面后进入typo3temp/autoload/autoload_classmap.php 并通过CommunityManagerRepository 搜索。如果您找不到该类,则可能是命名空间问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      相关资源
      最近更新 更多