Init modello di risorse che non funziona - Tornando non oggetto
-
16-10-2019 - |
Domanda
Sto tentando di estendere la parte Crawler del modulo Enterprise pagecache, però, sto ottenendo il seguente errore, credo che abbia a che fare con la linea di $ this -> _ init ( 'vmr_crawler / crawler'); trovato nel mio modello, dico questo perché se passo fuori vmr_crawler, con enterprise_pagecache, funziona ... Ecco l'errore
Fatal error: Call to a member function getUrlsPaths() on a non-object in /jlr/sites/mage/app/code/local/VMR/Crawler/Model/Crawler.php on line 37
Tutte le idee, frammenti, i commenti sono molto apprezzate! Grazie mille, sto inviando tutto il mio codice qui sotto.
Il mio modulo di configurazione
app/etc/modules/VMR_Crawler.xml
Il mio modulo di codice di configurazione
<?xml version="1.0"?>
<config>
<modules>
<VMR_Crawler>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_Core/>
</depends>
</VMR_Crawler>
</modules>
Il mio Config
app/code/local/VMR/Crawler/etc/config.xml
Il mio Config Codice
<?xml version="1.0"?>
<config>
<modules>
<VMR_Crawler>
<version>0.0.1</version>
</VMR_Crawler>
</modules>
<global>
<models>
<vmr_crawler>
<class>VMR_Crawler_Model</class>
<resourceModel>vmr_crawler_resource</resourceModel>
</vmr_crawler>
<vmr_crawler_resource>
<class>VMR_Crawler_Model_Resource</class>
</vmr_crawler_resource>
<pagecache>
<rewrite>
<crawler>VMR_Crawler_Model_Crawler</crawler>
</rewrite>
</pagecache>
<pagecache_resource_crawler>
<rewrite>
<attribute>VMR_Crawler_Model_Resource_Crawler</attribute>
</rewrite>
</pagecache_resource_crawler>
</models>
</global>
</config>
Il mio modello
app/code/local/VMR/Crawler/Model/Crawler.php
Il mio Codice Modello
<?php
class VMR_Crawler_Model_Crawler extends Enterprise_PageCache_Model_Crawler
{
protected function _construct()
{
$this->_init('vmr_crawler/crawler');
}
public function crawl()
{
if (!Mage::app()->useCache('full_page')) {
return $this;
}
$storesInfo = $this->getStoresInfo();
$adapter = new Varien_Http_Adapter_Curl();
foreach ($storesInfo as $info) {
$options = array(CURLOPT_USERAGENT => self::USER_AGENT);
$storeId = $info['store_id'];
$this->_visitedUrls = array();
if (!Mage::app()->getStore($storeId)->getConfig(self::XML_PATH_CRAWLER_ENABLED)) {
continue;
}
$threads = (int)Mage::app()->getStore($storeId)->getConfig(self::XML_PATH_CRAWLER_THREADS);
if (!$threads) {
$threads = 1;
}
if (!empty($info['cookie'])) {
$options[CURLOPT_COOKIE] = $info['cookie'];
}
$urls = array();
$baseUrl = $info['base_url'];
$urlsCount = $totalCount = 0;
$urlsPaths = $this->_getResource()->getUrlsPaths($storeId);
foreach ($urlsPaths as $urlPath) {
$url = $baseUrl . $urlPath;
$urlHash = md5($url);
if (isset($this->_visitedUrls[$urlHash])) {
continue;
}
$urls[] = $url;
$this->_visitedUrls[$urlHash] = true;
$urlsCount++;
$totalCount++;
if ($urlsCount == $threads) {
$adapter->multiRequest($urls, $options);
$urlsCount = 0;
$urls = array();
}
}
if (!empty($urls)) {
$adapter->multiRequest($urls, $options);
}
}
return $this;
}
}
Il mio Modello di risorse
app/code/local/VMR/Crawler/Model/Resource/Crawler.php
La mia risorsa Modello Codice
<?php
class VMR_Crawler_Model_Resource_Crawler extends Enterprise_PageCache_Model_Resource_Crawler
{
/**
* Retrieve URLs paths that must be visited by crawler
*
* @param $storeId
* @return array
*/
public function getUrlsPaths($storeId)
{
$bWorked = false;
$collection = array();
for($i = 0; $i < 3; $i++)
{
echo "hi";
try {
$adapter = $this->_getReadAdapter();
$select = $adapter->select()
->from($this->getTable('core/url_rewrite'), array('request_path'))
->where('store_id=?', $storeId)
->where('is_system=1');
$collection = $adapter->fetchCol($select);
$bWorked = true;
}
catch(Exception $ex)
{
}
if($bWorked == true)
{
break;
}
}
return $collection;
}
}
Il mio Modello di risorse MySQL4 Classe
app/code/local/VMR/Crawler/Model/Mysql4/Crawler.php
Il mio Modello di risorse MySQL4 Codice Classe
<?php
class VMR_Crawler_Model_Mysql4_Crawler extends Enterprise_PageCache_Model_Resource_Crawler
{
}
Il mio Shell Class Testing Per
shell/crawler.php
Il mio Shell Classe Per testare il codice
<?php
/**
* Full Page Cache Warming Shell Script
*
* @author Jeffrey L. Roberts
**/
require_once 'abstract.php';
class Mage_Shell_Crawler extends Mage_Shell_Abstract
{
/**
* Run script
*
*/
public function run()
{
// echo "Starting Crawler";
$crawler = new VMR_Crawler_Model_Crawler();
$crawler->crawl();
// echo "Crawler finished";
}
/**
* Retrieve Usage Help Message
*
*/
public function usageHelp()
{
return <<<USAGE
Usage: php -f crawler.php
USAGE;
}
}
$shell = new Mage_Shell_Crawler();
$shell->run();
Per eseguire la shell
cd shell
php -f crawler.php
Soluzione
salto nel buio qui, come il tuo post è un po 'denso e non sono sicuro che ho visto chiunque si estendono sia una risorsa di modello e l'override del metodo _construct
in entrambi, ma la linea 37 che PHP si lamenta sguardi di essere
$urlsPaths = $this->_getResource()->getUrlsPaths($storeId);
che è sostenuta dal vostro messaggio di errore
Fatal error: Call to a member function getUrlsPaths() on a non-object in /jlr/sites/mage/app/code/local/VMR/Crawler/Model/Crawler.php on line 37
Quindi Magento sta cercando di creare un'istanza di risorsa del tuo modello, ma non può. Quindi, se siete alla ricerca di un punto di partenza, provate a tracciare il percorso del codice di
$o = Mage::getModelResource('vmr_crawler/crawler');
e determinare il motivo per cui la sua falsa ritorno.
A poche congetture su quella. In primo luogo, di aver incluso un
<deprecatedNode>vmr_crawler_mysql4</deprecatedNode>
ma non hanno alcun nodo vmr_crawler_mysql4
nel file XML. Perché è questo qui?
In secondo luogo, il vostro modello di risorse per il crawler sembra essere l'inizializzazione con un core/url_rewrite
?
protected function _construct()
{
$this->_init('core/url_rewrite', 'url_rewrite_id');
}
Non sono sicuro di quello che dovrebbe fare, ma sembra fuori (poi di nuovo, io non sono esattamente chiaro su ciò che si sta cercando di fare qui, e non ho alcuna versione Enterprise disponibili al momento)