Enum icon indicating copy to clipboard operation
Enum copied to clipboard

Create a way to reuse the const in some query conditions.

Open pmoraes opened this issue 8 years ago • 7 comments

Currently we don't have this feature implemented. For now we need to take the list and use array_search to find the value to add in the conditions.

TODO: Create a way to reuse the const to create the query conditions.

pmoraes avatar Sep 05 '17 02:09 pmoraes

I am using the const strategy and have the following config set:

const OCCASION_TYPE_MASS_PARTICIPATION_EVENT = "mass_participation_event";
const OCCASION_TYPE_TRAINING_SESSION = "training_session";
const OCCASION_TYPE_SOCIAL = "social";

    $this->addBehavior('CakeDC/Enum.Enum', ['lists' => [
        'internal_type' => [
            'strategy' => 'const',
            'prefix' => 'OCCASION_TYPE',
            'className' => 'App\\Model\\Entity\\OccasionType',
            'applicationRules' => false
        ]
    ]]);

When I save an entity by allowing a user to select from a select list using the helper

$this->set('priorities', $this->Articles->enum('priority'));

this plugin would save MASS_PARTICIPATION_EVENT. This is ok, but it then makes it very hard to achieve the following:

1/ Query all records with a internal_type of MASS_PARTICIPATION_EVENT 2/ Manually assign the entities property with one of the constants

Previously I would do something like OccasionTypes::OCCASION_TYPE_MASS_PARTICIPATION_EVENT, but this will not work (as this would reference "mass_participation_event" (what I have previously been saving) .

I would still like to use OccasionTypes::OCCASION_TYPE_MASS_PARTICIPATION_EVENT, but maybe if this plugin could provide a method which returns the actual value it will use.

I hope this use case is clear

birdy247 avatar Sep 15 '17 08:09 birdy247

Use 'lowercase' => true in config and it will save mass_participation_event in db instead of MASS_PARTICIPATION_EVENT. :slightly_smiling_face:

ADmad avatar Sep 15 '17 19:09 ADmad

Thanks @ADmad this works to some extent. I still have to disable the applicationRules to get it to save though.

Is the idea that the value of the constant should be the label to display in select lists etc...?

birdy247 avatar Sep 16 '17 09:09 birdy247

It should work with application rules enabled too. Do some digging and find out what's the problem.

ADmad avatar Sep 16 '17 11:09 ADmad

@ADmad I did some testing. I was saving multiple entities in a single transaction. Some of these had a a "null" for the enum value. I can see you already made a PR to allowEmpty.

That did the trick.

I still don't feel I am using the const strategy correctly though.

OCCASION_TYPE_MASS_PARTICIPATION_EVENT = "mass_participation_event"

Presumably the "mass_participation_event" is just a display label that I am now effectlivley using as the const value (when using this in a find query or manually setting the value of internal_type in any beforeSave etc...

Thanks

birdy247 avatar Sep 17 '17 13:09 birdy247

Hey @birdy247, I'll be starting to work on it today.

@ADmad we have this problem, lowercase and and disable the applicationRules won't solve that problem.

For example if you a const:

const OCCASION_TYPE_MASS_PARTICIPATION_EVENT = "Just a test";

and we are using lowercase, I'll save "mass_participation_event" and we won't able to find it in the database because we have other text.

pmoraes avatar Oct 31 '17 23:10 pmoraes

Hi @pmoraes Is there a branch for this fix? I am happy to help with the development.

Presumably, we just need a simple "lookup" function whereby you pass the constant and it returns the value that would normally be saved to the DB/added as the value in select lists?

birdy247 avatar Jan 31 '18 08:01 birdy247