/** * Construct * * @param array $config options */ public function __construct($config = array()) { $this->fundleMenus(); if (!$this->shouldUpgrade()) { return parent::__construct($config); } $this->upgrade(); return parent::__construct($config); }
/** * Constructor. * * @param array $config An optional associative array of configuration settings. * * @throws UnexpectedValueException */ public function __construct($config = array()) { parent::__construct($config); $listModel = ArrayHelper::getValue($config, 'listModel', JModelLegacy::getInstance('List', 'FabrikAdminModel')); if (!is_a($listModel, 'FabrikAdminModelList')) { throw new UnexpectedValueException('Content Type Constructor requires an Admin List Model'); } $this->listModel = $listModel; $this->doc = new DOMDocument(); }
/** * Construct * * @param array $config options */ public function __construct($config = array()) { $this->fundleMenus(); if (!$this->shouldUpgrade()) { JFactory::getApplication()->enqueueMessage('Already updated'); return parent::__construct($config); } if ($this->backUp()) { $this->upgrade(); } JFactory::getApplication()->enqueueMessage('Upgraded OK!'); return parent::__construct($config); }
/** * Save the package * * @param array $data jform data * * @return bool */ public function save($data) { $canvas = $data['params']['canvas']; $o = new stdClass(); $o->blocks = new stdClass(); $o->blocks->list = array(); $o->blocks->form = array(); $app = JFactory::getApplication(); $input = $app->input; $blocks = $input->get('blocks', array(), 'array'); foreach ($blocks as $type => $values) { $o->blocks->{$type} = $values; } foreach ($blocks as $type => $values) { $tbl = JString::ucfirst($type); foreach ($values as $id) { $item = $this->getTable($tbl); $item->load($id); if ($type == 'list') { // Also assign the form to the package $form = $this->getTable('Form'); $form->load($item->form_id); if (!in_array($form->id, $o->blocks->form)) { $o->blocks->form[] = $form->id; } } } } // Resave the data to update blocks $data['params']['canvas'] = $o; $data['params'] = json_encode($data['params']); $return = parent::save($data); return $return; }
/** * Save the pacakge * * @param array $data jform data * * @return bool */ public function save($data) { $canvas = $data['params']['canvas']; $canvas = json_decode($canvas); $o = new stdClass(); if (is_null($canvas)) { JError::raiseError(E_ERROR, 'malformed json package object'); } $o->canvas = $canvas; $data['params'] = json_encode($o); $return = parent::save($data); $data['id'] = $this->getState($this->getName() . '.id'); $packageId = $this->getState($this->getName() . '.id'); $blocks = is_object($o->canvas) ? $o->canvas->blocks : array(); foreach ($blocks as $fullkey => $ids) { $key = FabrikString::rtrimword($fullkey, 's'); $tbl = JString::ucfirst($key); foreach ($ids as $id) { $item = $this->getTable($tbl); $item->load($id); if ($key == 'list') { // Also assign the form to the package $form = $this->getTable('Form'); $form->load($item->form_id); if (!in_array($form->id, $blocks->form)) { $o->canvas->blocks->form[] = $item->id; } } } } // Resave the data to update blocks $data['params'] = json_encode($o); $return = parent::save($data); return $return; }
/** * delete form and form groups * @param array $cids to delete */ public function delete($cids) { $res = parent::delete($cids); if ($res) { foreach ($cids as $cid) { $item = FabTable::getInstance('FormGroup', 'FabrikTable'); $item->load(array('form_id'=> $cid)); $item->delete(); } } return $res; }
/** * Method to validate the form data. * * @param JForm $form The form to validate against. * @param array $data The data to validate. * @param string $group The name of the field group to validate. * * @see JFormRule * @see JFilterInput * * @return mixed Array of filtered data if valid, false otherwise. */ public function validate($form, $data, $group = null) { $params = $data['params']; $ok = parent::validate($form, $data); // Standard jform validation failed so we shouldn't test further as we can't be sure of the data if (!$ok) { return false; } // Hack - must be able to add the plugin xml fields file to $form to include in validation but cant see how at the moment $data['params'] = $params; return $data; }
/** * Potentially drop fields then remove element record * Will also do the same for child elements * * @param array &$pks To delete * * @return boolean True if successful, false if an error occurs. */ public function delete(&$pks) { // Initialize variables $elementIds = $this->app->input->get('elementIds', array(), 'array'); foreach ($elementIds as $id) { if ((int) $id === 0) { continue; } $pluginModel = $this->pluginManager->getElementPlugin($id); $pluginModel->onRemove(); $children = $pluginModel->getElementDescendents($id); foreach ($children as $childId) { $childModel = $this->pluginManager->getElementPlugin($childId); $childModel->onRemove(); } // Enables the deletion of child elements $pks = array_merge($pks, $children); $element = $pluginModel->getElement(); if ($pluginModel->isRepeatElement()) { $listModel = $pluginModel->getListModel(); $db = $listModel->getDb(); $tableName = $db->qn($this->getRepeatElementTableName($pluginModel)); $db->setQuery('DROP TABLE ' . $tableName); $db->execute(); } $listModel = $pluginModel->getListModel(); $item = $listModel->getTable(); // $$$ hugh - might be a table-less form! if (!empty($item->id)) { $db = $listModel->getDb(); $db->setQuery('ALTER TABLE ' . $db->qn($item->db_table_name) . ' DROP ' . $db->qn($element->name)); $db->execute(); } } return parent::delete($pks); }
/** * Save the form * * @param array $data the jform part of the request data * * @return bool */ public function save($data) { $this->populateState(); $app = JFactory::getApplication(); $input = $app->input; $user = JFactory::getUser(); $config = JFactory::getConfig(); $date = JFactory::getDate(); $row = $this->getTable(); $id = JArrayHelper::getValue($data, 'id'); $row->load($id); $params = new JRegistry($row->params); $this->setState('list.id', $id); $this->setState('list.form_id', $row->form_id); $feModel = $this->getFEModel(); $formModel = $this->getFormModel(); // Get original collation $db = $feModel->getDb(); if (!empty($data['db_table_name'])) { $db->setQuery('SHOW TABLE STATUS LIKE ' . $db->quote($data['db_table_name'])); $info = $db->loadObject(); $origCollation = is_object($info) ? $info->Collation : $params->get('collation', 'none'); } else { $origCollation = $params->get('collation', 'none'); } $row->bind($data); $row->order_by = json_encode($input->get('order_by', array(), 'array')); $row->order_dir = json_encode($input->get('order_dir', array(), 'array')); $row->check(); $this->collation($feModel, $origCollation, $row); $isNew = true; if ($row->id != 0) { $datenow = JFactory::getDate(); $row->modified = $datenow->toSql(); $row->modified_by = $user->get('id'); } if ($id == 0) { if ($row->created == '') { $row->created = $date->toSql(); } // Save the row now $row->store(); $isNew = false; $newtable = trim(JArrayHelper::getValue($data, '_database_name')); // Mysql will force db table names to lower case even if you set the db name to upper case - so use clean() $newtable = FabrikString::clean($newtable); // Check the entered database table doesnt already exist if ($newtable != '' && $this->databaseTableExists($newtable)) { throw new RuntimeException(JText::_('COM_FABRIK_DATABASE_TABLE_ALREADY_EXISTS')); return false; } if (!$this->canCreateDbTable()) { throw new RuntimeException(Jtext::_('COM_FABRIK_INSUFFICIENT_RIGHTS_TO_CREATE_TABLE')); return false; } // Create fabrik form $formModel = $this->createLinkedForm(); $row->form_id = $this->getState('list.form_id'); // Create fabrik group $groupData = FabrikWorker::formDefaults('group'); $groupData['name'] = $row->label; $groupData['label'] = $row->label; $input->set('_createGroup', 1, 'post'); $groupId = $this->createLinkedGroup($groupData, false); if ($newtable == '') { // New fabrik list but existing db table $this->createLinkedElements($groupId); } else { $row->db_table_name = $newtable; $row->auto_inc = 1; $dbOpts = array(); $params = new JRegistry($row->params); $dbOpts['COLLATE'] = $params->get('collation', ''); $res = $this->createDBTable($newtable, $input->get('defaultfields', array('id' => 'internalid', 'date_time' => 'date'), 'array'), $dbOpts); if (is_array($res)) { $row->db_primary_key = $newtable . '.' . $res[0]; } } } $params = new JRegistry($row->params); $params->set('isview', $feModel->isView()); $row->params = (string) $params; FabrikAdminHelper::prepareSaveDate($row->publish_down); FabrikAdminHelper::prepareSaveDate($row->created); FabrikAdminHelper::prepareSaveDate($row->publish_up); $pk = JArrayHelper::getValue($data, 'db_primary_key'); if ($pk == '') { $pk = $feModel->getPrimaryKeyAndExtra($row->db_table_name); $key = $pk[0]['colname']; $extra = $pk[0]['extra']; // Store without quoteNames as thats db specific $row->db_primary_key = $row->db_primary_key == '' ? $row->db_table_name . "." . $key : $row->db_primary_key; $row->auto_inc = JString::stristr($extra, 'auto_increment') ? true : false; } $row->store(); $pk = $row->db_primary_key; $this->updateJoins($data); // Needed to ensure pk field is not quoted $feModel->setTable($row); if (!$feModel->isView()) { $this->updatePrimaryKey($row->db_primary_key, $row->auto_inc); } // Make an array of elments and a presumed index size, map is then used in creating indexes $map = array(); $groups = $this->getFormModel()->getGroupsHiarachy(); foreach ($groups as $groupModel) { $elementModels = $groupModel->getMyElements(); foreach ($elementModels as $element) { // Int and DATETIME elements cant have a index size attrib $coltype = $element->getFieldDescription(); if (JString::stristr($coltype, 'int')) { $size = ''; } elseif (JString::stristr($coltype, 'datetime')) { $size = ''; } else { $size = '10'; } $map[$element->getFullName(false, false)] = $size; $map[$element->getElement()->id] = $size; } } // Update indexes (added array_key_exists check as these may be during after CSV import) if (!empty($aOrderBy) && array_key_exists($row->order_by, $map)) { foreach ($aOrderBy as $orderBy) { if (array_key_exists($orderBy, $map)) { $feModel->addIndex($orderBy, 'tableorder', 'INDEX', $map[$orderBy]); } } } if ($row->group_by !== '' && array_key_exists($row->group_by, $map)) { $feModel->addIndex($row->group_by, 'groupby', 'INDEX', $map["{$row->group_by}"]); } if (trim($params->get('group_by_order')) !== '') { $feModel->addIndex($params->get('group_by_order'), 'groupbyorder', 'INDEX', $map[$params->get('group_by_order')]); } $afilterFields = (array) $params->get('filter-fields', array()); foreach ($afilterFields as $field) { if (array_key_exists($field, $map)) { $feModel->addIndex($field, 'prefilter', 'INDEX', $map[$field]); } } $pkName = $row->getKeyName(); if (isset($row->{$pkName})) { $this->setState($this->getName() . '.id', $row->{$pkName}); } /** * $$$ hugh - I don't know what this state gets used for, but $iNew is * currently ending up the wrong way round. New tables it's false, * existing tables it's true. */ $this->setState($this->getName() . '.new', $isNew); parent::cleanCache('com_fabrik'); return true; }
public function validate($form, $data) { $params = $data['params']; $data = parent::validate($form, $data); if (!$data) { return false; } if (empty($data['_database_name']) && JArrayHelper::getValue($data, 'db_table_name') == '') { $this->setError(JText::_('COM_FABRIK_SELECT_DB_OR_ENTER_NAME')); return false; } //hack - must be able to add the plugin xml fields file to $form to include in validation // but cant see how at the moment $data['params'] = $params; return $data; }
public function delete(&$pks) { if (empty($pks)) { return true; } if (parent::delete($pks)) { if ($this->deleteFormGroups($pks)) { return $this->deleteElements($pks); } } return false; }
/** * Save the form * * @param array $data the jform part of the request data * * @return bool */ public function save($data) { $this->populateState(); $app = JFactory::getApplication(); $user = JFactory::getUser(); $config = JFactory::getConfig(); $date = JFactory::getDate(); $row = $this->getTable(); $id = $data['id']; $row->load($id); $this->setState('list.id', $id); $this->setState('list.form_id', $row->form_id); $feModel = $this->getFEModel(); $formModel = $this->getFormModel(); if (!$row->bind($data)) { $this->setError($row->getError()); return false; } $filter = new JFilterInput(null, null, 1, 1); $introduction = JArrayHelper::getValue(JRequest::getVar('jform', array(), 'post', 'array', JREQUEST_ALLOWRAW), 'introduction'); $row->introduction = $filter->clean($introduction); $row->order_by = json_encode(JRequest::getVar('order_by', array(), 'post', 'array')); $row->order_dir = json_encode(JRequest::getVar('order_dir', array(), 'post', 'array')); if (!$row->check()) { $this->setError($row->getError()); return false; } $isNew = true; if ($id == 0) { if ($row->created == '') { $row->created = $date->toSql(); } // Save the row now $row->store(); $isNew = false; $newtable = trim(JArrayHelper::getValue($data, '_database_name')); // Mysql will force db table names to lower case even if you set the db name to upper case - so use clean() $newtable = FabrikString::clean($newtable); // Check the entered database table doesnt already exist if ($newtable != '' && $this->databaseTableExists($newtable)) { $this->setError(JText::_('COM_FABRIK_DATABASE_TABLE_ALREADY_EXISTS')); return false; } if (!$this->canCreateDbTable()) { $this->setError(Jtext::_('COM_FABRIK_INSUFFICIENT_RIGHTS_TO_CREATE_TABLE')); return false; } // Create fabrik form $formModel = $this->createLinkedForm(); $row->form_id = $this->getState('list.form_id'); // Create fabrik group $groupData = FabrikWorker::formDefaults('group'); $groupData['name'] = $row->label; $groupData['label'] = $row->label; JRequest::setVar('_createGroup', 1, 'post'); $groupId = $this->createLinkedGroup($groupData, false); if ($newtable == '') { // New fabrik list but existing db table $this->createLinkedElements($groupId); } else { $row->db_table_name = $newtable; $row->auto_inc = 1; $res = $this->createDBTable($newtable, JRequest::getVar('defaultfields', array('id' => 'internalid', 'date_time' => 'date'))); if (is_array($res)) { $row->db_primary_key = $newtable . '.' . $res[0]; } } } $params = new JRegistry($row->params); if ($row->id != 0) { $datenow = JFactory::getDate(); $row->modified = $datenow->toSql(); $row->modified_by = $user->get('id'); } FabrikAdminHelper::prepareSaveDate($row->publish_down); FabrikAdminHelper::prepareSaveDate($row->created); FabrikAdminHelper::prepareSaveDate($row->publish_up); $pk = JArrayHelper::getValue($data, 'db_primary_key'); if ($pk == '') { $fields = $row->getFields(); $key = $row->getKeyName(); // Store without quoteNames as thats db specific $row->db_primary_key = $row->db_primary_key == '' ? $row->db_table_name . "." . $key : $row->db_primary_key; $row->auto_inc = JString::stristr($fields[$key]->Extra, 'auto_increment') ? true : false; } if (!$row->store()) { $this->setError($row->getError()); return false; } $pk = $row->db_primary_key; $this->updateJoins($data); // Needed to ensure pk field is not quoted $feModel->setTable($row); if (!$feModel->isView()) { $this->updatePrimaryKey($row->db_primary_key, $row->auto_inc); } // Make an array of elments and a presumed index size, map is then used in creating indexes $map = array(); $groups = $this->getFormModel()->getGroupsHiarachy(); foreach ($groups as $groupModel) { $elementModels = $groupModel->getMyElements(); foreach ($elementModels as $element) { // Int and DATETIME elements cant have a index size attrib $coltype = $element->getFieldDescription(); if (JString::stristr($coltype, 'int')) { $size = ''; } elseif (JString::stristr($coltype, 'datetime')) { $size = ''; } else { $size = '10'; } $map[$element->getFullName(false, false, false)] = $size; $map[$element->getElement()->id] = $size; } } // Update indexes (added array_key_exists check as these may be during after CSV import) if (!empty($aOrderBy) && array_key_exists($row->order_by, $map)) { foreach ($aOrderBy as $orderBy) { if (array_key_exists($orderBy, $map)) { $feModel->addIndex($orderBy, 'tableorder', 'INDEX', $map[$orderBy]); } } } if ($row->group_by !== '' && array_key_exists($row->group_by, $map)) { $feModel->addIndex($row->group_by, 'groupby', 'INDEX', $map["{$row->group_by}"]); } if (trim($params->get('group_by_order')) !== '') { $feModel->addIndex($params->get('group_by_order'), 'groupbyorder', 'INDEX', $map[$params->get('group_by_order')]); } $afilterFields = (array) $params->get('filter-fields', array()); foreach ($afilterFields as $field) { if (array_key_exists($field, $map)) { $feModel->addIndex($field, 'prefilter', 'INDEX', $map[$field]); } } $this->updateElements($row); /* $$$rob - joomfish not available for j1.7 if (JFolder::exists(JPATH_ADMINISTRATOR . '/components/com_joomfish/contentelements')) { if ($params->get('allow-data-translation')) { if (!$this->makeJoomfishXML()) { $this->setError(JTEXT::_( "Unable to make Joomfish XML file")); return false; } } else { $this->removeJoomfishXML(); } } */ $pkName = $row->getKeyName(); if (isset($row->{$pkName})) { $this->setState($this->getName() . '.id', $row->{$pkName}); } $this->setState($this->getName() . '.new', $isNew); parent::cleanCache('com_fabrik'); return true; }
/** * Method to save the form data. * * @param array $data The form data. * * @return boolean True on success, False on error. */ public function save($data) { parent::cleanCache('com_fabrik'); return parent::save($data); }
/** * Returns a reference to the a Table object, always creating it. * * @param string $type The table type to instantiate * @param string $prefix A prefix for the table class name. Optional. * @param array $config Configuration array for model. Optional. * * @return JTable A database object */ public function getTable($type = 'Cron', $prefix = 'FabrikTable', $config = array()) { $config['dbo'] = FabrikWorker::getDbo(true); return parent::getTable($type, $prefix, $config); }
/** * Method to validate the form data. * * @param JForm $form The form to validate against. * @param array $data The data to validate. * @param string $group The name of the field group to validate. * * @see JFormRule * @see JFilterInput * * @return mixed Array of filtered data if valid, false otherwise. */ public function validate($form, $data, $group = null) { if ($data['password'] !== $data['passwordConf']) { $this->setError(FText::_('COM_FABRIK_PASSWORD_MISMATCH')); return false; } return parent::validate($form, $data); }
/** * Save the form * * @param array $data the jForm part of the request data * * @return bool */ public function save($data) { $this->populateState(); $input = $this->app->input; $jForm = $input->get('jform', array(), 'array'); $date = JFactory::getDate(); $row = $this->getTable(); $id = FArrayHelper::getValue($data, 'id'); $row->load($id); $params = new Registry($row->get('params')); $isView = $this->setIsView($params); $data['params']['isView'] = (string) $isView; $this->setState('list.id', $id); $this->setState('list.form_id', $row->get('form_id')); $feModel = $this->getFEModel(); /** @var $contentTypeModel FabrikAdminModelContentTypeImport */ $contentTypeModel = JModelLegacy::getInstance('ContentTypeImport', 'FabrikAdminModel', array('listModel' => $this)); $contentType = ArrayHelper::getValue($jForm, 'contenttype', ''); if ($contentType !== '') { $contentTypeModel->check($contentType); } // Get original collation $db = $feModel->getDb(); $origCollation = $this->getOriginalCollation($params, $db, FArrayHelper::getValue($data, 'db_table_name', '')); $row->bind($data); $row->set('order_by', json_encode($input->get('order_by', array(), 'array'))); $row->set('order_dir', json_encode($input->get('order_dir', array(), 'array'))); $row->check(); $isNew = true; if ($row->id != 0) { $this->collation($feModel, $origCollation, $row); $dateNow = JFactory::getDate(); $row->set('modified', $dateNow->toSql()); $row->set('modified_by', $this->user->get('id')); } if ($id == 0) { if ($row->get('created', '') == '') { $row->set('created', $date->toSql()); } $isNew = false; $existingTable = ArrayHelper::getValue($data, 'db_table_name', ''); $newTable = $existingTable === '' ? trim(FArrayHelper::getValue($data, '_database_name')) : ''; // Mysql will force db table names to lower case even if you set the db name to upper case - so use clean() $newTable = FabrikString::clean($newTable); // Check the entered database table doesn't already exist if ($newTable != '' && $this->databaseTableExists($newTable)) { throw new RuntimeException(FText::_('COM_FABRIK_DATABASE_TABLE_ALREADY_EXISTS')); } if (!$this->canCreateDbTable()) { throw new RuntimeException(FText::_('COM_FABRIK_INSUFFICIENT_RIGHTS_TO_CREATE_TABLE')); } // Save the row now $row->store(); // Create fabrik form $this->createLinkedForm(); $row->set('form_id', $this->getState('list.form_id')); $groupData = FabrikWorker::formDefaults('group'); $groupData['name'] = $row->label; $groupData['label'] = $row->label; if ($newTable == '') { // Create fabrik group $input->set('_createGroup', 1); $groupId = $this->createLinkedGroup($groupData, false); // New fabrik list but existing db table $this->createLinkedElements($groupId); } else { $row->set('db_table_name', $newTable); $row->set('auto_inc', 1); $dbOpts = array(); $params = new Registry($row->get('params')); $dbOpts['COLLATE'] = $params->get('collation', ''); $fields = $contentTypeModel->import($contentType, $row->get('db_table_name'), $groupData); $res = $this->createDBTable($newTable, $fields, $dbOpts); if (is_array($res)) { $row->set('db_primary_key', $newTable . '.' . $res[0]); } } } $row->set('publish_down', FabrikAdminHelper::prepareSaveDate($row->get('publish_down'))); $row->set('created', FabrikAdminHelper::prepareSaveDate($row->get('created'))); $row->set('publish_up', FabrikAdminHelper::prepareSaveDate($row->get('publish_up'))); $pk = FArrayHelper::getValue($data, 'db_primary_key'); if ($pk == '') { $pk = $feModel->getPrimaryKeyAndExtra($row->get('db_table_name')); $key = $pk[0]['colname']; $extra = $pk[0]['extra']; // Store without qns as that's db specific $row->set('db_primary_key', $row->get('db_primary_key', '') == '' ? $row->get('db_table_name') . '.' . $key : $row->get('db_primary_key')); $row->set('auto_inc', JString::stristr($extra, 'auto_increment') ? true : false); } $row->store(); $this->updateJoins($data); // Needed to ensure pk field is not quoted $feModel->setTable($row); if (!$feModel->isView()) { $this->updatePrimaryKey($row->get('db_primary_key'), $row->get('auto_inc')); } // Make an array of elements and a presumed index size, map is then used in creating indexes $this->createIndexes($params, $row); $pkName = $row->getKeyName(); if (isset($row->{$pkName})) { $this->setState($this->getName() . '.id', $row->get($pkName)); } /** * $$$ hugh - I don't know what this state gets used for, but $iNew is * currently ending up the wrong way round. New tables it's false, * existing tables it's true. */ $this->setState($this->getName() . '.new', $isNew); parent::cleanCache('com_fabrik'); if ($id == 0) { $contentTypeModel->finalise($row); } return true; }
/** * Potentially drop fields then remove element record * * @param array &$pks To delete * * @return boolean True if successful, false if an error occurs. */ public function delete(&$pks) { // Initialize variables $app = JFactory::getApplication(); $input = $app->input; $pluginManager = JModelLegacy::getInstance('Pluginmanager', 'FabrikFEModel'); $elementIds = $app->input->get('elementIds', array(), 'array'); foreach ($elementIds as $id) { if ((int) $id === 0) { continue; } $pluginModel = $pluginManager->getElementPlugin($id); $pluginModel->onRemove($id); $element = $pluginModel->getElement(); if ($pluginModel->isRepeatElement()) { $listModel = $pluginModel->getListModel(); $db = $listModel->getDb(); $tableName = $db->quoteName($this->getRepeatElementTableName($pluginModel)); $db->setQuery('DROP TABLE ' . $tableName); $db->execute(); } $listModel = $pluginModel->getListModel(); $item = $listModel->getTable(); // $$$ hugh - might be a table-less form! if (!empty($item->id)) { $db = $listModel->getDb(); $db->setQuery('ALTER TABLE ' . $db->quoteName($item->db_table_name) . ' DROP ' . $db->quoteName($element->name)); $db->execute(); } } return parent::delete($pks); }