protected function _generate() { $className = $this->_getClassName(); if (count($this->_dataClass['primaryKey']) > 1) { throw new XenForo_Exception(sprintf('Cannot generate %s: too many fields in primary key', $className)); } $idField = reset($this->_dataClass['primaryKey']); // create the route prefix first /** @var XenForo_Model_RoutePrefix $routePrefixModel */ $routePrefixModel = XenForo_Model::create('XenForo_Model_RoutePrefix'); $existed = $routePrefixModel->getPrefixesByRouteType('admin'); foreach ($existed as $routePrefix) { if ($routePrefix['original_prefix'] == $this->_info['routePrefix'] or $routePrefix['route_class'] == $className) { // delete duplicated route prefix $dw = XenForo_DataWriter::create('XenForo_DataWriter_RoutePrefix'); $dw->setExistingData($routePrefix); $dw->delete(); } } eval("class {$className} {}"); $dw = XenForo_DataWriter::create('XenForo_DataWriter_RoutePrefix'); $dw->bulkSet(array('original_prefix' => $this->_info['routePrefix'], 'route_type' => 'admin', 'route_class' => $className, 'build_link' => 'data_only', 'addon_id' => $this->_addOn['addon_id'])); $dw->save(); // finished creating our route prefix $this->_setClassName($className); $this->_addInterface('XenForo_Route_Interface'); $this->_addMethod('match', 'public', array('$routePath', '$request' => 'Zend_Controller_Request_Http $request', '$router' => 'XenForo_Router $router'), "\n\nif (in_array(\$routePath, array('add', 'save'))) {\n \$action = \$routePath;\n} else {\n \$action = \$router->resolveActionWithIntegerParam(\$routePath, \$request, '{$idField}');\n}\nreturn \$router->getRouteMatch('{$this->_info['controller']}', \$action, '{$this->_info['majorSection']}');\n\n "); $this->_addMethod('buildLink', 'public', array('$originalPrefix', '$outputPrefix', '$action', '$extension', '$data', '$extraParams' => 'array &$extraParams'), "\n\nif (is_array(\$data)) {\n return XenForo_Link::buildBasicLinkWithIntegerParam(\$outputPrefix, \$action, \$extension, \$data, '{$idField}');\n} else {\n return XenForo_Link::buildBasicLink(\$outputPrefix, \$action, \$extension);\n}\n\n "); return parent::_generate(); }
protected function _generate() { $className = $this->_getClassName(); $tableName = DevHelper_Generator_Db::getTableName($this->_config, $this->_dataClass['name']); $tableFields = $this->_dataClass['fields']; foreach ($tableFields as &$field) { unset($field['name']); if (!empty($field['length'])) { $field['maxLength'] = $field['length']; unset($field['length']); } $field['type'] = DevHelper_Generator_File::varExportConstantFromArray($field['type'], array('XenForo_DataWriter::TYPE_BOOLEAN', 'XenForo_DataWriter::TYPE_STRING', 'XenForo_DataWriter::TYPE_BINARY', 'XenForo_DataWriter::TYPE_INT', 'XenForo_DataWriter::TYPE_UINT', 'XenForo_DataWriter::TYPE_UINT_FORCED', 'XenForo_DataWriter::TYPE_FLOAT', 'XenForo_DataWriter::TYPE_SERIALIZED', 'XenForo_DataWriter::TYPE_JSON', 'XenForo_DataWriter::TYPE_UNKNOWN')); } $tableFields = DevHelper_Generator_File::varExport($tableFields, 1); $primaryKey = DevHelper_Generator_File::varExport($this->_dataClass['primaryKey']); $modelClassName = DevHelper_Generator_Code_Model::getClassName($this->_addOn, $this->_config, $this->_dataClass); $this->_setClassName($className); $this->_setBaseClass('XenForo_DataWriter'); $this->_addMethod('_getFields', 'protected', array(), "\n\nreturn array(\n '{$tableName}' => {$tableFields}\n);\n\n "); if (count($this->_dataClass['primaryKey']) == 1) { $idField = reset($this->_dataClass['primaryKey']); $this->_addMethod('_getExistingData', 'protected', array('$data'), "\n\nif (!\$id = \$this->_getExistingPrimaryKey(\$data, '{$idField}')) {\n return false;\n}\n\nreturn array('{$tableName}' => \$this->_get{$this->_dataClass['camelCase']}Model()->get{$this->_dataClass['camelCase']}ById(\$id));\n\n "); } else { $this->_addMethod('_getExistingData', 'protected', array('$data'), "\n\nthrow new XenForo_Exception('{$className} does not support _getExistingData()');\n\n "); } $this->_addMethod('_getUpdateCondition', 'protected', array('$tableName'), "\n\n\$conditions = array();\n\nforeach ({$primaryKey} as \$field) {\n \$conditions[] = \$field . ' = ' . \$this->_db->quote(\$this->getExisting(\$field));\n}\n\nreturn implode(' AND ', \$conditions);\n\n "); $this->_addMethod("_get{$this->_dataClass['camelCase']}Model", 'protected', array(), "\n\nreturn \$this->getModelFromCache('{$modelClassName}');\n\n "); $this->_generateImageCode(); $this->_generatePhrasesCode(); $this->_generateParentCode(); return parent::_generate(); }
protected function _generate() { $className = $this->_getClassName(); $tableName = DevHelper_Generator_Db::getTableName($this->_config, $this->_dataClass['name']); $idField = ''; if (count($this->_dataClass['primaryKey']) == 1) { $idField = reset($this->_dataClass['primaryKey']); } $getFunctionName = self::generateGetDataFunctionName($this->_addOn, $this->_config, $this->_dataClass); $countFunctionName = self::generateCountDataFunctionName($this->_addOn, $this->_config, $this->_dataClass); $tableAlias = $this->_dataClass['name']; if (in_array($tableAlias, array('group', 'join', 'order'))) { $tableAlias = '_' . $tableAlias; } $variableName = self::getVariableName($this->_addOn, $this->_config, $this->_dataClass); $variableNamePlural = self::getVariableNamePlural($this->_addOn, $this->_config, $this->_dataClass); $conditionFields = DevHelper_Generator_Db::getConditionFields($this->_dataClass['fields']); $this->_setClassName($className); $this->_setBaseClass('XenForo_Model'); $this->_addCustomizableMethod("_{$getFunctionName}Customized", 'protected', array('array &$data', 'array $fetchOptions')); $this->_addCustomizableMethod("_prepare{$this->_dataClass['camelCase']}ConditionsCustomized", 'protected', array('array &$sqlConditions', 'array $conditions', 'array $fetchOptions')); $this->_addCustomizableMethod("_prepare{$this->_dataClass['camelCase']}FetchOptionsCustomized", 'protected', array('&$selectFields', '&$joinTables', 'array $fetchOptions')); $this->_addCustomizableMethod("_prepare{$this->_dataClass['camelCase']}OrderOptionsCustomized", 'protected', array('array &$choices', 'array &$fetchOptions')); if (!empty($idField)) { $this->_addMethod('getList', 'public', array('$conditions' => 'array $conditions = array()', '$fetchOptions' => 'array $fetchOptions = array()'), "\n\n\${$variableNamePlural} = \$this->{$getFunctionName}(\$conditions, \$fetchOptions);\n\$list = array();\n\nforeach (\${$variableNamePlural} as \$id => \${$variableName}) {\n \$list[\$id] = \${$variableName}" . (empty($this->_dataClass['title_field']) ? "['{$idField}']" : (is_array($this->_dataClass['title_field']) ? "['{$this->_dataClass['title_field'][0]}']['{$this->_dataClass['title_field'][1]}']" : "['{$this->_dataClass['title_field']}']")) . ";\n}\n\nreturn \$list;\n\n "); $this->_addMethod("get{$this->_dataClass['camelCase']}ById", 'public', array('$id', '$fetchOptions' => 'array $fetchOptions = array()'), "\n\n\${$variableNamePlural} = \$this->{$getFunctionName}(array('{$idField}' => \$id), \$fetchOptions);\n\nreturn reset(\${$variableNamePlural});\n\n "); $this->_addMethod("get{$this->_dataClass['camelCase']}IdsInRange", 'public', array('$start', '$limit'), "\n\n\$db = \$this->_getDb();\n\nreturn \$db->fetchCol(\$db->limit('\n SELECT {$idField}\n FROM {$tableName}\n WHERE {$idField} > ?\n ORDER BY {$idField}\n', \$limit), \$start);\n\n "); } $this->_addMethod($getFunctionName, 'public', array('$conditions' => 'array $conditions = array()', '$fetchOptions' => 'array $fetchOptions = array()'), "\n\n\$whereConditions = \$this->prepare{$this->_dataClass['camelCase']}Conditions(\$conditions, \$fetchOptions);\n\n\$orderClause = \$this->prepare{$this->_dataClass['camelCase']}OrderOptions(\$fetchOptions);\n\$joinOptions = \$this->prepare{$this->_dataClass['camelCase']}FetchOptions(\$fetchOptions);\n\$limitOptions = \$this->prepareLimitFetchOptions(\$fetchOptions);\n\n\${$variableNamePlural} = \$this->" . (!empty($idField) ? "fetchAllKeyed" : "_getDb()->fetchAll") . "(\$this->limitQueryResults(\"\n SELECT {$tableAlias}.*\n \$joinOptions[selectFields]\n FROM `{$tableName}` AS {$tableAlias}\n \$joinOptions[joinTables]\n WHERE \$whereConditions\n \$orderClause\n \", \$limitOptions['limit'], \$limitOptions['offset']\n)" . (!empty($idField) ? ", '{$idField}'" : "") . ");\n\n ", '001'); $this->_addMethod($getFunctionName, 'public', array('$conditions' => 'array $conditions = array()', '$fetchOptions' => 'array $fetchOptions = array()'), "\n\n\$this->_{$getFunctionName}Customized(\${$variableNamePlural}, \$fetchOptions);\n\nreturn \${$variableNamePlural};\n\n ", '999'); $this->_addMethod($countFunctionName, 'public', array('$conditions' => 'array $conditions = array()', '$fetchOptions' => 'array $fetchOptions = array()'), "\n\n\$whereConditions = \$this->prepare{$this->_dataClass['camelCase']}Conditions(\$conditions, \$fetchOptions);\n\n\$orderClause = \$this->prepare{$this->_dataClass['camelCase']}OrderOptions(\$fetchOptions);\n\$joinOptions = \$this->prepare{$this->_dataClass['camelCase']}FetchOptions(\$fetchOptions);\n\$limitOptions = \$this->prepareLimitFetchOptions(\$fetchOptions);\n\nreturn \$this->_getDb()->fetchOne(\"\n SELECT COUNT(*)\n FROM `{$tableName}` AS {$tableAlias}\n \$joinOptions[joinTables]\n WHERE \$whereConditions\n\");\n\n "); $this->_addMethod("prepare{$this->_dataClass['camelCase']}Conditions", 'public', array('$conditions' => 'array $conditions = array()', '$fetchOptions' => 'array $fetchOptions = array()'), "\n\n\$sqlConditions = array();\n\$db = \$this->_getDb();\n\n "); foreach ($conditionFields as $conditionField) { $this->_addMethod("prepare{$this->_dataClass['camelCase']}Conditions", '', array(), "\n\nif (isset(\$conditions['{$conditionField}'])) {\n if (is_array(\$conditions['{$conditionField}'])) {\n if (!empty(\$conditions['{$conditionField}'])) {\n // only use IN condition if the array is not empty (nasty!)\n \$sqlConditions[] = \"{$tableAlias}.{$conditionField} IN (\" . \$db->quote(\$conditions['{$conditionField}']) . \")\";\n }\n } else {\n \$sqlConditions[] = \"{$tableAlias}.{$conditionField} = \" . \$db->quote(\$conditions['{$conditionField}']);\n }\n}\n\n "); } $this->_addMethod("prepare{$this->_dataClass['camelCase']}Conditions", '', array(), "\n\n\$this->_prepare{$this->_dataClass['camelCase']}ConditionsCustomized(\$sqlConditions, \$conditions, \$fetchOptions);\n\nreturn \$this->getConditionsForClause(\$sqlConditions);\n\n "); $this->_addMethod("prepare{$this->_dataClass['camelCase']}FetchOptions", 'public', array('$fetchOptions' => 'array $fetchOptions = array()'), "\n\n\$selectFields = '';\n\$joinTables = '';\n\n\$this->_prepare{$this->_dataClass['camelCase']}FetchOptionsCustomized(\$selectFields, \$joinTables, \$fetchOptions);\n\nreturn array(\n 'selectFields' => \$selectFields,\n 'joinTables' => \$joinTables\n);\n\n "); $orderChoices = array(); if (isset($this->_dataClass['fields']['display_order'])) { if (isset($this->_dataClass['fields']['lft'])) { $orderChoices['display_order'] = sprintf('%s.lft', $tableAlias); } else { $orderChoices['display_order'] = sprintf('%s.display_order', $tableAlias); } } $orderChoices = DevHelper_Generator_File::varExport($orderChoices); $this->_addMethod("prepare{$this->_dataClass['camelCase']}OrderOptions", 'public', array('$fetchOptions' => 'array $fetchOptions = array()', '$defaultOrderSql' => '$defaultOrderSql = \'\''), "\n\n\$choices = {$orderChoices};\n\n\$this->_prepare{$this->_dataClass['camelCase']}OrderOptionsCustomized(\$choices, \$fetchOptions);\n\nreturn \$this->getOrderByClause(\$choices, \$fetchOptions, \$defaultOrderSql);\n\n "); $this->_generateImageCode(); $this->_generatePhrasesCode(); $this->_generateOptionsCode(); $this->_generateParentCode(); return parent::_generate(); }
protected function _generate() { if (count($this->_dataClass['primaryKey']) > 1) { throw new XenForo_Exception(sprintf('Cannot generate %s: too many fields in primary key', $this->_info['controller'])); } $idField = reset($this->_dataClass['primaryKey']); $variableName = DevHelper_Generator_Code_Model::getVariableName($this->_addOn, $this->_config, $this->_dataClass); $variableNamePlural = DevHelper_Generator_Code_Model::getVariableNamePlural($this->_addOn, $this->_config, $this->_dataClass); $modelClassName = DevHelper_Generator_Code_Model::getClassName($this->_addOn, $this->_config, $this->_dataClass); $modelGetFunctionName = DevHelper_Generator_Code_Model::generateGetDataFunctionName($this->_addOn, $this->_config, $this->_dataClass); $dataWriterClassName = DevHelper_Generator_Code_DataWriter::getClassName($this->_addOn, $this->_config, $this->_dataClass); $viewListClassName = $this->_getViewClassName('list'); $viewEditClassName = $this->_getViewClassName('edit'); $viewDeleteClassName = $this->_getViewClassName('delete'); $imageField = DevHelper_Generator_Db::getImageField($this->_dataClass['fields']); list($templateList, $templateEdit, $templateDelete) = $this->_generateTemplates($variableName, $variableNamePlural, $imageField); $this->_setClassName($this->_info['controller']); $this->_setBaseClass('XenForo_ControllerAdmin_Abstract'); $actionIndexConditions = array(); $actionIndexFetchOptions = array(); if (isset($this->_dataClass['fields']['display_order'])) { $actionIndexFetchOptions['order'] = 'display_order'; } $actionIndexConditions = DevHelper_Generator_File::varExport($actionIndexConditions); $actionIndexFetchOptions = DevHelper_Generator_File::varExport($actionIndexFetchOptions); $this->_addMethod('actionIndex', 'public', array(), "\n\n\$conditions = {$actionIndexConditions};\n\$fetchOptions = {$actionIndexFetchOptions};\n\n\${$variableName}Model = \$this->_get{$this->_dataClass['camelCase']}Model();\n\${$variableNamePlural} = \${$variableName}Model->{$modelGetFunctionName}(\$conditions, \$fetchOptions);\n\n\$viewParams = array(\n '{$variableNamePlural}' => \${$variableNamePlural},\n);\n\nreturn \$this->responseView('{$viewListClassName}', '{$templateList}', \$viewParams);\n "); $this->_addMethod('actionAdd', 'public', array(), "\n\n\$viewParams = array(\n '{$variableName}' => array(),\n);\n\n ", '000'); $this->_addMethod('actionAdd', 'public', array(), "\n\nreturn \$this->responseView('{$viewEditClassName}', '{$templateEdit}', \$viewParams);\n\n ", '999'); $this->_addMethod('actionEdit', 'public', array(), "\n\n\$id = \$this->_input->filterSingle('{$idField}', XenForo_Input::UINT);\n\${$variableName} = \$this->_get{$this->_dataClass['camelCase']}OrError(\$id);\n\n\$viewParams = array(\n '{$variableName}' => \${$variableName},\n);\n\n ", '000'); $this->_addMethod('actionEdit', 'public', array(), "\n\nreturn \$this->responseView('{$viewEditClassName}', '{$templateEdit}', \$viewParams);\n\n ", '999'); $this->_addMethod('actionSave', 'public', array(), "\n\n\$this->_assertPostOnly();\n\n\$id = \$this->_input->filterSingle('{$idField}', XenForo_Input::UINT);\n\$dw = \$this->_get{$this->_dataClass['camelCase']}DataWriter();\nif (\$id) {\n \$dw->setExistingData(\$id);\n}\n\n ", '000'); $this->_addMethod('actionSave', 'public', array(), "\n\n\$this->_prepareDwBeforeSaving(\$dw);\n\n\$dw->save();\n\nreturn \$this->responseRedirect(\n XenForo_ControllerResponse_Redirect::SUCCESS,\n XenForo_Link::buildAdminLink('{$this->_info['routePrefix']}')\n);\n\n ", '999'); $this->_addMethod('actionDelete', 'public', array(), "\n\n\$id = \$this->_input->filterSingle('{$idField}', XenForo_Input::UINT);\n\${$variableName} = \$this->_get{$this->_dataClass['camelCase']}OrError(\$id);\n\nif (\$this->isConfirmedPost()) {\n \$dw = \$this->_get{$this->_dataClass['camelCase']}DataWriter();\n \$dw->setExistingData(\$id);\n \$dw->delete();\n\n return \$this->responseRedirect(\n XenForo_ControllerResponse_Redirect::SUCCESS,\n XenForo_Link::buildAdminLink('{$this->_info['routePrefix']}')\n );\n} else {\n \$viewParams = array(\n '{$variableName}' => \${$variableName},\n );\n\n return \$this->responseView('{$viewDeleteClassName}', '{$templateDelete}', \$viewParams);\n}\n\n "); $phraseNotFound = $this->_getPhraseName('_not_found'); $this->_addMethod("_get{$this->_dataClass['camelCase']}OrError", 'protected', array('$id', '$fetchOptions' => 'array $fetchOptions = array()'), "\n\n\${$variableName} = \$this->_get{$this->_dataClass['camelCase']}Model()->get{$this->_dataClass['camelCase']}ById(\$id, \$fetchOptions);\n\nif (empty(\${$variableName})) {\n throw \$this->responseException(\$this->responseError(new XenForo_Phrase('{$phraseNotFound}'), 404));\n}\n\nreturn \${$variableName};\n\n "); $this->_addMethod("_get{$this->_dataClass['camelCase']}Model", 'protected', array(), "\n\nreturn \$this->getModelFromCache('{$modelClassName}');\n\n "); $this->_addMethod(" _get{$this->_dataClass['camelCase']}DataWriter", 'protected', array(), "\n\nreturn XenForo_DataWriter::create('{$dataWriterClassName}');\n\n "); $this->_addCustomizableMethod('_prepareDwBeforeSaving', 'protected', array('$dw' => "{$dataWriterClassName} \$dw")); return parent::_generate(); }