CakePhp 2.x - модел на плъгин не се зарежда

Правя плъгин в CakePhp и използвам множество модели в него. Създадох тези модели с помощта на конзолата и ги изпекох. Сблъсках се с проблем, когато използвах 1 от тях и се появява само с този конкретен модел.

Името на файла на модела:
GamificationBadgeUnlockActionProgression.php

Съдържание на модела:

<?php
    App::uses('GamificationAppModel', 'Gamification.Model');

    class GamificationBadgeUnlockActionProgression extends GamificationAppModel {

    function __construct() {
        parent::__construct();
        echo 'oleej';
        exit;
    }

    public $belongsTo = array(
        'GamificationBadgeProgression' => array(
            'className' => 'GamificationBadgeProgression',
            'foreignKey' => 'gamification_badge_progression_id'
        ),
        'GamificationBadgeUnlockAction' => array(
            'className' => 'GamificationBadgeUnlockAction',
            'foreignKey' => 'gamification_badge_unlock_action_id'
        )
    );

    public function addMissingProgression($missingProgression)
    {
        /*$this->saveMany($missingProgression, array(
            'fieldlist' => array('gamification_badge_progression_id', 'gamification_badge_unlock_action_id')
        ));*/
    }
}

В контролера на плъгина имам:

public $uses = array('Gamification.GamificationBadge',
    'Gamification.GamificationBadgeProgression', 
    'Gamification.GamificationBadgeUnlockAction',
    'Gamification.GamificationBadgeUnlockActionProgression', 
    'Gamification.GamificationBadgeUnlockType');

Всички други модели се зареждат, с изключение на „Gamification.GamificationBadgeUnlockActionProgression“. Което е много странно. Има всички необходими неща и следва конвенциите за именуване и всичко останало. Просто не се зарежда, тъй като конструкторът никога не се извиква и ехото никога не се показва.

Когато извикам функцията от модела по този начин с масив като параметър:

    $this->GamificationBadgeUnlockActionProgression->addMissingProgression($missingProgression);

След това получавам грешка

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'addMissingProgression' at line 1

Тъй като моделът не е зареден.
CakePhp обаче създава магически модел със същото име, което води до грешката по-горе, тъй като моделът магически съществува, но функцията, разбира се, не съществува, както и отношенията.

Какво ми липсва тук?


person DijkeMark    schedule 24.04.2014    source източник
comment
можете да проверите дали моделът е зареден или не от ClassRegistry::isKeySet('Name of your model');   -  person Fazal Rasel    schedule 24.04.2014
comment
Така е, защото cakephp създава негова магическа версия   -  person DijkeMark    schedule 24.04.2014


Отговори (1)


Този вид грешка се хвърля, когато моделът не е правилно зареден, той се опитва да изпълни метода като SQL функция, която очевидно не съществува. В горната част на вашия контролер проверете дали има:

App::uses('GamificationBadgeUnlockActionProgression', 'Gamification.Model');

Това, комбинирано с Gamification.GamificationBadgeUnlockActionProgression в масива $uses, който вече имате, трябва да е достатъчно, за да се зареди. Ако все още не успее, в краен случай можете ръчно да го заредите във вашия метод, като използвате резервен вариант като:

if (!is_object($this->GamificationBadgeUnlockActionProgression)) {
    ClassRegistry::init('Gamification.GamificationBadgeUnlockActionProgression');
    $this->GamificationBadgeUnlockActionProgression = new GamificationBadgeUnlockActionProgression();
}

Това ще зареди ръчно модела и ще създаде екземпляр за него под $this->GamificationBadgeUnlockActionProgression.

Изглежда също така има грешка в асоциациите в модела, той трябва да включва префиксите на приставката, като:

public $belongsTo = array(
    'GamificationBadgeProgression' => array(
        'className' => 'Gamification.GamificationBadgeProgression',
        'foreignKey' => 'gamification_badge_progression_id'
    ),
    'GamificationBadgeUnlockAction' => array(
        'className' => 'Gamification.GamificationBadgeUnlockAction',
        'foreignKey' => 'gamification_badge_unlock_action_id'
    )
);
person Oldskool    schedule 24.04.2014
comment
Няма, ако работи. И ръчното зареждане също не работи, защото CakePHP създава магически модел със същото име. Мога да използвам всички функции по подразбиране, като $this-›GamificationBadgeUnlockActionProgression-›find('all'), но не мога да създам моя тогава, разбира се - person DijkeMark; 24.04.2014
comment
Дори по-добре, когато се опитам да го заредя ръчно, както казвате, което трябва да работи, връща грешка: Класът „GamificationBadgeUnlockActionProgression“ не е намерен - person DijkeMark; 24.04.2014
comment
@DijkeMark Може да е свързано с грешка, която току-що забелязах във вашия модел, може да доведе до неправилно зареждане на модела, защото асоциациите изглеждат неправилни. Вижте моя актуализиран отговор за коригиране на това. - person Oldskool; 24.04.2014
comment
Добре, сега изглежда работи. Добавянето на плъгина преди името на класа свърши работа. Все още е странно, защото другите модели в плъгина не се нуждаеха от това, за да работят - person DijkeMark; 24.04.2014