CakeDC / Enum

Enumeration list for CakePHP
MIT License
27 stars 17 forks source link

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

Open pmoraes opened 7 years ago

pmoraes commented 7 years ago

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.

birdy247 commented 7 years ago

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

ADmad commented 7 years ago

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

birdy247 commented 7 years ago

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...?

ADmad commented 7 years ago

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

birdy247 commented 7 years ago

@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

pmoraes commented 6 years ago

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.

birdy247 commented 6 years ago

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?