Пример #1
0
 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();
 }
Пример #2
0
 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();
 }
Пример #3
0
 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();
 }
Пример #4
0
 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();
 }