2017-11-30 13 views
3

は、だから、私は(Silverstripe 4を使用)、標準gridfield私が直接管理し、このオブジェクトを編集するためのリンクを生成できるようにしたいと思い自動生成SilverStripeのadminリンク

を経由してモデル管理者を経由して管理するのDataObjectを持っています。私は手動でModelAdmin URLを入力するとこれを行うことができますが、これは非常に動的には見えません(将来、管理URLを変更した場合、その方法は壊れます)。

私は以下の実装しようとしている:

class MyObject extends DataObject 
{ 
    public function EditLink() 
    { 
     $classname = str_replace('\\', '-', $this->owner->ClassName); 
     $admin = OrderAdmin::singleton(); 
     $fields = $admin->getEditForm()->Fields(); 
     $grid = $fields 
      ->fieldByName($classsname); 

     return Controller::join_links(
      $grid->Link("item"), 
      $this->owner->ID, 
      "edit" 
     ); 
    } 
} 

をしかし、これは、このエラー&スタックトレースを出力:私は私は正しいレスポンスオブジェクトが渡されていないためであると仮定しています

[Emergency] Uncaught InvalidArgumentException: SilverStripe\ORM\DataObject is not a subclass of DataObject 

POST /as-plumbing-app-v2/admin/jobs/Job/EditForm/field/Job/item/1/ItemEditForm/ 

Line 147 in /home/morven/Projects/as-plumbing-app-v2/vendor/silverstripe/framework/src/ORM/DataObjectSchema.php 

Source 

138  { 
139   $class = ClassInfo::class_name($class); 
140   $current = $class; 
141   while ($next = get_parent_class($current)) { 
142    if ($next === DataObject::class) { 
143     return $current; 
144    } 
145    $current = $next; 
146   } 
147   throw new InvalidArgumentException("$class is not a subclass of DataObject"); 
148  } 
149 
150  /** 
151  * Get the base table 
152  * 
153  * @param string|object $class 
Trace 

SilverStripe\ORM\DataObjectSchema->baseDataClass(SilverStripe\ORM\DataObject) 
DataQuery.php:165 
SilverStripe\ORM\DataQuery->initialiseQuery() 
DataQuery.php:76 
SilverStripe\ORM\DataQuery->__construct(SilverStripe\ORM\DataObject) 
DataList.php:61 
SilverStripe\ORM\DataList->__construct(SilverStripe\ORM\DataObject) 
ReflectionClass->newInstanceArgs(Array) 
InjectionCreator.php:23 
SilverStripe\Core\Injector\InjectionCreator->create(SilverStripe\ORM\DataList, Array) 
Injector.php:585 
SilverStripe\Core\Injector\Injector->instantiate(Array, SilverStripe\ORM\DataList, prototype) 
Injector.php:988 
SilverStripe\Core\Injector\Injector->getNamedService(SilverStripe\ORM\DataList, , Array) 
Injector.php:941 
SilverStripe\Core\Injector\Injector->get(SilverStripe\ORM\DataList, , Array) 
Injector.php:1111 
SilverStripe\Core\Injector\Injector->createWithArgs(SilverStripe\ORM\DataList, Array) 
Injectable.php:30 
SilverStripe\View\ViewableData::create(SilverStripe\ORM\DataObject) 
SearchContext.php:160 
SilverStripe\ORM\Search\SearchContext->getQuery(Array, ,) 
SearchContext.php:210 
SilverStripe\ORM\Search\SearchContext->getResults(Array) 
ModelAdmin.php:347 
SilverStripe\Admin\ModelAdmin->getList() 
OrderAdmin.php:166 
SilverCommerce\OrdersAdmin\Admin\OrderAdmin->getList() 
ModelAdmin.php:184 
SilverStripe\Admin\ModelAdmin->getEditForm(,) 
OrderAdmin.php:88 
SilverCommerce\OrdersAdmin\Admin\OrderAdmin->getEditForm() 
Estimate.php:151 
SilverCommerce\OrdersAdmin\Model\Estimate->EditLink() 
JobDetailForm_ItemRequest.php:117 
App\Forms\GridField\JobDetailForm_ItemRequest->doViewInvoice(Array, SilverStripe\Forms\Form, SilverStripe\Control\HTTPRequest, SilverStripe\Forms\FormRequestHandler) 
FormRequestHandler.php:231 
SilverStripe\Forms\FormRequestHandler->httpSubmission(SilverStripe\Control\HTTPRequest) 
RequestHandler.php:320 
SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, httpSubmission) 
RequestHandler.php:201 
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest) 
RequestHandler.php:225 
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest) 
GridFieldDetailForm.php:118 
SilverStripe\Forms\GridField\GridFieldDetailForm->handleItem(SilverStripe\Forms\GridField\GridField, SilverStripe\Control\HTTPRequest) 
GridField.php:1019 
SilverStripe\Forms\GridField\GridField->handleRequest(SilverStripe\Control\HTTPRequest) 
RequestHandler.php:225 
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest) 
RequestHandler.php:225 
SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest) 
Controller.php:207 
SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest) 
LeftAndMain.php:750 
SilverStripe\Admin\LeftAndMain->handleRequest(SilverStripe\Control\HTTPRequest) 
AdminRootController.php:123 
SilverStripe\Admin\AdminRootController->handleRequest(SilverStripe\Control\HTTPRequest) 
Director.php:360 
SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest) 
VersionedHTTPMiddleware.php:40 
SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure) 
HTTPMiddlewareAware.php:62 
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest) 
AuthenticationMiddleware.php:61 
SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure) 
HTTPMiddlewareAware.php:62 
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest) 
CanonicalURLMiddleware.php:155 
SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure) 
HTTPMiddlewareAware.php:62 
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest) 
FlushMiddleware.php:26 
SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure) 
HTTPMiddlewareAware.php:62 
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest) 
RequestProcessor.php:66 
SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure) 
HTTPMiddlewareAware.php:62 
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest) 
SessionMiddleware.php:20 
SilverStripe\Control\Middleware\SessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure) 
HTTPMiddlewareAware.php:62 
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest) 
AllowedHostsMiddleware.php:60 
SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure) 
HTTPMiddlewareAware.php:62 
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest) 
TrustedProxyMiddleware.php:176 
SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure) 
HTTPMiddlewareAware.php:62 
SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest) 
HTTPMiddlewareAware.php:65 
SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure) 
Director.php:369 
SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest) 
HTTPApplication.php:48 
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest) 
call_user_func(Closure, SilverStripe\Control\HTTPRequest) 
HTTPApplication.php:66 
SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest) 
call_user_func(Closure, SilverStripe\Control\HTTPRequest) 
ErrorControlChainMiddleware.php:56 
SilverStripe\Core\Startup\ErrorControlChainMiddleware->SilverStripe\Core\Startup\{closure}(SilverStripe\Core\Startup\ErrorControlChain) 
call_user_func(Closure, SilverStripe\Core\Startup\ErrorControlChain) 
ErrorControlChain.php:236 
SilverStripe\Core\Startup\ErrorControlChain->step() 
ErrorControlChain.php:226 
SilverStripe\Core\Startup\ErrorControlChain->execute() 
ErrorControlChainMiddleware.php:69 
SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure) 
HTTPMiddlewareAware.php:62 
SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest) 
HTTPMiddlewareAware.php:65 
SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure) 
HTTPApplication.php:67 
SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure,) 
HTTPApplication.php:49 
SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest) 
index.php:17 

をModelAdminを作成した時点で、どのModelClassを使用するのかは不明です。

誰もこれを実装するのに好ましい方法について考えていますか?

答えて

3

これは、(3.6と4.0でテスト)SilverStripe 3と4のために働く必要があります

class MyObject extends DataObject 
{ 
    public function EditLink() 
    { 
     $classname = str_replace('\\', '-', singleton($this->owner->ClassName)->i18n_plural_name()); 
     $admin = OrderAdmin::singleton(); 
     $fields = $admin->getEditForm()->Fields(); 
     $grid = $fields->dataFieldByName($classname); 

     return Controller::join_links(
      $grid->Link("item"), 
      $this->owner->ID, 
      "edit" 
     ); 
    } 
} 

あなたの元に行われた変更は

  • が含ま$classnameのタイプミスを修正するのClassName
  • の複数のバージョンを使用してグリッドを要求するとき->fieldByName()ではなく->dataFieldByName()を使用して

注:SilverStripe 4.0では適切な名前空間が使用されているため、DataObjectに正しい名前空間を使用していることも確認してください。

など。

namespace MySite; 

use SilverStripe\ORM\DataObject; 

class MyObject extends DataObject 
{ 
... 
+0

こんにちはブレント、コードのおかげで、残念なことにこれは同じエラーを生成します:-s。 私は次のリンクを追加しようとしています(それが役立つ場合):https://github.com/silvercommerce/orders-admin/blob/1.0/src/model/Estimate.php – PsychoMo

+0

申し訳ありません、 Brettの代わりにBrentをタイプしました。 – PsychoMo

+0

@PsychoMo問題は、あなたのOrderAdminクラスの 'getList'関数のオーバーロードに関連していると思います[https://github.com/silvercommerce/orders-admin/blob/1.0/src/admin/OrderAdmin.php#L166 ](https://github.com/silvercommerce/orders-admin/blob/1.0/src/admin/OrderAdmin.php#L166) クラスをオーバーロードするのではなく、拡張機能を使用して追加のフィルタを適用できますか? –

関連する問題