id)) { if ($record->published != -2) { return; } return parent::canDelete($record); } } /** * Method to test whether a record can have its state changed. * * @param object $record A record object. * * @return boolean True if allowed to change the state of the record. Defaults to the permission set in the component. * * @since 3.1 */ protected function canEditState($record) { return parent::canEditState($record); } /** * Method to get a table object, load it if necessary. * * @param string $type The table name. Optional. * @param string $prefix The class prefix. Optional. * @param array $config Configuration array for model. Optional. * * @return JTable A JTable object * * @since 3.1 */ public function getTable($type = 'Tag', $prefix = 'TagsTable', $config = array()) { return JTable::getInstance($type, $prefix, $config); } /** * Auto-populate the model state. * * @note Calling getState in this method will result in recursion. * * @return void * * @since 3.1 */ protected function populateState() { $app = JFactory::getApplication('administrator'); $parentId = $app->input->getInt('parent_id'); $this->setState('tag.parent_id', $parentId); // Load the User state. $pk = $app->input->getInt('id'); $this->setState($this->getName() . '.id', $pk); // Load the parameters. $params = JComponentHelper::getParams('com_tags'); $this->setState('params', $params); } /** * Method to get a tag. * * @param integer $pk An optional id of the object to get, otherwise the id from the model state is used. * * @return mixed Tag data object on success, false on failure. * * @since 3.1 */ public function getItem($pk = null) { if ($result = parent::getItem($pk)) { // Prime required properties. if (empty($result->id)) { $result->parent_id = $this->getState('tag.parent_id'); } // Convert the metadata field to an array. $registry = new Registry; $registry->loadString($result->metadata); $result->metadata = $registry->toArray(); // Convert the images field to an array. $registry = new Registry; $registry->loadString($result->images); $result->images = $registry->toArray(); // Convert the urls field to an array. $registry = new Registry; $registry->loadString($result->urls); $result->urls = $registry->toArray(); // Convert the created and modified dates to local user time for display in the form. $tz = new DateTimeZone(JFactory::getApplication()->get('offset')); if ((int) $result->created_time) { $date = new JDate($result->created_time); $date->setTimezone($tz); $result->created_time = $date->toSql(true); } else { $result->created_time = null; } if ((int) $result->modified_time) { $date = new JDate($result->modified_time); $date->setTimezone($tz); $result->modified_time = $date->toSql(true); } else { $result->modified_time = null; } } return $result; } /** * Method to get the row form. * * @param array $data Data for the form. * @param boolean $loadData True if the form is to load its own data (default case), false if not. * * @return mixed A JForm object on success, false on failure * * @since 3.1 */ public function getForm($data = array(), $loadData = true) { $jinput = JFactory::getApplication()->input; // Get the form. $form = $this->loadForm('com_tags.tag', 'tag', array('control' => 'jform', 'load_data' => $loadData)); if (empty($form)) { return false; } $user = JFactory::getUser(); if (!$user->authorise('core.edit.state', 'com_tags' . $jinput->get('id'))) { // Disable fields for display. $form->setFieldAttribute('ordering', 'disabled', 'true'); $form->setFieldAttribute('published', 'disabled', 'true'); // Disable fields while saving. // The controller has already verified this is a record you can edit. $form->setFieldAttribute('ordering', 'filter', 'unset'); $form->setFieldAttribute('published', 'filter', 'unset'); } return $form; } /** * Method to get the data that should be injected in the form. * * @return mixed The data for the form. * * @since 3.1 */ protected function loadFormData() { // Check the session for previously entered form data. $data = JFactory::getApplication()->getUserState('com_tags.edit.tag.data', array()); if (empty($data)) { $data = $this->getItem(); } $this->preprocessData('com_tags.tag', $data); return $data; } /** * Method to preprocess the form. * * @param JForm $form A JForm object. * @param mixed $data The data expected for the form. * @param string $group The name of the plugin group to import. * * @return void * * @see JFormField * @since 3.1 * @throws Exception if there is an error in the form event. */ protected function preprocessForm(JForm $form, $data, $group = 'content') { // Trigger the default form events. parent::preprocessForm($form, $data, $group); } /** * Method to save the form data. * * @param array $data The form data. * * @return boolean True on success. * * @since 3.1 */ public function save($data) { $dispatcher = JEventDispatcher::getInstance(); $table = $this->getTable(); $input = JFactory::getApplication()->input; $pk = (!empty($data['id'])) ? $data['id'] : (int) $this->getState($this->getName() . '.id'); $isNew = true; $context = $this->option . '.' . $this->name; // Include the plugins for the save events. JPluginHelper::importPlugin($this->events_map['save']); // Load the row if saving an existing tag. if ($pk > 0) { $table->load($pk); $isNew = false; } // Set the new parent id if parent id not matched OR while New/Save as Copy . if ($table->parent_id != $data['parent_id'] || $data['id'] == 0) { $table->setLocation($data['parent_id'], 'last-child'); } if (isset($data['images']) && is_array($data['images'])) { $registry = new Registry; $registry->loadArray($data['images']); $data['images'] = (string) $registry; } if (isset($data['urls']) && is_array($data['urls'])) { $registry = new Registry; $registry->loadArray($data['urls']); $data['urls'] = (string) $registry; } // Alter the title for save as copy if ($input->get('task') == 'save2copy') { list($title, $alias) = $this->generateNewTitle($data['parent_id'], $data['alias'], $data['title']); $data['title'] = $title; $data['alias'] = $alias; } // Bind the data. if (!$table->bind($data)) { $this->setError($table->getError()); return false; } // Bind the rules. if (isset($data['rules'])) { $rules = new JAccessRules($data['rules']); $table->setRules($rules); } // Check the data. if (!$table->check()) { $this->setError($table->getError()); return false; } // Trigger the before save event. $result = $dispatcher->trigger($this->event_before_save, array($context, &$table, $isNew)); if (in_array(false, $result, true)) { $this->setError($table->getError()); return false; } // Store the data. if (!$table->store()) { $this->setError($table->getError()); return false; } // Trigger the after save event. $dispatcher->trigger($this->event_after_save, array($context, &$table, $isNew)); // Rebuild the path for the tag: if (!$table->rebuildPath($table->id)) { $this->setError($table->getError()); return false; } // Rebuild the paths of the tag's children: if (!$table->rebuild($table->id, $table->lft, $table->level, $table->path)) { $this->setError($table->getError()); return false; } $this->setState($this->getName() . '.id', $table->id); // Clear the cache $this->cleanCache(); return true; } /** * Method rebuild the entire nested set tree. * * @return boolean False on failure or error, true otherwise. * * @since 3.1 */ public function rebuild() { // Get an instance of the table object. $table = $this->getTable(); if (!$table->rebuild()) { $this->setError($table->getError()); return false; } // Clear the cache $this->cleanCache(); return true; } /** * Method to save the reordered nested set tree. * First we save the new order values in the lft values of the changed ids. * Then we invoke the table rebuild to implement the new ordering. * * @param array $idArray An array of primary key ids. * @param integer $lft_array The lft value * * @return boolean False on failure or error, True otherwise * * @since 3.1 */ public function saveorder($idArray = null, $lft_array = null) { // Get an instance of the table object. $table = $this->getTable(); if (!$table->saveorder($idArray, $lft_array)) { $this->setError($table->getError()); return false; } // Clear the cache $this->cleanCache(); return true; } /** * Method to change the title & alias. * * @param integer $parent_id The id of the parent. * @param string $alias The alias. * @param string $title The title. * * @return array Contains the modified title and alias. * * @since 3.1 */ protected function generateNewTitle($parent_id, $alias, $title) { // Alter the title & alias $table = $this->getTable(); while ($table->load(array('alias' => $alias, 'parent_id' => $parent_id))) { $title = ($table->title != $title) ? $title : JString::increment($title); $alias = JString::increment($alias, 'dash'); } return array($title, $alias); } }