Ejemplo n.º 1
0
<?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) {
Ejemplo n.º 2
0
 /**
  * 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;
 }
Ejemplo n.º 3
0
 /**
  * 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);
 }