Example #1
0
 private static function _importItems(Application $application, $items_xml_array = array(), $element_assignment = array(), $types = array())
 {
     // init vars
     $db = YDatabase::getInstance();
     $table = YTable::getInstance('item');
     $item_vars = array_keys(get_class_vars('Item'));
     $user_id = JFactory::getUser()->get('id');
     $app_types = $application->getTypes();
     $authors = new YArray(YDatabase::getInstance()->queryObjectList('SELECT id, username FROM #__users'));
     $items = array();
     foreach ($items_xml_array as $key => $items_xml) {
         $index = (string) $items_xml->attributes()->name;
         if (isset($types[$index]) && !empty($types[$index]) && ($type = $app_types[$types[$index]])) {
             $elements = $type->getElements();
             $traverse = true;
             while ($traverse) {
                 $traverse = false;
                 foreach ($items_xml->item as $item_xml) {
                     $traverse = true;
                     $item = new Item();
                     $item->old_alias = (string) $item_xml->attributes()->id;
                     $item->alias = YString::sluggify($item->old_alias);
                     $item->type = $type->id;
                     // set a valid category alias
                     while (ItemHelper::checkAliasExists($item->alias)) {
                         $item->alias .= '-2';
                     }
                     $db->query('INSERT INTO ' . ZOO_TABLE_ITEM . '(alias) VALUES (' . $db->quote($item->alias) . ')');
                     $item->id = $db->insertid();
                     // set item values
                     foreach ($item_xml->children() as $child) {
                         $name = $child->getName();
                         if (in_array($name, $item_vars)) {
                             $item->{$name} = (string) $child;
                         }
                     }
                     // store application id
                     $item->application_id = $application->id;
                     // store categories
                     $item->categories = array();
                     foreach ($item_xml->getElementsByPath('categories/category') as $category_xml) {
                         $item->categories[] = (string) $category_xml;
                     }
                     // store tags
                     $tags = array();
                     foreach ($item_xml->getElementsByPath('tags/tag') as $tag_xml) {
                         $tags[] = (string) $tag_xml;
                     }
                     $item->setTags($tags);
                     // store author
                     $item->created_by_alias = "";
                     if ($item_xml->author) {
                         $author = (string) $item_xml->author;
                         $key = $authors->searchRecursive($author);
                         if ($key !== false) {
                             $item->created_by = (int) $authors[$key]->id;
                         } else {
                             $item->created_by_alias = $author;
                         }
                     }
                     // if author is unknown set current user as author
                     if (!$item->created_by) {
                         $item->created_by = $user_id;
                     }
                     // store modified_by
                     $item->modified_by = $user_id;
                     // store element_data
                     if ($data = $item_xml->data) {
                         $elements_xml = YXMLElement::create('elements');
                         $nodes_to_delete = array();
                         foreach ($data->children() as $key => $element_xml) {
                             $old_element_alias = (string) $element_xml->attributes()->identifier;
                             if (isset($element_assignment[$index][$old_element_alias][$type->id]) && ($element_alias = $element_assignment[$index][$old_element_alias][$type->id])) {
                                 $element_xml->addAttribute('identifier', $element_alias);
                                 $elements_xml->appendChild($element_xml);
                             } else {
                                 $nodes_to_delete[] = $element_xml;
                             }
                         }
                         foreach ($nodes_to_delete as $node) {
                             $data->removeChild($node);
                         }
                         $item->elements = $elements_xml->asXML(true, true);
                     }
                     // store metadata
                     $params = $item->getParams();
                     if ($metadata = $item_xml->metadata) {
                         foreach ($metadata->children() as $metadata_xml) {
                             $params->set('metadata.' . $metadata_xml->getName(), (string) $metadata_xml);
                         }
                     }
                     $item->params = $params->toString();
                     $items[$item->old_alias] = $item;
                     $items_xml->removeChild($item_xml);
                 }
             }
         }
     }
     // sanatize relateditems elements
     foreach ($items as $key => $item) {
         foreach ($item->getElements() as $element) {
             if ($element->getElementType() == 'relateditems') {
                 $relateditems = $element->getElementData()->get('item', array());
                 $new_related_items = array();
                 foreach ($relateditems as $key => $relateditem) {
                     if (isset($items[$relateditem])) {
                         $new_related_items[] = $items[$relateditem]->id;
                     }
                 }
                 $element->getElementData()->set('item', $new_related_items);
             }
         }
         try {
             $table->save($item);
             $item->unsetElementData();
         } catch (YException $e) {
             JError::raiseNotice(0, JText::_('Error Importing Item') . ' (' . $e . ')');
         }
     }
     return $items;
 }
Example #2
0
 public function save()
 {
     // check for request forgeries
     YRequest::checkToken() or jexit('Invalid Token');
     // init vars
     $db = JFactory::getDBO();
     $config = JFactory::getConfig();
     $now = JFactory::getDate();
     $post = YRequest::get('post');
     $frontpage = YRequest::getBool('frontpage', false);
     $categories = YRequest::getArray('categories', null);
     $details = YRequest::getArray('details', null);
     $metadata = YRequest::getArray('meta', null);
     $cid = YRequest::getArray('cid.0', '', 'int');
     $tzoffset = $config->getValue('config.offset');
     $post = array_merge($post, $details);
     try {
         // get item table
         $table = YTable::getInstance('item');
         // get item
         if ($cid) {
             $item = $table->get($cid);
         } else {
             $item = new Item();
             $item->application_id = $this->application->id;
             $item->type = YRequest::getVar('type');
         }
         // bind item data
         $item->bind($post, array('elements', 'params', 'created_by'));
         $created_by = isset($post['created_by']) ? $post['created_by'] : '';
         $item->created_by = empty($created_by) ? JFactory::getUser()->id : $created_by == 'NO_CHANGE' ? $item->created_by : $created_by;
         $tags = isset($post['tags']) ? $post['tags'] : array();
         $item->setTags($tags);
         // bind element data
         foreach ($item->getElements() as $id => $element) {
             if (isset($post['elements'][$id])) {
                 $element->bindData($post['elements'][$id]);
             } else {
                 $element->bindData();
             }
         }
         // set alias
         $item->alias = ItemHelper::getUniqueAlias($item->id, YString::sluggify($item->alias));
         // set modified
         $item->modified = $now->toMySQL();
         $item->modified_by = $this->user->get('id');
         // set created date
         if ($item->created && strlen(trim($item->created)) <= 10) {
             $item->created .= ' 00:00:00';
         }
         $date = JFactory::getDate($item->created, $tzoffset);
         $item->created = $date->toMySQL();
         // set publish up date
         if (strlen(trim($item->publish_up)) <= 10) {
             $item->publish_up .= ' 00:00:00';
         }
         $date = JFactory::getDate($item->publish_up, $tzoffset);
         $item->publish_up = $date->toMySQL();
         // set publish down date
         if (trim($item->publish_down) == JText::_('Never') || trim($item->publish_down) == '') {
             $item->publish_down = $db->getNullDate();
         } else {
             if (strlen(trim($item->publish_down)) <= 10) {
                 $item->publish_down .= ' 00:00:00';
             }
             $date = JFactory::getDate($item->publish_down, $tzoffset);
             $item->publish_down = $date->toMySQL();
         }
         // get primary category
         $primary_category = @$post['params']['primary_category'];
         if (empty($primary_category) && count($categories)) {
             $primary_category = $categories[0];
         }
         // set params
         $item->params = $item->getParams()->remove('metadata.')->remove('template.')->set('metadata.', @$post['params']['metadata'])->set('template.', @$post['params']['template'])->set('config.enable_comments', @$post['params']['enable_comments'])->set('config.primary_category', $primary_category)->toString();
         // save item
         $table->save($item);
         // make sure categories contain primary category
         if (!empty($primary_category) && !in_array($primary_category, $categories)) {
             $categories[] = $primary_category;
         }
         // save category relations
         if ($frontpage) {
             $categories[] = 0;
         }
         CategoryHelper::saveCategoryItemRelations($item->id, $categories);
         // set redirect message
         $msg = JText::_('Item Saved');
     } catch (YException $e) {
         // raise notice on exception
         JError::raiseNotice(0, JText::_('Error Saving Item') . ' (' . $e . ')');
         $this->_task = 'apply';
         $msg = null;
     }
     $link = $this->baseurl;
     switch ($this->getTask()) {
         case 'apply':
             $link .= '&task=edit&type=' . $item->type . '&cid[]=' . $item->id;
             break;
         case 'saveandnew':
             $link .= '&task=add';
             break;
     }
     $this->setRedirect($link, $msg);
 }