Пример #1
0
 public function testHandler_create()
 {
     midcom::get('auth')->request_sudo('org.openpsa.products');
     $data = $this->run_handler('org.openpsa.products', array('product', 'create', 'default'));
     $this->assertEquals('create_product', $data['handler_id']);
     $formdata = array('title' => 'TEST ' . __CLASS__ . ' ' . time(), 'code' => 'TEST_' . __CLASS__ . '_' . time(), 'delivery' => (string) org_openpsa_products_product_dba::DELIVERY_SINGLE, 'orgOpenpsaObtype' => (string) org_openpsa_products_product_dba::TYPE_GOODS, 'org_openpsa_products_productGroup_chooser_selections' => array((string) self::$_group->id));
     $url = $this->submit_dm2_form('controller', $formdata, 'org.openpsa.products', array('product', 'create', 'default'));
     $qb = org_openpsa_products_product_dba::new_query_builder();
     $qb->add_constraint('productGroup', '=', self::$_group->id);
     $results = $qb->execute();
     $this->register_objects($results);
     $this->assertEquals(1, sizeof($results));
     $this->assertEquals('product/' . $results[0]->guid . '/', $url);
     midcom::get('auth')->drop_sudo();
 }
Пример #2
0
 private function _load_objects_group($group_id)
 {
     $objects = array();
     $product_qb = org_openpsa_products_product_dba::new_query_builder();
     $product_qb->add_constraint('productGroup', '=', $group_id);
     $products = $product_qb->execute();
     foreach ($products as $product) {
         $objects[] = $product;
     }
     $group_qb = org_openpsa_products_product_group_dba::new_query_builder();
     $group_qb->add_constraint('up', '=', $group_id);
     $groups = $group_qb->execute();
     foreach ($groups as $group) {
         $objects[] = $group;
         $child_objects = $this->_load_objects_group($group->id);
         $objects = array_merge($objects, $child_objects);
     }
     return $objects;
 }
Пример #3
0
 function _load_data($handler_id, &$args, &$data)
 {
     if (empty($_POST) && $data['session']->exists('POST_data')) {
         $_POST = $data['session']->get('POST_data');
         $data['session']->remove('POST_data');
     }
     $qb = org_openpsa_products_product_dba::new_query_builder();
     $qb->add_order('code');
     $qb->add_order('title');
     $products = array();
     $root_group_guid = $this->_config->get('root_group');
     if ($root_group_guid) {
         $root_group = new org_openpsa_products_product_group_dba($root_group_guid);
         if (!isset($_POST['org_openpsa_products_export_all']) || empty($_POST['org_openpsa_products_export_all'])) {
             $qb->add_constraint('productGroup', '=', $root_group->id);
             // We have data only from one product group, though this seems to be too late...
             $this->_schema_fields_to_skip[] = 'productGroup';
         } else {
             $qb_groups = org_openpsa_products_product_group_dba::new_query_builder();
             $qb_groups->add_constraint('up', 'INTREE', $root_group->id);
             $groups = $qb_groups->execute();
             $qb->begin_group('OR');
             $qb->add_constraint('productGroup', '=', $root_group->id);
             foreach ($groups as $group) {
                 $qb->add_constraint('productGroup', '=', $group->id);
             }
             $qb->end_group('OR');
         }
     }
     $all_products = $qb->execute();
     foreach ($all_products as $product) {
         $schema = $product->get_parameter('midcom.helper.datamanager2', 'schema_name');
         if ($schema != $this->_schema) {
             continue;
         }
         $products[] = $product;
     }
     return $products;
 }
Пример #4
0
    <p>You can import product images that have the product code in their filename/URL here.
    Type the address format below with string <code>__PRODUCT_CODE__</code> showing where the code should go to.</p>

    <form method="post">
        <label>
            URL/path
            <input type="text" name="address" value="/tmp/__PRODUCT_CODE__.jpg" />
        </label>
        <input type="submit" value="Import images" />
    </form>
    <?php 
} else {
    midcom::get()->disable_limits();
    // Import product images
    $qb = org_openpsa_products_product_dba::new_query_builder();
    $qb->add_constraint('code', '<>', '');
    $products = $qb->execute();
    $schemadb = midcom_baseclasses_components_configuration::get('org.openpsa.products', 'config')->get('schemadb_product');
    $schema = midcom_helper_datamanager2_schema::load_database($schema);
    $datamanager = new midcom_helper_datamanager2_datamanager($schema);
    foreach ($products as $product) {
        // Get old image
        $image = file_get_contents(str_replace('__PRODUCT_CODE__', $product->code, $_POST['address']));
        if (empty($image)) {
            continue;
        }
        // Save image to a temp file
        $tmp_name = tempnam($GLOBALS['midcom_config']['midcom_tempdir'], 'org_openpsa_products_product_oldimage_');
        $fp = fopen($tmp_name, 'w');
        if (!fwrite($fp, $image)) {
Пример #5
0
 public static function list_products()
 {
     $component_list = array();
     $qb = org_openpsa_products_product_dba::new_query_builder();
     $qb->add_order('productGroup');
     $qb->add_order('code');
     $qb->add_order('title');
     $qb->add_constraint('start', '<=', time());
     $qb->begin_group('OR');
     /*
      * List products that either have no defined end-of-market dates
      * or are still in market
      */
     $qb->add_constraint('end', '=', 0);
     $qb->add_constraint('end', '>=', time());
     $qb->end_group();
     $components = $qb->execute();
     foreach ($components as $component) {
         $component_list[$component->id] = "{$component->code} {$component->title}";
     }
     return $component_list;
 }
Пример #6
0
 /**
  * Looks up a product to display.
  *
  * @param mixed $handler_id The ID of the handler.
  * @param Array $args The argument list.
  * @param Array &$data The local request data.
  */
 public function _handler_view($handler_id, array $args, array &$data)
 {
     if (preg_match('/_raw$/', $handler_id)) {
         midcom::get()->skip_page_style = true;
     }
     $qb = org_openpsa_products_product_dba::new_query_builder();
     if (preg_match('/^view_product_intree/', $handler_id)) {
         $group_qb = org_openpsa_products_product_group_dba::new_query_builder();
         if (mgd_is_guid($args[0])) {
             $group_qb->add_constraint('guid', '=', $args[0]);
         } else {
             $group_qb->add_constraint('code', '=', $args[0]);
         }
         $groups = $group_qb->execute();
         if (empty($groups)) {
             throw new midcom_error_notfound("Product group {$args[0]} not found");
         }
         $categories_mc = org_openpsa_products_product_group_dba::new_collector('up', $groups[0]->id);
         $categories_in = $categories_mc->get_values('id');
         if (count($categories_in) == 0) {
             /* No matching categories belonging to this group
              * So we can search for the application using only
              * this group id
              */
             $qb->add_constraint('productGroup', 'INTREE', $groups[0]->id);
         } else {
             $categories_in[] = $groups[0]->id;
             $qb->add_constraint('productGroup', 'IN', $categories_in);
         }
         if (mgd_is_guid($args[1])) {
             $qb->add_constraint('guid', '=', $args[1]);
         } else {
             $qb->add_constraint('code', '=', $args[1]);
         }
     } else {
         if (mgd_is_guid($args[0])) {
             $qb->add_constraint('guid', '=', $args[0]);
         } else {
             $qb->add_constraint('code', '=', $args[0]);
         }
     }
     if ($this->_config->get('enable_scheduling')) {
         $qb->add_constraint('start', '<=', time());
         $qb->begin_group('OR');
         /*
          * List products that either have no defined end-of-market dates
          * or are still in market
          */
         $qb->add_constraint('end', '=', 0);
         $qb->add_constraint('end', '>=', time());
         $qb->end_group();
     }
     $results = $qb->execute();
     $this->_request_data['is_linked_from'] = '';
     if (!empty($results)) {
         $this->_product = $results[0];
         if ($this->_config->get('enable_productlinks') && $this->_product->productGroup != 0) {
             $root_group_guid = $this->_config->get('root_group');
             if ($root_group_guid != '') {
                 $root_group = org_openpsa_products_product_group_dba::get_cached($root_group_guid);
             }
             if ($root_group->id != $this->_product->productGroup) {
                 $product_group = new org_openpsa_products_product_group_dba($this->_product->productGroup);
                 $mc_intree = org_openpsa_products_product_group_dba::new_collector('id', $product_group->id);
                 $mc_intree->add_constraint('up', 'INTREE', $root_group->id);
                 $count = $mc_intree->count();
                 if ($count == 0) {
                     $mc_intree = org_openpsa_products_product_link_dba::new_collector('product', $this->_product->id);
                     $mc_intree->add_constraint('productGroup', 'INTREE', $root_group->id);
                     $mc_intree->execute();
                     $results = $mc_intree->list_keys();
                     if (count($results) > 0) {
                         foreach ($results as $guid => $array) {
                             $this->_request_data['is_linked_from'] = $guid;
                         }
                     }
                 }
             }
         }
     } else {
         if (preg_match('/^view_product_intree/', $handler_id)) {
             $this->_product = new org_openpsa_products_product_dba($args[1]);
         } else {
             $this->_product = new org_openpsa_products_product_dba($args[0]);
         }
     }
     if ($GLOBALS['midcom_config']['enable_ajax_editing']) {
         $data['controller'] = midcom_helper_datamanager2_controller::create('ajax');
         $data['controller']->schemadb =& $data['schemadb_product'];
         $data['controller']->set_storage($this->_product);
         $data['controller']->process_ajax();
         $data['datamanager'] =& $data['controller']->datamanager;
     } else {
         $data['controller'] = null;
         $data['datamanager'] = new midcom_helper_datamanager2_datamanager($data['schemadb_product']);
         if (!$data['datamanager']->autoset_storage($this->_product)) {
             throw new midcom_error("Failed to create a DM2 instance for product {$this->_product->guid}.");
         }
     }
     $this->_prepare_request_data();
     $this->bind_view_to_object($this->_product, $data['datamanager']->schema->name);
     if (isset($product_group)) {
         unset($product_group);
     }
     $product_group = null;
     if ($this->_request_data['is_linked_from'] != '') {
         $linked_product = new org_openpsa_products_product_link_dba($data['is_linked_from']);
         if ($linked_product->productGroup != 0) {
             $product_group = new org_openpsa_products_product_group_dba($linked_product->productGroup);
         }
     }
     $breadcrumb = org_openpsa_products_viewer::update_breadcrumb_line($this->_product, $product_group);
     midcom_core_context::get()->set_custom_key('midcom.helper.nav.breadcrumb', $breadcrumb);
     midcom::get('metadata')->set_request_metadata($this->_product->metadata->revised, $this->_product->guid);
     $title = $this->_config->get('product_page_title');
     if (strstr($title, '<PRODUCTGROUP')) {
         try {
             $productgroup = new org_openpsa_products_product_group_dba($this->_product->productGroup);
             $title = str_replace('<PRODUCTGROUP_TITLE>', $productgroup->title, $title);
             $title = str_replace('<PRODUCTGROUP_CODE>', $productgroup->code, $title);
         } catch (midcom_error $e) {
             $title = str_replace('<PRODUCTGROUP_TITLE>', '', $title);
             $title = str_replace('<PRODUCTGROUP_CODE>', '', $title);
         }
     }
     $title = str_replace('<PRODUCT_CODE>', $this->_product->code, $title);
     $title = str_replace('<PRODUCT_TITLE>', $this->_product->title, $title);
     $title = str_replace('<TOPIC_TITLE>', $this->_topic->extra, $title);
     midcom::get('head')->set_pagetitle($title);
 }
Пример #7
0
 private function _import_product($productdata)
 {
     $data =& $this->_request_data;
     // Convert fields from latin-1 to MidCOM charset (usually utf-8)
     foreach ($productdata as $key => $value) {
         // FIXME: It would be immensely more efficient to do this per-file or even per row rather than per field
         $productdata[$key] = $this->_charset_convert($value);
     }
     $product = null;
     $new = false;
     // GUID has precedence
     if (isset($productdata['GUID']) && !empty($productdata['GUID'])) {
         $product = new org_openpsa_products_product_dba($productdata['GUID']);
         if ($product->guid != $productdata['GUID']) {
             // Could not fetch correct product
             unset($product);
         }
     } else {
         if (isset($productdata['code'])) {
             // FIXME: the product group should be taken into account here, codes are quaranteed to be unique only within the group
             $qb = org_openpsa_products_product_dba::new_query_builder();
             $qb->add_constraint('code', '=', (string) $productdata['code']);
             $products = $qb->execute();
             if (count($products) > 0) {
                 // Match found, use it
                 $product = $products[0];
             }
         }
     }
     if (!$product) {
         // We didn't have group matching the code in DB. Create a new one.
         $product = new org_openpsa_products_product_dba();
         $product->productGroup = $data['new_products_product_group'];
         if (!$product->create()) {
             debug_add("Failed to create product, reason " . midcom_connection::get_error_string());
             $this->_request_data['import_status']['failed_create']++;
             return false;
             // This will skip to next
         }
         $product->set_parameter('midcom.helper.datamanager2', 'schema_name', $data['schema']);
         $new = true;
     }
     // Map products without group to the "new products" group
     if (empty($product->productGroup) && !empty($data['new_products_product_group'])) {
         $product->productGroup = $data['new_products_product_group'];
     }
     if (!$this->_datamanager_process($productdata, $product)) {
         if ($new) {
             $product->delete();
             $this->_request_data['import_status']['failed_create']++;
         } else {
             $this->_request_data['import_status']['failed_update']++;
         }
         return false;
     }
     $this->_products_processed[$product->code] = $product;
     if ($new) {
         $this->_request_data['import_status']['created']++;
     } else {
         $this->_request_data['import_status']['updated']++;
     }
     return $product;
 }
Пример #8
0
 public function _on_reindex_tree_iterator(&$indexer, &$dms, &$topic, &$group, &$topic, &$config)
 {
     if ($dms['group']->autoset_storage($group)) {
         if ($config->get('index_groups')) {
             org_openpsa_products_viewer::index($dms['group'], $indexer, $topic, $config);
         }
     } else {
         debug_add("Warning, failed to initialize datamanager for product group {$group->id}. Skipping it.", MIDCOM_LOG_WARN);
     }
     if ($config->get('index_products')) {
         $qb_products = org_openpsa_products_product_dba::new_query_builder();
         $qb_products->add_constraint('productGroup', '=', $group->id);
         $products = $qb_products->execute();
         unset($qb_products);
         if (is_array($products)) {
             foreach ($products as $product) {
                 if (!$dms['product']->autoset_storage($product)) {
                     debug_add("Warning, failed to initialize datamanager for product {$product->id}. Skipping it.", MIDCOM_LOG_WARN);
                     continue;
                 }
                 org_openpsa_products_viewer::index($dms['product'], $indexer, $topic, $config);
                 unset($product);
             }
         }
         unset($products);
     }
     $subgroups = array();
     $qb_groups = org_openpsa_products_product_group_dba::new_query_builder();
     $qb_groups->add_constraint('up', '=', $group->id);
     $subgroups = $qb_groups->execute();
     unset($qb_groups);
     if (!is_array($subgroups)) {
         return true;
     }
     foreach ($subgroups as $subgroup) {
         $this->_on_reindex_tree_iterator($indexer, $dms, $topic, $subgroup, $topic, $config);
         unset($subgroup);
     }
     unset($subgroups);
     return true;
 }
Пример #9
0
 /**
  * @param mixed $handler_id The ID of the handler.
  * @param Array $args The argument list.
  * @param Array &$data The local request data.
  */
 public function _handler_product_list($handler_id, array $args, array &$data)
 {
     $qb = org_openpsa_products_product_dba::new_query_builder();
     midcom::get()->disable_limits();
     if ($handler_id != 'api_product_list_all') {
         if ($args[0] == "0") {
             // List only toplevel
             $qb->add_constraint('productGroup', '=', 0);
         } else {
             $product_group = new org_openpsa_products_product_group_dba($args[0]);
             if ($handler_id == 'api_product_list_intree') {
                 $qb->add_constraint('productGroup', 'INTREE', $product_group->id);
             } else {
                 $qb->add_constraint('productGroup', '=', $product_group->id);
             }
         }
     }
     midcom::get('cache')->content->content_type('text/xml');
     $qb->add_order('code');
     $qb->add_order('title');
     $data['products'] = $qb->execute();
 }