Log message #4265414

# At Username Text
# Jun 14th 2021, 19:22 kevin.pfeifer indeed
# Jun 14th 2021, 19:22 greg138 So, `$data['baselines._ids']` would indeed be blank, but `$data['baselines']['_ids']` would not be.
# Jun 14th 2021, 19:21 kevin.pfeifer I am on Cake 4.2.6
# Jun 14th 2021, 19:20 kevin.pfeifer @tomrwaller I just checked a basic beforeMarshal method inside one of my models where i use a `projects._ids` field and i do indeed have the data in there (had to `pr(); die();` it because for some reason xdebug doesn’t show it correctly :shrug:)
# Jun 14th 2021, 19:18 jh Yes I can read the migration guides, I am asking about experiences here
# Jun 14th 2021, 19:17 jh any rather big changes from say 3.8 to 4.2?
# Jun 14th 2021, 19:09 tomrwaller In my case, I'm not actually using customers, that was an example. With this, when I save an assessment, an answer gets created for each recommendation in the selected baselines. When I change the form control back to baselines._ids which is what it was when baked, and update the beforeMarshal to match, the if always fails because the data is empty.
# Jun 14th 2021, 19:07 slackebot ($query as $count => $recommendation) {`                 `$data['answers'][$count]['applicable'] = 1;`
# Jun 14th 2021, 19:07 slackebot `$recommendations = TableRegistry::getTableLocator()->get('Admin.Recommendations');`             `$query = $recommendations->find('all');`             `$query->matching('Baselines', function ($q) use ($data){`                 `return $q->where(['Baselines.id IN' => $data['baselines_ids']]);`             `});` `            `             `foreach
# Jun 14th 2021, 19:07 tomrwaller Possibly an issue in my beforeMarshal, but it seems to work. This is what I have that works: `echo $this->Form->control('baselines_ids', ['multiple' => 'checkbox', 'disabled' => false, 'options' => $baselines]` `public function beforeMarshal(\Cake\Event\Event $event, \ArrayObject $data, \ArrayObject $options)`     `{`         `if (!empty($data['baselines_ids'])) {`            
# Jun 14th 2021, 19:04 kevin.pfeifer there is some logic present int https://github.com/cakephp/cakephp/blob/76babd83538e3e247d1189c2289b2f7b31c2bc9a/src/View/Form/EntityContext.php#L260 and https://github.com/cakephp/cakephp/blob/fe6fd198e33f69c1d36d5df4ac2c92d26ffa4807/src/View/Helper/FormHelper.php which checks if the fieldname ends with `._ids` (one time actually checking for the ._ids and the other exploding the field by .)
# Jun 14th 2021, 19:03 greg138 Sounds like your beforeMarshal function has an issue.
# Jun 14th 2021, 19:03 greg138 Then the difference is that Cake has logic to handle a `_ids` as a special case, but nothing for `customers_ids`.
# Jun 14th 2021, 19:02 tomrwaller No. No field matching that.
# Jun 14th 2021, 19:02 greg138 Do you actually have a field in your database somewhere called `customers_ids`?
# Jun 14th 2021, 19:01 tomrwaller Yes - I'm just trying to understand what the difference is and why one works and one doesn't.
# Jun 14th 2021, 19:00 kevin.pfeifer you mean `customers._ids` right?
# Jun 14th 2021, 18:57 tomrwaller I also notice that if I change the control to control('customers_ids') I have to add a label manually, it doesn't automatically use the label as it does when using ._ids.
# Jun 14th 2021, 18:56 tomrwaller Guys - silly question - but what's the difference between customers_ids and customers_.ids? I'm calling a control in a form by control('customers._ids') and that works just fine. However, I'm using beforeMarshal to create some additional entities and I have a query there that looks for $data['customers_ids'). That works if I change the control to control('customers_ids') but it doesn't work if I leave the control as is.
# Jun 14th 2021, 17:37 kevin.pfeifer have you tried that? https://stackoverflow.com/questions/40609304/cakephp-3-x-optional-language-routing
# Jun 14th 2021, 17:33 alamnaryab `debug($this->request);` at localhost/project/en
# Jun 14th 2021, 17:32 alamnaryab I also debugged `$this->request` it is not showing language parameter while I have written code to get language parameter from `request->params` and switch accordingly
# Jun 14th 2021, 17:28 alamnaryab as now `language` is no more any parameter
# Jun 14th 2021, 17:27 alamnaryab @admad I added separate route scopes for both languages but before when I was switching language I used below line but now it is not working asdsa
# Jun 14th 2021, 17:03 alamnaryab better if it can force default language = ar if no lange parameter forun in url
# Jun 14th 2021, 17:02 slackebot $builder->fallbacks(); }); $routes->prefix('Admin', function (RouteBuilder $routes) { $routes->connect('/', ['controller' => 'Users', 'action' => 'login']); $routes->fallbacks(DashedRoute::class); });```
# Jun 14th 2021, 17:02 alamnaryab @admad below is my routes file before Multilanguage, now I have 2 languages , can you plz convert this to for languages (en,ar) ```use Cake\Routing\Route\DashedRoute; use Cake\Routing\RouteBuilder; use Cake\Routing\RouterBuilder; $routes->setRouteClass(DashedRoute::class); $routes->scope('/', function (RouteBuilder $builder) { $builder->connect('/', ['controller' => 'cv', 'action' => 'index']);
# Jun 14th 2021, 16:58 alamnaryab I am attaching routes output from debugger and also cmd
# Jun 14th 2021, 16:52 kevin.pfeifer can/should we add a warning to the scope function if such a "placeholder" can be detected? :thinking_face:
# Jun 14th 2021, 16:48 admad @alamnaryab `scope(':/language')` that's your problem. Scopes can't be place holders/route elements, they need to be static strings.
# Jun 14th 2021, 16:19 slackebot that Controller/Action/Whatever So it could be that the routes are just being set differently than you expect. Unfortunately I can't tell you how to set your routes so you have a language prefix/scope for your controllers.
# Jun 14th 2021, 16:19 kevin.pfeifer @alamnaryab I would try to check the "Routes" tab in the DebugKit to see if the routes are actually generated the way you intend them to. Otherwise you could also run `bin/cake routes` in the terminal if you don't have access to the DebugKit to see the same table of active routes. Basically (as far as I know) the route system works like • go through all the available routes • after the first match is present go to
# Jun 14th 2021, 15:25 martin ok fixed it by setting it to _orginal in entity when I update 1 of the 2 fields :)
# Jun 14th 2021, 15:07 martin https://github.com/cakephp/cakephp/blob/master/src/Datasource/EntityTrait.php#L304 hmm it just reads out the array from orignal, so does not work with custom made fields :(
# Jun 14th 2021, 15:03 martin Hmm when you create a virtual field inside a entity. it does not work with getOriginal(‘virtualfieldname’) ? because that already returns the new name (virtuel field just combines 2 fields)
# Jun 14th 2021, 13:55 a.vanniel I just don't know enough about routing to be able to help you here.. maybe someone else has an idea?
# Jun 14th 2021, 13:55 a.vanniel is placing the language as the first parameter actually possible with Cake? I am not entirely sure, it does feel like it get's a bit complicated because of this and I am not sure if Cake actually enjoys this way of routing/handling urls... whenever I needed to switch from locale I would add a request variable named lang= of language= but that might not be suitable for you... it might also not be very elegant.
# Jun 14th 2021, 12:12 slackebot way to debug, currently just hit and try. please help me out in this issue I will also be able to give anydesk access to quickly debug and trace the issue.
# Jun 14th 2021, 12:12 slackebot $routes ->connect('/', ['controller' => 'Users', 'action' => 'login']) ->setPatterns($patterns); $routes->fallbacks(DashedRoute::class); }); }); $routes->scope('/', function (RouteBuilder $builder) { $builder->connect('/*', ['controller' => 'cv', 'action' => 'index','language'=>'ar'], array('language' => 'en|ar')); $builder->fallbacks(); }); ``` I have no idea what is right
# Jun 14th 2021, 12:12 slackebot $builder->fallbacks(); }); $routes->scope('/:language', function (RouteBuilder $routes) { $routes->prefix('Admin', function (RouteBuilder $routes) { $patterns = ['language' => 'en|ar']; $routes ->connect('/:controller/:action/*', []) ->setPatterns($patterns); $routes ->connect('/:controller', ['action' => 'index']) ->setPatterns($patterns);
# Jun 14th 2021, 12:12 slackebot $builder) { $builder->connect('/', ['controller' => 'cv', 'action' => 'index']); $builder->connect('/:language/:controller/:action/*', array(), array('language' => 'en|ar')); $builder->connect('/:language/:controller', array('action' => 'index'), array('language' => 'en|ar')); $builder->connect('/:language', array('controller' => 'cv', 'action' => 'index'), array('language' => 'en|ar')) ;