Как вызывать нужную функцию в Джумле? PHP

12
D
На сайте с 28.06.2008
Offline
1101
490

Есть самописный компонент фирм в Джумле, все работает.

Когда-то давно при наполнении базы, не у всех фирм через геокодер Яндекса точно определились адреса.

В недрах компонента фирм есть специальная функция которая чекает адрес через геокодер, определяет район города, ближайшее метро и все записывает в базу.

Если переопределять такие адреса через админку - все нормально обрабатывает. Но таких адресов оч. много, вручную не вариант.

В админке я добавляю адреса через форму, вот ее код:

<div id="modal-address">
<form class="add-address" method="post" action="/administrator/index.php">
<div class="msg"></div>
<input type="text" name="geo_code" style="width: 500px; padding: 3px;" placeholder="г. Москва ул. Ленина 72" value="" />
<input type="hidden" name="item_id" value="<?php echo $this->item->id; ?>" />
<input type="hidden" name="option" value="com_firm">
<input type="hidden" name="controller" value="action">
<input type="hidden" name="view" value="action">
<input type="hidden" name="format" value="raw">
<input type="hidden" name="task" value="addAddress">
<input type="submit" name="submit" style="padding: 3px 7px;" value="Добавить">
</form>
</div>

Насколько я понимаю форма передает введенный мной адрес - geo_code

и id фирмы - $this->item->id;

Далее я нашел в недрах админки эту функцию, она конечно огромная

	function addAddress()

{
$response = array();
$item_id = JRequest::getVar('item_id');
$geo_code = JRequest::getVar('geo_code');
if(!empty($geo_code))
{
$xml = simplexml_load_file('http://geocode-maps.yand ................................

Насколько я опять понимаю, на вход она принимает адрес и id фирмы которые приходят через форму.

Далее решил написать скрипт для автоматизации задуманного


<?php

set_time_limit(0);
const _JEXEC = 1;
error_reporting(E_ALL | E_NOTICE);
ini_set('display_errors', 1);
if (!defined('_JDEFINES')) {
define('JPATH_BASE', dirname(__FILE__)); // если не в корне - добавить выше сколько надо
require_once JPATH_BASE . '/includes/defines.php';
}
require_once JPATH_LIBRARIES . '/import.legacy.php';
require_once JPATH_LIBRARIES . '/cms.php';
// Load the configuration
require_once JPATH_CONFIGURATION . '/configuration.php';
$db = JFactory::getDBO();
$query = $db->getQuery(true);

$db->setQuery("SELECT item_id,geo_code FROM `firm_address` WHERE `locality` = '' limit 1");
$result = $db->loadObjectlist();

foreach ($result as $item){

//и вот тут я застрял как передать $item->item_id и $item->geo_code из самописного скрипта в корне сайта в функцию addAddress в админке ?

}
Gerga
На сайте с 02.08.2015
Offline
94
#1

Dram, вариантов 2:

1. Делать post запросы на обработчик формы;

2. Временно отредактировать метод addAddress:


function addAddress($item_id, $geo_code)
{
$response = array();
//$item_id = JRequest::getVar('item_id');
//$geo_code = JRequest::getVar('geo_code');

И вызывать указывая item_id и geo_code.

Второй вариант лучше.

D
На сайте с 28.06.2008
Offline
1101
#2

Да, но я не могу понять как вызывать функцию из другого самописного скрипта?

В него нужно инклюдить файл с функцией?

Gerga
На сайте с 02.08.2015
Offline
94
#3
Dram:
В него нужно инклюдить файл с функцией?

Да. Но как правильнее это делать в Joomla - я не знаю.

---------- Добавлено 03.09.2019 в 12:56 ----------

Можете найти место где вызывается метод addAddress и временно вставить ваш foreach.

IL
На сайте с 20.04.2007
Offline
435
#4
Dram:
Далее я нашел в недрах админки эту функцию, она конечно огромная

Смотря где "в недрах админки". И смотря что она ещё использует.

Если не слишком завязана на Joomla и JRequest::getVar - самое "завязанное", то как и предлагает Gerga, можно её слегка подправить..

Только я бы с сохранением "обратной совместимости" сделал как-то так:


function addAddress($item_id=null, $geo_code=null)
{
$response = array();
$item_id or $item_id = JRequest::getVar('item_id');
$geo_code or $geo_code = JRequest::getVar('geo_code');
... :) Облачные серверы от RegRu - промокод 3F85-3D10-806D-7224 ( http://levik.info/regru )
D
На сайте с 28.06.2008
Offline
1101
#5
Gerga:
Можете найти место где вызывается метод addAddress и временно вставить ваш foreach.

Мысль интересная, а запустить к исполнению все это добро тогда как?

Так я обычно пишу че нить простенькое, кладу в корень и через консоль запускаю:

php script.php



---------- Добавлено 03.09.2019 в 15:27 ----------

Инлюднул нужный вайл

require_once JPATH_BASE . '/administrator/components/com_firm/models/action.php';

и попробовал вызвать так

foreach ($result as $item){

addAddress($item->item_id, $item->geo_code);

}

Получил

Error: Failed to start application: Call to undefined function addAddress()

Функцию предварительно поправил, как советовал ivan-lev

function addAddress($item_id=null, $geo_code=null)
{
$response = array();
$item_id or $item_id = JRequest::getVar('item_id');
$geo_code or $geo_code = JRequest::getVar('geo_code');
if(!empty($geo_code))
{
Gerga
На сайте с 02.08.2015
Offline
94
#6
Dram:
Мысль интересная, а запустить к исполнению все это добро тогда как?

Так же, как вы переопределяете адреса через админку. Т.е. в форме из старттопика нажать на "Добавить" и таким образом запустите.

Dram:
Получил
Error: Failed to start application: Call to undefined function addAddress()r

Да, потому что addAddress - это метод класса. Вам необходимо определить что это за класс. Создать объект и вызвать метод addAddress.

IL
На сайте с 20.04.2007
Offline
435
#7
Dram:
Инлюднул нужный вайл

Вангую одно или больше из трёх:

- не тот нужный файл (в котором на самом деле нет функции),

- функция - это не функция, а метод внутри класса.

- с неймспейсами чехарда..

D
На сайте с 28.06.2008
Offline
1101
#8
Gerga:
Да, потому что addAddress - это метод класса. Вам необходимо определить что это за класс. Создать объект и вызвать метод addAddress.

Посмотрел, нужна функция находится внутри класса

class FirmModelAction extends JModelLegacy
{
..............

Как ее тогда вызвать?

Gerga
На сайте с 02.08.2015
Offline
94
#9

Dram,


$firm = new FirmModelAction();
$firm->addAddress();

Попробуйте. Если будет ошибка, покажите метод __construct.

D
На сайте с 28.06.2008
Offline
1101
#10

Gerga, большое спасибо, все сработало!

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий