public function save($object) { if (!is_string($object->type) || empty($object->type)) { throw new ItemTableException('Invalid type id'); } if ($object->name == '') { throw new ItemTableException('Invalid name'); } if ($object->alias == '' || $object->alias != YString::sluggify($object->alias)) { throw new ItemTableException('Invalid slug'); } if (ItemHelper::checkAliasExists($object->alias, $object->id)) { throw new ItemTableException('Alias already exists, please choose a unique alias'); } // first save to get id if (empty($object->id)) { parent::save($object); } // init vars $db = $this->getDBO(); $search_data = array(); $element_data = array(); foreach ($object->getElements() as $id => $element) { // get element data $element_data[] = $element->toXML(); // get search data if ($data = $element->getSearchData()) { $search_data[] = "(" . $object->id . ", " . $db->quote($id) . ", " . $db->quote($data) . ")"; } } // set element data $object->elements = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<elements>\n" . implode("\n", $element_data) . "\n</elements>"; // delete old search data $query = "DELETE FROM " . ZOO_TABLE_SEARCH . " WHERE item_id = " . (int) $object->id; $db->query($query); // insert new search data if (count($search_data)) { $query = "INSERT INTO " . ZOO_TABLE_SEARCH . " VALUES " . implode(", ", $search_data); $db->query($query); } // save tags YTable::getInstance('tag')->save($object->id, $object->getTags()); return parent::save($object); }
public static function importCSV($file, $type = '', $contains_headers = false, $field_separator = ',', $field_enclosure = '"', $element_assignment = array()) { // get application if ($application = Zoo::getApplication()) { if ($type_obj = $application->getType($type)) { $c = 0; $assignments = array(); foreach ($element_assignment as $column => $value) { if (!empty($value[$type])) { $name = $value[$type]; $assignments[$name][] = $column; } } if (!isset($assignments['_name'])) { throw new ImportHelperException('No item name was assigned.'); } if (($handle = fopen($file, "r")) !== FALSE) { $item_table = YTable::getInstance('item'); $category_table = YTable::getInstance('category'); $user_id = JFactory::getUser()->get('id'); $now = JFactory::getDate(); $row = 0; $app_categories = $application->getCategories(); $app_categories = array_map(create_function('$cat', 'return $cat->name;'), $app_categories); $elements = $type_obj->getElements(); while (($data = fgetcsv($handle, 0, $field_separator, $field_enclosure)) !== FALSE) { if (!($contains_headers && $row == 0)) { $item = new Item(); $item->application_id = $application->id; $item->type = $type; // store created by $item->created_by = $user_id; // set created $item->created = $now->toMySQL(); // store modified_by $item->modified_by = $user_id; // set modified $item->modified = $now->toMySQL(); // store element_data and item name $item_categories = array(); foreach ($assignments as $assignment => $columns) { $column = current($columns); switch ($assignment) { case '_name': $item->name = $data[$column]; break; case '_created_by_alias': $item->created_by_alias = $data[$column]; break; case '_created': if (!empty($data[$column])) { $item->created = $data[$column]; } break; default: if (substr($assignment, 0, 9) == '_category') { foreach ($columns as $column) { $item_categories[] = $data[$column]; } } else { if (isset($elements[$assignment])) { $elements[$assignment]->unsetData(); switch ($elements[$assignment]->getElementType()) { case 'text': case 'textarea': case 'link': case 'email': case 'date': $element_data = array(); foreach ($columns as $column) { if (!empty($data[$column])) { $element_data[$column] = array('value' => $data[$column]); } } $elements[$assignment]->bindData($element_data); break; case 'gallery': $data[$column] = trim($data[$column], '/\\'); $elements[$assignment]->bindData(array('value' => $data[$column])); break; case 'image': case 'download': $elements[$assignment]->bindData(array('file' => $data[$column])); break; case 'googlemaps': $elements[$assignment]->bindData(array('location' => $data[$column])); break; } } } break; } } $elements_string = '<?xml version="1.0" encoding="UTF-8"?><elements>'; foreach ($elements as $element) { $elements_string .= $element->toXML(); } $elements_string .= '</elements>'; $item->elements = $elements_string; $item->alias = YString::sluggify($item->name); if (empty($item->alias)) { $item->alias = '42'; } // set a valid category alias while (ItemHelper::checkAliasExists($item->alias)) { $item->alias .= '-2'; } if (!empty($item->name)) { try { $item_table->save($item); $item_id = $item->id; $item->unsetElementData(); // store categories foreach ($item_categories as $category_name) { if (!in_array($category_name, $app_categories)) { $category = new Category(); $category->application_id = $application->id; $category->name = $category_name; $category->parent = 0; $category->alias = YString::sluggify($category_name); // set a valid category alias while (CategoryHelper::checkAliasExists($category->alias)) { $category->alias .= '-2'; } try { $category_table->save($category); $related_categories[$category->id] = $category->name; $app_categories[$category->id] = $category->name; } catch (CategoryTableException $e) { } } else { $related_categories = array_filter($app_categories, create_function('$cat', 'return $cat=="' . $category_name . '";')); } // add category to item relations if (!empty($related_categories)) { CategoryHelper::saveCategoryItemRelations($item_id, array_keys($related_categories)); } } } catch (ItemTableException $e) { } } } $row++; } fclose($handle); return true; } else { throw new ImportHelperException('Could not open csv file.'); } } else { throw new ImportHelperException('Could not find type.'); } } throw new ImportHelperException('No application to import too.'); }