Я разрабатываю веб-сайт с использованием ATK4, php-рамки с jquery .
Я разработал это на своем ноутбуке, используя localhost / test1 как каталог и локальную базу данных php.
Если я переведу все каталоги онлайн и импортирую базу php на свой веб-хост, большинство страниц работают, но на одном, я получаю сообщение об ошибке на одной из страниц, указывающей
Неустранимая ошибка: класс 'model_TaskType' не найден в /homepages/4/d184034614/htdocs/paperless/atk4/lib/AbstractObject.php в строке 131
Строка, указанная в AbstractObject.php, является частью функции добавления.
Модель присутствует, и точно такой же код работает на localhost. На других страницах также есть модели и, похоже, работают нормально. Таблица имеет ту же структуру в обеих базах данных.
Модель не напрямую ссылается на страницу с проблемой, она является refModel для модели, на которую ссылаются. Есть ли какой-то путь, который не присутствует на локальном хосте?
Модель TaskType выглядит как этот класс Model_TaskType extends Model_Table {public $ entity_code = 'vscrum_tasktype'; public $ table_alias = 'ty';
function init(){ parent::init(); $this->addField('id')->mandatory(true); $this->addField('name')->mandatory(true); $this->addField('budget_code')->mandatory(true); $this->addField('colour_desc')->refModel('model_Colour'); $this->addField('project_id'); $this->addField('team_id'); $this->addField('company_id'); $this->addCondition('team_id',$this->api->getTeamID()); } }
и модель задачи, которая добавляется на страницу с проблемой, выглядит так:
class Model_Task extends Model_Table { public $entity_code='vscrum_task'; public $table_alias='tk'; function init(){ parent::init(); // debug causes error in Ajax in ATK v4.1.1 // $this->debug(true); $this->addField('id')->system(true)->visible(false); $this->addField('story_id')->system(true)->visible(false); $this->addField('backlog_ref')->system(true)->visible(false); $this->addField('sprint_id')->system(true)->visible(false); $this->addField('team_id')->system(true)->visible(false); $this->addField('status')->defaultValue('I')->visible(false); $this->addField('task_desc')->mandatory(true)->visible(true); $this->addField('points')->mandatory(true)->defaultValue(1)->datatype('numeric'); $this->addField('member_id')->mandatory(true)->refModel('model_Member'); // join colour $this->addRelatedEntity('ty','vscrum_tasktype','tasktype_id','left'); //tasktype $this->addField('tasktype_id')->refModel('model_TaskType')->mandatory(true); } }
Возможно, я пропустил что-то очевидное, любые идеи, почему это будет нормально работать на localhost, но сломать мой веб-хост?
Class 'model_TaskType' not found in
вы всегда должны использовать точную капитализацию.
если у вас есть Model_TaskType, он должен быть Model_TaskType при добавлении в CRUD.
также это место:
$this->addField('tasktype_id')->refModel('model_TaskType')->mandatory(true);
должно быть:
$this->addField('tasktype_id')->refModel('Model_TaskType')->mandatory(true);
На вдовах капитализация имени файла не имеет значения, где это происходит в Linux.
по моему опыту с ATK4 (v4.1.3) эта ошибка, скорее всего, представляет собой проблему с учетом чувствительности к регистру и поиска папок.
поскольку ATK4 PathFinder является ответственным за загрузку всех классов, когда вы add()
объект, например Model_UserAccess
он ищет различные местоположения, в частности: Model/UserAccess.php
затем include()
файл, а затем создает экземпляр класса Model_UserAccess
внутри него что-то вроде return new Model_UserAccess()
.
PathFinder меняет все экземпляры подчеркивания _
на /
и пересекает места соответственно.
поэтому, декларация что-то вроде этого:
class Model_UserAccess extends Model_Table
и добавив его:
$m = $this->add('Model_UserAccess');
ищет и загружает два файла (не в определенном порядке), 1 из: /Model/Table.php
и 2 из: /Model/UserAccess.php
как только вам станет комфортно с этой концепцией разделения папок, разработка в ATK4 будет намного проще.
У меня сам есть /lib/Model/
и /lib/Form/
и даже a /lib/Form/Field/
так как я также переопределяю до уровня поля. Последний выглядел бы примерно так:
class Form_Field_GraduatedSlider extends Form_Field
Хорошо, кажется немного странным, но это то, что я нашел.
У меня есть модель под названием Task, которая расширяет таблицу.
class Model_Task extends Model_Table { public $entity_code='vscrum_task'; public $table_alias='tk'; function init(){ parent::init(); $this->addField('id')->system(true)->visible(false); $this->addField('story_id')->system(true)->visible(false); $this->addField('backlog_ref')->system(true)->visible(false); $this->addField('status')->defaultValue('I')->visible(false); $this->addField('task_desc')->mandatory(true)->visible(true); $this->addField('member_id')->mandatory(true)->refModel('model_Member'); // join colour $this->addRelatedEntity('ty','vscrum_tasktype','tasktype_id','left'); //tasktype $this->addField('tasktype_id')->refModel('model_TaskType')->mandatory(true); }
У меня есть модель под названием ScrumwallTask, которая расширяет задачу
class Model_ScrumwallTask extends Model_Task { function init(){ parent::init(); $this->addField('status')->defaultValue('I')->system(true); $this->addField('colour_desc')->datatype('text')->calculated(true); $this->addField('status')->visible(true); } function calculate_colour_desc(){ return $this->api->db->dsql() ->table('vscrum_colour') ->where('id=ty.colour_id') ->field('colour_desc') ->select(); } }
ScrumwallTask вызывает parent :: init, поэтому я предположил, что он получит все поля, добавленные в Task
Я избавился от ошибки, дублируя addField для tasktype_id в ScrumwallTask, хотя он уже определен в родительской задаче.
$ This-> AddField ( 'tasktype_id') -> refModel ( 'Model_TaskType');
Это искомое поведение для наследования моделей? Что действительно запутывает, так это то, что он отлично работал на localhost (Windows 7)!