<?php $current_rules =& $data['campaign']->rules; if (isset($data['new_rule_from']) && is_array($data['new_rule_from'])) { $generated_from =& $data['new_rule_from']; } else { if (array_key_exists('generated_from', $current_rules)) { $generated_from =& $current_rules['generated_from']; } else { $generated_from = array('type' => 'AND', 'rows' => array()); } } $tmp_person = new org_openpsa_person(); $tmp_group = new org_openpsa_organization(); $tmp_member = new midgard_member(); $properties_map = array('person' => org_openpsa_directmarketing_campaign_ruleresolver::list_object_properties($tmp_person, $data['l10n']), 'group' => org_openpsa_directmarketing_campaign_ruleresolver::list_object_properties($tmp_group, $data['l10n']), 'membership' => org_openpsa_directmarketing_campaign_ruleresolver::list_object_properties($tmp_member, $data['l10n'])); ?> <!-- Automatically built on PHP level --> <script type="text/javascript"> var org_openpsa_directmarketing_edit_query_property_map = { <?php $cnt = count($properties_map); $i = 0; foreach ($properties_map as $class => $properties) { $i++; echo " '{$class}': {\n"; echo " localized: '" . $data['l10n']->get("class:{$class}") . "',\n"; echo " parameters: false,\n"; echo " properties: " . json_encode($properties); echo " },\n"; if ($i == $cnt) {
/** * Creates/Removes members for this smart campaign based on the rules array * NOTE: This is highly resource intensive for large campaigns * * @return boolean indicating success/failure */ function update_smart_campaign_members() { midcom::get()->disable_limits(); if (!$this->id) { debug_add('This campaign has no id (maybe not created yet?), aborting', MIDCOM_LOG_ERROR); return false; } if ($this->orgOpenpsaObtype != self::TYPE_SMART) { debug_add("This (id #{$this->id}) is not a smart campaign, aborting", MIDCOM_LOG_ERROR); return false; } midcom::get('auth')->request_sudo('org.openpsa.directmarketing'); $this->parameter('org.openpsa.directmarketing_smart_campaign', 'members_update_failed', ''); $this->parameter('org.openpsa.directmarketing_smart_campaign', 'members_update_started', time()); $solver = new org_openpsa_directmarketing_campaign_ruleresolver(); if (!$solver->resolve($this->rules)) { $this->parameter('org.openpsa.directmarketing_smart_campaign', 'members_update_failed', time()); debug_add('Failed to resolve rules', MIDCOM_LOG_ERROR); debug_print_r("this->rules has value:", $this->rules); midcom::get('auth')->drop_sudo(); return false; } //returns now the result array of collector instead array of objects of query builder $rule_persons = $solver->execute(); if (!is_array($rule_persons)) { $this->parameter('org.openpsa.directmarketing_smart_campaign', 'members_update_failed', time()); debug_add('Failure when executing rules based search', MIDCOM_LOG_ERROR); midcom::get('auth')->drop_sudo(); return false; } //Delete (normal) members that should not be here anymore $qb_unwanted = org_openpsa_directmarketing_campaign_member_dba::new_query_builder(); $qb_unwanted->add_constraint('campaign', '=', $this->id); $qb_unwanted->add_constraint('orgOpenpsaObtype', '=', org_openpsa_directmarketing_campaign_member_dba::NORMAL); if (sizeof($rule_persons) > 0) { $qb_unwanted->add_constraint('person', 'NOT IN', array_keys($rule_persons)); } $uwret = $qb_unwanted->execute(); if (is_array($uwret) && !empty($uwret)) { foreach ($uwret as $member) { debug_add("Deleting unwanted member #{$member->id} (linked to person #{$member->person}) in campaign #{$this->id}"); if (!$member->delete()) { debug_add("Failed to delete unwanted member #{$member->id} (linked to person #{$member->person}) in campaign #{$this->id}, reason: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); } } } //List current non-tester members (including unsubscribed etc), and filter those out of rule_persons $qb_current = org_openpsa_directmarketing_campaign_member_dba::new_query_builder(); $qb_current->add_constraint('campaign', '=', $this->id); if (sizeof($rule_persons) > 0) { $qb_current->add_constraint('person', 'IN', array_keys($rule_persons)); } $qb_current->add_constraint('orgOpenpsaObtype', '<>', org_openpsa_directmarketing_campaign_member_dba::TESTER); $cret = $qb_current->execute(); if (is_array($cret) && !empty($cret)) { foreach ($cret as $member) { //Filter the existing member from rule_persons (if present, for example unsubscribed members might not be) debug_add("Removing person #{$member->person} ({$rule_persons[$member->person]['lastname']}, {$rule_persons[$member->person]['firstname']}) from rule_persons list, already a member"); unset($rule_persons[$member->person]); } } //Finally, create members of each person matched by rule left reset($rule_persons); foreach ($rule_persons as $id => $person) { debug_add("Creating new member (linked to person #{$id}) to campaign #{$this->id}"); $member = new org_openpsa_directmarketing_campaign_member_dba(); $member->orgOpenpsaObtype = org_openpsa_directmarketing_campaign_member_dba::NORMAL; $member->campaign = $this->id; $member->person = $id; if (!$member->create()) { debug_add("Failed to create new member (linked to person #{$id}) in campaign #{$this->id}, reason: " . midcom_connection::get_error_string(), MIDCOM_LOG_ERROR); } } //All done, set last updated timestamp $this->parameter('org.openpsa.directmarketing_smart_campaign', 'members_updated', time()); midcom::get('auth')->drop_sudo(); return true; }
/** * Displays an campaign edit view. * * Note, that the campaign for non-index mode operation is automatically determined in the can_handle * phase. * * If create privileges apply, we relocate to the index creation campaign, */ public function _handler_edit_query($handler_id, array $args, array &$data) { $this->_campaign = $this->_master->load_campaign($args[0]); $this->_campaign->require_do('midgard:update'); $this->_prepare_request_data($handler_id); $this->_view_toolbar->add_item(array(MIDCOM_TOOLBAR_URL => "campaign/edit_query_advanced/{$this->_campaign->guid}/", MIDCOM_TOOLBAR_LABEL => $this->_l10n->get('advanced rule editor'), MIDCOM_TOOLBAR_ICON => 'stock-icons/16x16/repair.png')); midcom::get('head')->enable_jquery(); midcom::get('head')->add_jsfile(MIDCOM_STATIC_URL . '/org.openpsa.directmarketing/edit_query.js'); $this->add_stylesheet(MIDCOM_STATIC_URL . '/org.openpsa.directmarketing/edit_query.css'); $this->add_stylesheet(MIDCOM_STATIC_URL . '/org.openpsa.core/list.css'); // PONDER: Locking ? if (!empty($_POST['midcom_helper_datamanager2_cancel'])) { return new midcom_response_relocate("campaign/{$this->_campaign->guid}/"); } //check if it should be saved or preview if (!empty($_POST['midcom_helper_datamanager2_save']) || isset($_POST['show_rule_preview'])) { $eval = '$tmp_array = ' . $_POST['midcom_helper_datamanager2_dummy_field_rules'] . ';'; $eval_ret = eval($eval); if ($eval_ret === false || !is_array($tmp_array)) { //Rule could not be parsed midcom::get('uimessages')->add('org.openpsa.directmarketing', $this->_l10n->get('given rule could not be parsed'), 'error'); return; } if (count($tmp_array) == 0) { // Rule array is empty midcom::get('uimessages')->add('org.openpsa.directmarketing', $this->_l10n->get('given rule is empty'), 'error'); return; } $rule = $tmp_array; //add rule was generated with wizard $rule['generated'] = 'wizard'; //resolve rules $solver = new org_openpsa_directmarketing_campaign_ruleresolver(); $solver->resolve($tmp_array); $rule_persons = $solver->execute(); //if it's not preview update campaign & Schedule background members refresh' if (!isset($_POST['show_rule_preview'])) { $this->_campaign->rules = $rule; $update_ret = $this->_campaign->update(); if (!$update_ret) { //Save failed midcom::get('uimessages')->add('org.openpsa.directmarketing', sprintf($this->_l10n->get('error when saving rule, errstr: %s'), midcom_connection::get_error_string()), 'error'); break; } //Schedule background members refresh $this->_campaign->schedule_update_smart_campaign_members(); //Save ok, relocate return new midcom_response_relocate("campaign/{$this->_campaign->guid}/"); } //set data for preview & skip page_style because of javascript call $data['preview_persons'] = $rule_persons; midcom::get()->skip_page_style = true; } // Add toolbar items org_openpsa_helpers::dm2_savecancel($this); $this->set_active_leaf('campaign_' . $this->_campaign->id); midcom::get('head')->set_pagetitle($this->_campaign->title); $this->bind_view_to_object($this->_campaign); $this->_update_breadcrumb_line($handler_id); }