Log message #4263633

# At Username Text
# May 19th 2021, 16:42 khalil Now in the view, I can have a simple helper that convert the product price (USD) to your currency (saved in cookie) - when the vendor wants to add a product, I convert the price they enter (in their current currency) to USD and save it in the db ( I should do that in a beforeSave hook on the model level)
# May 19th 2021, 16:41 slackebot I use that, if not, I detect your ip from a local library, detect your location, and based on your location I know your currency, this only happens on first visit cause after that I save it in a cookie,
# May 19th 2021, 16:41 khalil @me1367 I think you got me wrong, each product, needs a price to be saved in the db in the end, the base price in the db is USD, the exchange happen in the views, and when adding / editing products, meaning, the price in the db is $100, when you open the site, I detect if you're logged in, if yes, I get your currency (saved in the user profile) if you're not logged in, I check if you have a cookie "currency" saved, if yes, then
# May 19th 2021, 16:39 neon1024 There surely must be an easier way right?
# May 19th 2021, 16:38 khalil That's not how it's built, the exchange rates are in php file on the server that gets updated automatically every 24 hours, the exchange rates base currency is USD, so that part is pretty straight forward
# May 19th 2021, 16:31 neon1024 Ooh, `withAttribute()` late afternoon blindness 8)
# May 19th 2021, 16:30 neon1024 Or is another instance where I need to actually instantiate a bunch of stuff for the test?
# May 19th 2021, 16:29 neon1024 How do I set an attribute on a ServerRequest instance? From what I can see in the code it’s literally a class property, but my unit test is telling me it’s getting a NULL and expecting an instance of AuthorizationService
# May 19th 2021, 14:14 ndm no problem
# May 19th 2021, 14:13 neon1024 Signs are good, thanks again @ndm really appreciate the help and guidance with all this new Cake 4 stuff :thumbsup:
# May 19th 2021, 14:03 neon1024 I’ll try a middleware and see how I get on
# May 19th 2021, 14:03 neon1024 Attaching the behaviour using Model.initialize inside the Application.php works great, but again, I have no session there
# May 19th 2021, 14:02 ndm Well, that sounds all very theoretical to me right now, not sure what depends on what and when and.... :upside_down_face:
# May 19th 2021, 14:02 neon1024 Then, post Authorize, four tables stopped being filtered, and you nailed it. They’re all part of the auth finder :)
# May 19th 2021, 14:02 neon1024 Hence the global bind using Model.initialize :)
# May 19th 2021, 14:01 neon1024 Then the behaviour just amends the queries
# May 19th 2021, 14:01 neon1024 As if the user has the multi organisation permission, they can change to another organisation and I’ll update the session to track the data they can see
# May 19th 2021, 14:00 neon1024 I write the organisation to the session on login
# May 19th 2021, 13:59 ndm All events will bubble to the global event manager instance.
# May 19th 2021, 13:59 ndm Oh wait, you'd need to put it before authentication... but I guess you don't need to access to the identity for this?
# May 19th 2021, 13:58 neon1024 Although I am using the static EventManager::instance so should be global right?
# May 19th 2021, 13:58 neon1024 I’ll give it a go :thumbsup:
# May 19th 2021, 13:58 neon1024 Can the middleware observe a Model.initialize? :thinking_face:
# May 19th 2021, 13:57 ndm You might want to consider a custom middleware, you have access to the authentication result and the request object, thus the session.
# May 19th 2021, 13:56 neon1024 Now the Auth middleware is creating the instances without even calling the controller
# May 19th 2021, 13:56 neon1024 Binding on the Model.initialize worked great, as I had the session in the AppController, so could bind the behaviour and give it the config it needed
# May 19th 2021, 13:56 neon1024 This all stems from the fact the behaviour, which appends to the query, takes an organisation id from the session
# May 19th 2021, 13:55 neon1024 Or if I should re-bind the Behaivour to the existing instance in the 4 tables used in the Auth
# May 19th 2021, 13:55 neon1024 Now I’m wondering how I can either clear those instances after the Auth checks, so the AppController can pickup the Model.initialize
# May 19th 2021, 13:54 neon1024 You were right in the execution order, but I do not know how the TableRegistry is persisting instances
# May 19th 2021, 13:52 ndm Behaviors are not singleton-ish like tables, if that is what you are referring to, a new behavior instance is created for each table instance.
# May 19th 2021, 13:47 neon1024 `$table->behaviors()->get('FilterByOrganisation')->setConfig('organisation', $organisation->toArray());`
# May 19th 2021, 13:47 neon1024 I assumed i could update a behaviour on an instance in the registry, but doesn’t seem to work
# May 19th 2021, 13:46 neon1024 Is it more efficient to unload and reload a behaviour or flush the alias from the table registry?
# May 19th 2021, 13:32 me1367 Don't save it to a database like that. Instead, just grab the latest conversions and cache them for a while. Doing is while you save something (eg. a product) will likely cause inaccurate conversions in a market that always shifts. It could be that 1USD == 1EUR today. But maybe, tomorrow, 1USD == 1,05EUR (and that 5 cents does add up the higher the prices go).
# May 19th 2021, 13:24 khalil Yes i understand, but i need it in the table class at least, cause i need to modify the price before saving it, the main currency in the db is USD, everything else is basically converted
# May 19th 2021, 13:23 khalil :rolling_on_the_floor_laughing::rolling_on_the_floor_laughing::rolling_on_the_floor_laughing: it was a stupid question haha
# May 19th 2021, 13:12 me1367 Correct. You can just add a little method to the utility class that checks for a cached version and if not, pulls the latest one from online (just use the built-in cache expiry for checking when to update). Though, I'd use a cron + command for that instead... Doing it "on-demand" is gonna kill TTFB for the poor bloke that first hits the expired cache :anguished:
# May 19th 2021, 13:08 me1367 Yes, it's just basic OOP :P I wouldn't use it in table and entity classes though. Primarily controllers and such when it'll actually be needed. Don't bloat your tables and entities.
# May 19th 2021, 12:03 khalil Thanks
# May 19th 2021, 12:03 khalil I can!