# |
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')) ; |