-
Notifications
You must be signed in to change notification settings - Fork 14
Open
Description
Bug Description
Campaign::subscribe() silently returns 0 results when called with $isModel = true and a Builder object (as done by subscribeBySegment()). This is because FluentCrm\Framework\Database\Orm\Builder does not implement Traversable/IteratorAggregate, so foreach ($builder as $item) iterates over zero items instead of query results.
Steps to Reproduce
- Create a campaign via REST API:
POST /fluent-crm/v2/campaigns - Set content:
PUT /fluent-crm/v2/campaigns/{id} - Set recipients:
POST /fluent-crm/v2/campaigns/{id}/draft-recipientswith tag filter — returns correctcount - Process recipients:
POST /fluent-crm/v2/campaigns/{id}/subscribewith same filter — returns "Sorry, No subscribers found based on your filters"
Root Cause
In Campaign::subscribeBySegment() (Campaign.php):
$model = $this->getSubscribersModel($settings); // Returns Orm\Builder
$totalCount = $model->count(); // Works: returns correct count
// ...
$result = $this->subscribe($model, [], true); // Fails silentlyIn Campaign::subscribe():
if ($isModel) {
$subscribers = $subscriberIds; // This is an Orm\Builder, not a Collection
}
foreach ($subscribers as $subscriber) { // Zero iterations!
// ...
}Verification — Orm\Builder is not iterable:
$model = $campaign->getSubscribersModel($settings);
var_dump($model instanceof \Traversable); // false
var_dump(is_iterable($model)); // false
var_dump(class_implements(get_class($model))); // [] (no interfaces)
// foreach gives 0 results:
foreach ($model as $item) { /* never executes */ }
// But ->get() works:
$model->get()->count(); // Returns correct countSuggested Fix
In Campaign::subscribe(), call ->get() when $isModel is true and the value is a Builder:
if ($isModel) {
$subscribers = $subscriberIds;
if ($subscribers instanceof \FluentCrm\Framework\Database\Orm\Builder) {
$subscribers = $subscribers->get();
}
}Or alternatively, in subscribeBySegment():
// Before:
$result = $this->subscribe($model, [], true);
// After:
$result = $this->subscribe($model->get(), [], true);Impact
- The
POST /campaigns/{id}/subscribeREST endpoint is completely non-functional - The admin UI is not affected because it uses the
scheduleendpoint which processes recipients via a background AJAX handler (fluentcrm-post-campaigns-emails-processing) instead of callingsubscribe - Any third-party integration or API automation that calls the
subscribeendpoint will silently fail with 0 recipients
Environment
- FluentCRM (free) latest as of 2026-03-02
- WordPress 6.x
- PHP 8.x
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels