Модель ATK4 не найдена при переходе в онлайн

Я разрабатываю веб-сайт с использованием 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)!