コアファイルのオーバーライド方法について

2021年5月27日 at 15:58

コアファイルのオーバーライドを行いたいのですが、エラーになってしまうので
どこが間違っているのかご教示いただければ幸いです。

作業はこちらの記事を参考にして行ってみました。
https://concrete5-japan.org/help/5-7/recipes/override-almost-any-core-file-in-5-7/

オーバーライドしたいファイル:
/concrete/src/Form/Service/Widget/DateTime.php

行った作業:
1)/concrete/src/Form/Service/Widget/DateTime.php を

/Application/src/Form/Service/Widget へコピーしてnamespaceを以下に変更

namespace Application\Src\Form\Service\Widget;


2)/concrete/config/app.php の中の

'core_form' => '\Concrete\Core\Form\FormServiceProvider', 

を確認

3) /application/config/app.php を開いて



return [
'providers' => array(
'core_form' => '\Application\Src\Form\CustomFormServiceProvider'
)
];

とします。

4)/concrete/src/Form/FormServiceProvider.php を

/application/src/Form/ へコピーしてファイル名をCustomFormServiceProvider.php とします。

5)ファイルの中身を以下に変更



namespace Application\Src\Form;

class CustomFormServiceProvider extends \Concrete\Core\Form\FormServiceProvider
{
public function register()
{
$singletons = [
'helper/form' => '\Concrete\Core\Form\Service\Form',
'helper/form/attribute' => '\Concrete\Core\Form\Service\Widget\Attribute',
'helper/form/color' => '\Concrete\Core\Form\Service\Widget\Color',
'helper/form/font' => '\Concrete\Core\Form\Service\Widget\Typography',
'helper/form/typography' => '\Concrete\Core\Form\Service\Widget\Typography',
'helper/form/date_time' => '\Application\Src\Form\Service\Widget\DateTime',
'helper/form/page_selector' => '\Concrete\Core\Form\Service\Widget\PageSelector',
'helper/form/rating' => '\Concrete\Core\Form\Service\Widget\Rating',
'helper/form/user_selector' => '\Concrete\Core\Form\Service\Widget\UserSelector',
'helper/form/group_selector' => '\Concrete\Core\Form\Service\Widget\GroupSelector',
'form/express/entry_selector' => '\Concrete\Core\Form\Service\Widget\ExpressEntrySelector',

];

foreach ($singletons as $key => $value) {
$this->app->singleton($key, $value);
}

$this->app->singleton(ControlRegistry::class);

$this->app->bind(DestinationPicker\DestinationPicker::class, function (Application $app) {
return $app->build(DestinationPicker\DestinationPicker::class)
->registerPickers([
'none' => $app->make(DestinationPicker\NoDestinationPicker::class),
'page' => $app->make(DestinationPicker\PagePicker::class),
'file' => $app->make(DestinationPicker\FilePicker::class),
'external_url' => $app->make(DestinationPicker\ExternalUrlPicker::class),
'email' => $app->make(DestinationPicker\EmailPicker::class),
])
;
});
}
}


この作業ですべてのページで以下のエラーとなってしまいます。

Fatal error: Uncaught Error: Class '\Application\Src\Form\CustomFormServiceProvider' not found in /home/****/****/public-html/***/concrete/src/Foundation/Service/ProviderList.php:37 Stack trace: #0 /home/****/****/public-html/***/concrete/src/Foundation/Service/ProviderList.php(25): Concrete\Core\Foundation\Service\ProviderList->createInstance('\\Application\\Sr...') #1 /home/****/****/public-html/***/concrete/src/Foundation/Service/ProviderList.php(48): Concrete\Core\Foundation\Service\ProviderList->registerProvider('\\Application\\Sr...') #2 /home/****/****/public-html/***/concrete/src/Foundation/Runtime/Boot/DefaultBooter.php(320): Concrete\Core\Foundation\Service\ProviderList->registerProviders(Array) #3 /home/****/****/public-html/***/concrete/src/Foundation/Runtime/Boot/DefaultBooter.php(104): Concrete\Core\Foundation\Runtime\Boot\DefaultBooter->initializeServiceProviders(Object(Concrete\Core\Application\Application), in /home/****/****/public-html/***/concrete/src/Foundation/Service/ProviderList.php on line 37


何卒よろしくお願いいたします。

# concrete5 Version
Core Version - 8.5.5
Version Installed - 8.5.5
Database Version - 20201116182100

# Database Information
Version: 5.7.31
SQL Mode:

# concrete5 Packages
None

タグ:

Re: コアファイルのオーバーライド方法について

2021年5月27日 at 16:05
バージョン8から application ディレクトリにカスタムコードを追加する方法が変わりました。詳細は公式ドキュメントをご参照ください(未翻訳)

Creating Custom Code in the Application Directory
http://documentation.concrete5.org/developers/framework/extending-concrete5-with-custom-code/creating-custom-code-in-the-application-directory
 

Re: コアファイルのオーバーライド方法について

2021年5月27日 at 16:13
情報ありがとうございます!
確認いたします!
 

Re: コアファイルのオーバーライド方法について

2021年5月29日 at 17:32
お世話になっております。
395回週刊concrete5でもご回答いただきありがとうございました。

以下、2ファイルについて試してみましたが、
「Psr4ClassLoader が見つからない」というエラーになってしまいます。
何か設定が足りないでしょうか?
追加で情報あればご教示ください。よろしくお願いいたします。

▼Application/src/Form/Service/Widget/DateTime.php

namespace Application\Form\Service\Widget;

class DateTime
{

}


▼Application/bootstrap/autoload.php


defined('C5_EXECUTE') or die('Access Denied.');

/*
* ----------------------------------------------------------------------------
* Load all composer autoload items.
* ----------------------------------------------------------------------------
*/

$classLoader = new \Symfony\Component\ClassLoader\Psr4ClassLoader();
$classLoader->addPrefix('Application\\Form\\Service\\Widget', DIR_APPLICATION . '/' . DIRNAME_CLASSES . '/Form/Service/Widget');
$classLoader->register();



▼結果


Fatal error: Uncaught Error: Class 'Symfony\Component\ClassLoader\Psr4ClassLoader' not found in /home/****/****/public-html/***/application/bootstrap/autoload.php:13 Stack trace: #0
/home/****/****/public-html/***/concrete/bootstrap/autoload.php(10): include() #1
/home/****/****/public-html/***/concrete/dispatcher.php(29): require('/home/devbean/b...') #2
/home/****/****/public-html/***/index.php(3): require('/home/devbean/b...') #3 {main} thrown in
/home/****/****/public-html/***/application/bootstrap/autoload.php on line 13