typo3 APCu error - typo3

in my typo3 project we use a company internal web space. Currently an error message appears as shown in the picture.
On this APCu cannot be installed in the PHP configuration due to internal defaults.
How can I modify my typo3 instance so that I can do without APCu?

Go to the Install Tool and checkout the Configuration Presets. "Extbase object cache" is one of them. Change it to the database option.

I found the solution by myself.
In LocalConfiguration.php I searched for APCu and changed 'extbase_object' to the following:
'SYS' => [
'caching' => [
'cacheConfigurations' => [
'extbase_object' => [
'backend' => 'TYPO3\\CMS\\Core\\Cache\\Backend\\NullBackend',
'frontend' => 'TYPO3\\CMS\\Core\\Cache\\Frontend\\VariableFrontend',
'groups' => [
'system',
],
'options' => [
'defaultLifetime' => 0,
],
],
],
],

Related

PHP Warning in Typo3DatabaseBackend line 158 after updating DDEV to 1.19

After updating DDEV to 1.19 I get following error after backend login in TYPO3 11.5.8:
PHP Warning: gzuncompress(): need dictionary in
/var/www/html/public/typo3/sysext/core/Classes/Cache/Backend/Typo3DatabaseBackend.php
line 158
I already tried a lot of things:
I have tried all officially PHP versions which are possible with DDEV.
I have downgraded doctrine/dbal 2.13.8, 2.13.7, 2.13.6, ...
I have downgraded MariaDB 10.3 to 10.2
Nothing works. So it needs a deeper view of the problem:
In Typo3DatabaseBackend.php at line 158 I have added
$tmp = gzuncompress($data);
With help of xdebug I can see that uncompress works without any problems. So, IMO it can't be a zlib problem.
As next step I have converted the compressed $data with bin2hex($data) into $tmp and in my database I have tried to HEX the value, too:
SELECT uid, CONVERT(content USING utf8) FROM cache_rootline WHERE uid = 1;
Interesting point:
Before: 789c4d904172c3200
In DB: 0x783f4d3f41723f200
Select: 783f4d3f41723f200
Nearly each 2nd byte is correct, but the other bytes are totally wrong.
I have exported my MariaDB data and switched to MySQL 8.0 and imported the data again. Because of some utf8mb4_unicode_ci incompatibilities I have recreated all cache tables with help of Installtool of TYPO3.
After login to TYPO3 backend I got following error:
General error: 3988 Conversion from collation utf8_general_ci into utf8mb4_unicode_ci impossible
I have searched full TYPO3 project, but I can't find utf8_general_ci anywhere.
Do you have any idea, what could be wrong?
Thank you for your help.
Stefan
On new DDEV project four LocalConfiguration looks something like that:
'DB' => [
'Connections' => [
'Default' => [
'charset' => 'utf8',
'driver' => 'mysqli',
],
],
],
and DDEV creates following to your AdditionalConfiguration.php
'DB' => [
'Connections' => [
'Default' => [
'dbname' => 'db',
'driver' => 'pdo_mysql',
'host' => 'db',
'password' => 'db',
'port' => '3306',
'user' => 'db',
],
],
],
Maybe you have added following to your configuration to create new tables with a specific collation:
'DB' => [
'Connections' => [
'Default' => [
...
'tableoptions' => [
'charset' => 'utf8mb4',
'collate' => 'utf8mb4_general_ci',
],
],
],
],
Do you see the problem? The charset option of LocalConfiguration.php was NOT overwritten in your AdditionalConfiguration. So, you have a charset miss-match in your configuration. Please keep them in sync.
Either set collation back to utf8_unicode_ci or add:
'charset' => 'utf8mb4',
in AdditionalConfiguration.php
Have fun with TYPO3
Stefan
For me the easiest way was to replace the pdo_mysql driver with mysqli.
Because I'm only using MariaDB and my database was utf8_general_ci encoded, this was the easiest fix/help.

TYPO3 V10 - EXT:news custom type and persistence mapping

i'm trying to upgrade a extension for TYPO3 10.4 which add a custom type to tx_news (Doc).
I did the migration based on this example: Breaking: #87623
Classes/Controller/NewsController.php
return [
\Xyz\Extendnews\Domain\Model\Team::class => [
'tableName' => 'tx_news_domain_model_news',
'recordType' => 3,
],
But wenn I debug the entry in the Fluid-Template the default model is still used.
Did I miss something or does someone have a working example.
Thanks for any help.
Update:
I want to create a new type, explained in Georg RingerĀ“s manual
I have created a small extension, everything works fine with TYPO3 9.5, but not with TYPO3 10.4.
DEMO EXT
With TYPO3 10.4 the prototype is not MxnTeam\Domain\Model\Team
Update 29.06.2020:
tobenschmidt from the TYPO3 Slack channel ( post ) help me out.
return [
\Mexan\MxnTeam\Domain\Model\Team::class => [
'tableName' => 'tx_news_domain_model_news',
'recordType' => \Mexan\MxnTeam\Domain\Model\Team::class,
],
\Mexan\MxnTeam\Domain\Model\Client::class => [
'tableName' => 'tx_news_domain_model_news',
'recordType' => \Mexan\MxnTeam\Domain\Model\Client::class,
],
\GeorgRinger\News\Domain\Model\News::class => [
'tableName' => 'tx_news_domain_model_news',
//'recordType' => 0,
'subclasses' => [
\Mexan\MxnTeam\Domain\Model\Team::class,
\Mexan\MxnTeam\Domain\Model\Client::class,
]
],
];
This works fine, even with 2 custom types.
but unfortunately the default news are no longer loaded
but if I add recordType => 0, then only normal news and my custom types are visible, but not the type 1 and 2 (Internal and external)
I updated the extension:
mxn_team
is there a way to prevent this?
This works for me...
Implement your news type as described in https://docs.typo3.org/p/georgringer/news/8.5/en-us/DeveloperManual/ExtendNews/AddCustomType/Index.html
but instead of the described TypoScript add following file to your extension:
ext_name/Configuration/Extbase/Persistence/Classes.php
<?php
return [
\GeorgRinger\News\Domain\Model\News::class => [
'subclasses' => [
3 => \Vendor\ExtName\Domain\Model\MyCustomNewsType::class
]
],
Vendor\ExtName\Domain\Model\MyCustomNewsType::class => [
'tableName' => 'tx_news_domain_model_news',
'recordType' => 3,
],
];
The way using TypoScript (config.tx_extbase.persistence.classes) was removed in TYPO3 v10
You write "Classes/Controller/NewsController.php" but you have to create a file here
extendnews/Configuration/Extbase/Persistence/Classes.php
and put your code in there. After that, do not forget to clear all cache.
Complete file "Classes.php" should look like
<?php
declare(strict_types = 1);
return [
\Xyz\Extendnews\Domain\Model\Team::class => [
'tableName' => 'tx_news_domain_model_news',
'recordType' => \Xyz\Extendnews\Domain\Model\Team::class,
],
To use the new model follow Georg RingerĀ“s manual
manual on typo3.org
And a working example here

Backend module: Link to another backend module in TYPO3 9

Let's say I have to different extensions with two different backend modules. Registered like:
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerModule(
'Vendor.ext',
'ext',
'controller1',
'',
[
'Controller1' => 'any1',
],
[
'access' => 'user,group',
'icon' => '...',
'labels' => '...',
]
);
And in the second extension also like:
\TYPO3\CMS\Extbase\Utility\ExtensionUtility::registerModule(
'Vendor.ext2',
'ext2',
'controller2',
'',
[
'Controller2' => 'any2',
],
[
'access' => 'user,group',
'icon' => '...',
'labels' => '...',
]
);
How can I build a link from ext1 in the module to ext2?
What did I tried before in FLUID was:
<f:link.action action="any2" controller="Controller2" extensionName="ext">click me</f:link.action>
or
<f:be.link route="/ext/Ext2Controller2/">click me</f:be.link> (by copying the route that's available via GET parameter)
No luck yet - any ideas? Or how to get the correct route if be.link would be the correct function?
Finally I found the reason.
It's simply possible to use the existing viewhelper like <f:be.link route="lux_LuxLeads">click me</f:be.link>
But the route must be the key and not the path. The key can be picked in the backend module configuration and backendroutes

How to add custom wizards in TYPO3 9 TCA?

Related to How to add custom wizards in typo3 7 TCA? how can costum wizards in TYPO3 9 be implemented? I've added my entry to the Routes.php
return [
'tx_csseo_preview' => [
'path' => '/wizard/tx_csseo/preview',
'target' => \Clickstorm\CsSeo\UserFunc\PreviewWizard::class . '::render'
],
'tx_csseo_permalink' => [
'path' => '/wizard/tx_csseo/permalink',
'target' => \Clickstorm\CsSeo\UserFunc\PermalinkWizard::class . '::render'
]
];
How can I add them now to my TCA field?
'tx_csseo_title' => [
'label' => 'LLL:EXT:cs_seo/Resources/Private/Language/locallang_db.xlf:pages.tx_csseo_title',
'exclude' => 1,
'config' => [
'type' => 'input',
'max' => $extConf['maxTitle'],
'eval' => 'trim',
'fieldWizard' => [
'tx_csseo_preview' => [
'disabled' => false,
]
]
]
],
This does not work. What do I miss? Thanks in advance.
Related to your kind of wizard the registration-process is different and extensive explained here. You can leave the entries in Routes.php away (perhaps even the whole file if nothing else is inside).
Registration is done in ext_localconf.php:
$GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['nodeRegistry'][1485351217] = [
'nodeName' => 'importDataControl',
'priority' => 30,
'class' => \T3G\Something\FormEngine\FieldControl\ImportDataControl::class
];
Then reference the new wizard in TCA:
'somefield' => [
'label' => $langFile . ':pages.somefield',
'config' => [
'type' => 'input',
'eval' => 'int, unique',
'fieldControl' => [
'importControl' => [
'renderType' => 'importDataControl'
]
]
]
],
Then finally the class with the "magic"
declare(strict_types=1);
namespace T3G\Something\FormEngine\FieldControl;
use TYPO3\CMS\Backend\Form\AbstractNode;
class ImportDataControl extends AbstractNode
{
public function render()
{
$result = [
'iconIdentifier' => 'import-data',
'title' => $GLOBALS['LANG']->sL('LLL:EXT:something/Resources/Private/Language/locallang_db.xlf:pages.importData'),
'linkAttributes' => [
'class' => 'importData ',
'data-id' => $this->data['databaseRow']['somefield']
],
'requireJsModules' => ['TYPO3/CMS/Something/ImportData'],
];
return $result;
}
}
In the linked example there is still an Ajax Route with corresponding files, including a special defined route, but that's not required to get the basic wizard shown.
Concerning the registration in ext_localconf.php there is above the number 1485351217 as array-key shown. For an own registered node just calculate once the current time as unix-timestamp and enter that instead. So it's unique and can't be mistaken with other definitions of any registered nodes.
In contrast to the linked example I used slightly different descriptions, so I call the process in ext_localconf.php registering, and the inclusion in TCA referencing. Perhaps this small difference makes it a bit more clear.
Icons
Concerning Icons there is still a difference to earlier TYPO3 versions, they have to be registered now too and in TCA they are only referenced too by the registered name. Here in the TCA-file is no icon referenced but the class below makes usage of it. Here is an example how an icon has to be registered in ext_tables.php:
$systemIconRegistry = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Core\Imaging\IconRegistry::class);
$systemIconRegistry->registerIcon(
'imagemapwizard_link_edit',
\TYPO3\CMS\Core\Imaging\IconProvider\BitmapIconProvider::class,
[
'source' => 'EXT:imagemap_wizard/Resources/Public/Icons/link_edit.png'
]
);
The new icon registry is implemented starting with TYPO3 version 7.5
Don't forget the configuration in YourExtension/Configuration/Backend/AjaxRoutes.php. See the documentation

CGI Application Authentication using multiple drivers

I have been trying to authenticate my CGI application through 2 drivers, one that uses username/password stored in the database and other using ldap active directory.
following is the code
$self->authen->config(
DRIVER => [ 'DBI',
DBH => $self->dbh,
TABLE => 'user',
CONSTRAINTS => {
'user.username' => '__CREDENTIAL_1__',
'MD5:user.password' => '__CREDENTIAL_2__'
},
],
DRIVER => [ 'Authen::Simple::LDAP',
host => 'ldapad.company.com',
basedn => 'OU=XXX,OU=XX,DC=XXX,DC=XXX',
binddn => 'CN=usename,OU=Users,OU=XXX,OU=AD,DC=XXX,DC=xxx',
bindpw => 'secret',
filter => '(cn=%s)',
],
CREDENTIALS => [ 'authen_username', 'authen_password' ],
STORE => 'Session',
LOGOUT_RUNMODE => 'logout',
LOGIN_RUNMODE => 'login',
POST_LOGIN_RUNMODE => 'okay',
RENDER_LOGIN => \&my_login_form,
);
How do I make the application check the other driver is not authenticated with one.
Right now, as expected, its the driver listed at the bottom that works and they both do, depending on which was assigned last.
I'm assuming you're using CGI::Application::Plugin::Authentication.
I think there's a small problem in your code, that justifies the fact that only the last of the two works.
Your code is like:
$self->authen->config(
DRIVER => [ 'DBI', ... ],
DRIVER => [ 'Authen::Simple::LDAP', ... ],
CREDENTIALS => [ 'authen_username', 'authen_password' ],
STORE => 'Session',
# ...
);
but $self->authen->config() takes a hash. For example, take a look at this example from the C::A::P::Authentication distribution.
Being a hash, that means that the last DRIVER entry will overwrite the previous ones.
I believe the fix is very simple:
$self->authen->config(
DRIVER => [
[ 'DBI', ... ],
[ 'Authen::Simple::LDAP', ... ],
],
CREDENTIALS => [ 'authen_username', 'authen_password' ],
STORE => 'Session',
# ...
);
You can find an example of this in the module documentation:
http://search.cpan.org/~silasmonk/CGI-Application-Plugin-Authentication/lib/CGI/Application/Plugin/Authentication.pm#config
How do I make the application check the other driver is not authenticated with one.
It sounds to me like you want to check if more than one authentication method works, rather than the last one that works. Could you set up 3 different $self->authen->config() and try to login 3 different times? You use a hash to track the methods that work.