Options being ignored
These lines appear to have the effect of "if the specified layout is default, then the specified configName, template, and layout will be ignored when the email is being sent and replaced with values provided in the command line or defined in SenderShell::getOptionParser()".
I'm trying to use this plugin and I'm not able to use any template file or config value other than default while the layout is default.
Can you confirm that this is a bug, or is this the expected behavior?
That's how I thought the feature should work when I implemented it a long time ago. The idea was that, since default basically means that it was no changed on purpose by the developer, then the shell would have a chance to say otherwise.
But, if the developer took the time to specify a different layout, then it would not make a lot of sense to change it from the command line, since that would result in an error.
I'm not attached at all to the current implementation, so you can send a pull request if you strongly feel it should be implemented in another way.
So if I add an email to the queue with these options
$to = '[email protected]';
$view_vars = [
'variable_name' => $variable_value
];
$send_at = Time::now();
$options = [
'subject' => __('Email Subject'),
'send_at' => $send_at->i18nFormat('yyyy-MM-dd HH:mm:ss'),
'template' => 'custom_template',
'layout' => 'custom_layout',
'format' => 'both'
];
EmailQueue::enqueue($to, $view_vars, $options);
and then send the email using
bin/cake EmailQueue.sender
It shouldn't work? Right now, it sends an empty email. It seems I have to define the --template and --layout options in the bin/cake EmailQueue.sender command for it to work correctly.
I would expect bin/cake EmailQueue.sender to only fall back to default if those fields were empty in the database. In my opinion lines
foreach ($emails as $e) {
$configName = $e->layout === 'default' ? $this->params['config'] : $e->config;
$template = $e->layout === 'default' ? $this->params['template'] : $e->template;
$layout = $e->layout === 'default' ? $this->params['layout'] : $e->layout;
...
should be changed to
foreach ($emails as $e) {
$configName = $e->config === 'default' ? $this->params['config'] : $e->config;
$template = $e->template === 'default' ? $this->params['template'] : $e->template;
$layout = $e->layout === 'default' ? $this->params['layout'] : $e->layout;
...
... which looks like what it already is. composer must have downloaded some old version. hmm.
It will send only if the current time is now or after the send_time