How to add a field which is an array of different models - typo3

We defined in TYPO3 9.5 this field in a model:
/**
* #var \TYPO3\CMS\Extbase\Persistence\ObjectStorage<\GeorgRinger\News\Domain\Model\News>
* #TYPO3\CMS\Extbase\Annotation\ORM\Lazy
*/
protected $txIctivigoNoticesFrom;
/**
* Get notices from
*
* #return \GeorgRinger\News\Domain\Model\News[]
*/
public function getTxIctivigoNoticesFrom()
{
return $this->txIctivigoNoticesFrom;
}
/**
* Set notices from
*
* #param \GeorgRinger\News\Domain\Model\News[] $txIctivigoNoticesFrom
*/
public function setTxIctivigoNoticesFrom($txIctivigoNoticesFrom)
{
$this->txIctivigoNoticesFrom = $txIctivigoNoticesFrom;
}
But now we want to allow this is an array of not only news records, but pages and sys_file_metadata records as well. How could we achieve that?
We tried to instantiate an abstract entity between <>, but it's not possible.
TCA field is defined properly as a group type, and it saves relations to these three tables.

There is no ready-to-use functionality in extbase to resolve such mixed references into objects. In the database field, the content is a comma separated list of identifiers, which are of the form TABLENAME_UID, like tt_content_1670,tt_content_1672,pages_123. So your only choice would be to receive those values as string(s) and then load the objects yourself.
With this solution, keep in mind, that there are no default extbase models for the core elements like tt_content, page and so on. So you will either have to use something like https://github.com/georgringer/news/blob/master/Classes/Domain/Model/TtContent.php and https://github.com/georgringer/news/blob/master/Classes/Domain/Repository/TtContentRepository.php and/or write the corresponding models and repositories yourself!
I you don't need extbase objects, but just the plain database data for some reason, you can also load this directly from the database.

Related

Workflow symfony 3.2 how search by place

I have set up a workflow state machine and the data is stored in json_array. I based myself on this tutorial.
/**
* This property is used by the marking store
* #ORM\Column(type="json_array", nullable=true)
*/
public $currentPlace;
Now I want to search for all open tickets. How to do? Storing with something other than a json_array?

symfony2 add multiple selected languages to database through doctrine

I am using Symfony 2.5 and one of my entity has to save multiple languages saved against the entity while create/update.
I saw a list of languages available in Symfony core[Resources] and a field type language also presents to generate a language field for form.
So, How do I map one-to-many relationship with the core list of languages from my Entity in Doctrine? I can't, because I don't have any existing entity to serve a list of languages to be added to target-entity in ORM mapping.
Or Do I have to create a separate custom language entity for the same?
If you dont want to create annoter entity for that you can use "array" type to stock languages ids
/**
* #Column(type="array", nullable=true)
* #var array
*/
private $languages;
array: Type that maps a SQL CLOB to a PHP object using serialize()
and unserialize() - See more at:
http://doctrine-orm.readthedocs.org/en/latest/reference/basic-mapping.html

How to use two collections to authenticate zfcuser?

I use Doctrine and MongoDB ODM modules at my zf2 application. ZfcUser is used for authorization.
Is there a way to use two collections, say users and clients to authenticate via zfcuser+doctrine? I am curious, if there is a way to combine two mongo collections into one to use combined for authentication?
You do not need to merge the users into one collection as you can have multiple 'authentication adapters' (see ZfcUser\Authentication\Adapter\Db for an example)
These are defined within global config file: zfcuser.global.php
Each of my adapters are run in order of priority until one returns a successful authentication result.
For example; I have the following configuration for Users and Candidates entities.
/**
* Authentication Adapters
*
* Specify the adapters that will be used to try and authenticate the user
*
* Default value: array containing 'ZfcUser\Authentication\Adapter\Db' with priority 100
* Accepted values: array containing services that implement 'ZfcUser\Authentication\Adapter\ChainableAdapter'
*/
'auth_adapters' => array(
50 => 'JobboardCandidate\Authentication\Adapter\CandidateDatabaseAdapter',
75 => 'JobboardUser\Authentication\Adapter\UserDatabaseAdapter',
//100 => 'ZfcUser\Authentication\Adapter\Db', [this is the default]
),
As I understand from your question you want to get one collection with two different document types so that you can use this collection for authentication.
If you use doctrine Inheritance mapping you can have two different classes and resolve them in one collection.
In this case your Client class would extend your User class. If you would use the findAll method in your UserRepository you would get both the clients and the users in one Collection
This will help you achieve what you want:
<?php
namespace MyProject\Model;
/**
* #Document
* #InheritanceType("SINGLE_COLLECTION")
* #DiscriminatorField(name="discriminator", type="string")
* #DiscriminatorMap({"user" = "User", "client" = "Client"})
*/
class User
{
// ...
}
/**
* #Document
*/
class Client extends User
{
// ...
}
And then
$userRepository->findAll();
Read more on inheritance mapping here in the Doctrine documentation

TYPO3 Extbase bidirectional 1:n relation

Let's say we have a 1:n relation between an Author and Book model. Modeling the relation using the Extension Builder, the necessary code to get Book's for an author is provided.
But what about the inverse? How do I get the Author for a given Book class?
I assume you have created the following domain model with the Extension Builder.
When you create a 1:n relation between Author and Book, the resulting database table for Book will contain a field which holds the UID of the author. To make use of this field, you have to add a getter in your book domain model to return the corresponding author for the given book.
Add the following to your domain model for book:
/**
* Returns the author
*
* #var \TYPO3\YourExtension\Domain\Model\Author
*/
protected $author;
/**
* #return \TYPO3\YourExtension\Domain\Model\Author
*/
public function getAuthor() {
return $this->author;
}
Now you can use the new getter in Fluid to return the author of a given book with {book.author}
You can add n:1 relation to Book model, then Extension builder will create getter and setter automatically..

Symfony2 forms embed mongodb document into sql entity

I need little help :). Here is the situation. I am using symfony2 + FOSUserBundle, I made my forms custom, so far so good. I have User registration with user information in the custom registration form (like first name, last name, birth date etc). Now I decided that it will be more practical to make the user info to be stored in mongodb as document (as I probably will add more information to users later). I built the user info form, and successfully embedded it to the user form. Now the problem is that I cannot set Document object inside Entity object - symfony tells me that the object must be an Entity.
/**
* Acme\UserBundle\Entity\User
*
* #ORM\Table(name="user")
* #ORM\Entity
*/
class User extends BaseUser
{
/**
* #Assert\Type(type="Acme\UserBundle\Document\UserInfo")
*/
protected $userinfo;
I want to ask, what is the proper way to do this ? Sure I can get the needed information form the request as an array and fill in the user info object ... but it looks ugly and wrong :) so how it must be done ? Thanks.
I assume you extends the entity class
FOS\UserBundle\Entity\User
there is a document class provided by the bundle
FOS\UserBundle\Document\User
You could extends this one