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(); }
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; }
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; }
<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)) {
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; }
/** * 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); }
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; }
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; }
/** * @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(); }