CakePHP: issues with different model and used table names - cakephp

I'm having a problem where I get an error saying,
Error: Database table catalog_product_entity for model CatalogProductEntity was not found.
I want the model MagentoCatalogProductEntity to use the table catalog_product_entity, but why is it looking for the model named after the table I defined, instead of the actual model name, MagentoCatalogProductEntity?
I have...
magento_catalog_product_entity.php
class MagentoCatalogProductEntity extends AppModel {
public $name = 'MagentoCatalogProductEntity';
public $useTable = 'catalog_product_entity';
...
}
magento_catalog_product_entity_controller.php
class MagentoCatalogProductEntityController extends AppController {
public $name = 'MagentoCatalogProductEntity';
....
}
Note that this works, could it be some bug where if the model name and $useTable share similar names, it doesn't work properly?
test.php
class Test extends AppModel {
public $name = 'Test';
public $useTable = 'catalog_product_entity';
...
}
EDIT 2013-06-12
I couldn't figure out what was wrong with the setup I provided above. I am currently just using the following.. I really want that "magento" prefix in the file and class names, but this will do for now.
catalog_product_entity.php
class CatalogProductEntity extends AppModel {
public $name = 'CatalogProductEntity';
public $useTable = 'catalog_product_entity';
...
}
catalog_product_entity_controller.php
class CatalogProductEntityController extends AppController {
public $name = 'CatalogProductEntity';
....
}

Related

Laravel ORM relation return data as array instead of object

I was trying to get the relational model data like
{{$OrderInfo->CustomerInfo->Phone}}
but it's giving error like
Trying to get property of non-object
While we can easily access the returned data like
{{$OrderInfo->CustomerInfo['Phone']}}
My work is temporarily working, but I was not satisfied. It should worked to access the data as an object. Because, I think that is right process to access the data. Please can anyone help me to come out from the problem.
Thanks so much in advance for your valuable time!
Order, Customer Model & My Controller Code given below
use Carbon\Carbon;
use App\OrderInfo;
use App\CustomerInfo;
use Mail;
class AdminOrderController extends Controller
{
public function index(Request $request)
{
$Orders = OrderInfo::orderBy('OrderDate', 'DESC')->get();
return view('admin.admin-order-list', [
'Orders' => $Orders,
]);
}
}
namespace App;
use Illuminate\Database\Eloquent\Model;
class OrderInfo extends Model
{
protected $table = 'order_info';
public $timestamps = false;
protected $primaryKey = 'OrderId';
public function CustomerInfo()
{
return $this->belongsTo('App\CustomerInfo', 'CustomerID');
}
}
namespace App;
use Illuminate\Database\Eloquent\Model;
class CustomerInfo extends Model
{
protected $table = 'customer_info';
public $timestamps = false;
protected $primaryKey = 'CustomerID';
protected $fillable = ['CustomerID','Phone'];
public function OrderInfo()
{
return $this->belongsTo('App\OrderInfo', 'CustomerID');
}
}

Extending CakePHP's AppController with functions from other classes

I wan't to extend the default AppController class by function from another class from the 'library' folder inside the application root.
On this moment I can reach the class and his function by adding a #property declaration above my class definition like below. But when I run the application it's returning a Call to a member function showTest() on boolean exception. Is this because I've not declared a namespace or something in that way?
// Default class inside 'root/src/Controller/'
/**
* Class AppController
*
* #property testControl $testControl
*
* #package App\Controller
*/
class AppController extends Controller
{
public function initialize() {
parent::initialize();
}
public function beforeFilter(Event $event) : void
{
$this->testControl->showTest();
}
}
// The class inside folder 'root/library/'
class testControl
{
public function showTest() {
die("test");
}
}
You need to create a new instance of the testControl object before calling the method:-
public function beforeFilter(Event $event) : void
{
$testControl = new testControl;
$testControl->showTest();
}
The PHP error you are seeing is because you haven't initiated the object and $this->testControl hasn't been defined.
You will also need to make sure you tell PHP where to find the testControl class by adding a use statement at the top of your file or referencing the namespace when initiating the object.

CakePhp find doesn't fetch hasMany relationships

I've got these simple models:
// ActivityLog
class ActivityLog extends AppModel {
public $name = 'ActivityLog';
public $useTable = "activity_logs";
public $hasMeny = array("ActivityLogMedia");
}
// ActivityLogMedia
class ActivityLogMedia extends AppModel {
public $name = 'ActivityLogMedia';
public $useTable = "activity_logs_media";
public $belongsTo = array('ActivityLog','Media');
}
// Media
class Media extends AppModel {
public $name = 'Media';
public $useTable = "media";
public $hasMeny = "ActivityLogMedia";
}
when I try to do this find:
$this->ActivityLog->find('all', array(
'conditions' => array('ActivityLog.id' => $ret['ActivityLog']['id']),
'recursive' => 2
));
Cake doesn't return any ActivityLog associated models.
Can anybody give me an explanation and/or a solution?
You have a typo, $hasMeny should be $hasMany.

using soap client in model

I should get the available products list and their prices from another server by WSDL (and NuSOAP).
No views is needed (and no controllers I think); So I create a model with no tables (because I don't want to store server data)
And use App:import('Vendor', 'path_to_nusoap.php') at the beginning of my model file.
Let's see my model:
<?php
App::uses('AppModel', 'Model');
App::import('Vendor', 'nusoap' . DS . 'nusoap.php');
/**
* MyModel Model
*
*/
class MyModel extends AppModel {
public $useTable = false;
public $client = new nusoap_client('url', 'WSDL');
public function products(){
$products = $client->call('getProductsList');
////
return $products;
}
public function prices(){
$prices = $client->call('getPricesList');
////
return $prices;
}
}
but it causes an error (on that line: public $client)
Now, the questions:
How to solve that error? (use a contractor function?)
Am I wrong to use this functions on model? (instead of controller)
Sorry for my terrible English.
Thanks.
you cannot create an object outside of a method scope!
use a constructor:
public $Client;
public function __construct() {
$this->Client = new nusoap_client('url', 'WSDL');
}
public function products() {
$products = $this->Client->call('getProductsList');
return $products;
}

how to call methods within a class which is in a controller extension class?

I am trying to write a test class for a controller extension. This controller extension has another class in it . And this class has a few methods.
public class Extension_Account
{
public Extension_Account(ApexPages.StandardController controller)
{
public class Class1
{
public Class1()
{
/ * code here*/
}
public String getMethod()
{
/* code here */
}
}
}
}
How can i access the method getMethod in my test class?
In my test class i am able to access the contructor for Class1 but not sure how to get to the other method
public with sharing class TestExtension_Account
{
static testMethod void TestPrint()
{
Account a = new Account();
//a.Name='Test Account';
a.FirstName='TestFirst Name';
a.LastName='Test Last Name';
a.BillingStreet='Test billing Street';
a.BillingCity='Test Billing City';
a.BillingState='Test Billing State';
a.BillingCountry='Test Billing country';
a.BillingPostalCode='Test PostCode';
insert a;
PageReference pageRef = Page.printaddressaccount;
pageRef .getParameters().put('id',a.id);
Test.setCurrentPageReference(pageRef);
ApexPages.StandardController controller = new ApexPages.StandardController(a);
Extension_Account ae = new Extension_Account(controller);
ae.getClass1();
ae.getMethod()// gives a compiler error Method does not exist or incorrect signature
}
}
If your extension class has a getClass1() method that returns an instance of Class1, then you can access the methods from that instance, e.g. ae.getClass1().getMethod();

Resources