UMIhelp

Разработка дополнительного функционала => Разработка модулей => Тема начата: chuikoff от 02 Сентября 2012, 14:42:27

Название: Получение данных страницы по значению дополнительного поля.
Отправлено: chuikoff от 02 Сентября 2012, 14:42:27
Добрый день! У меня сайт на UMI Start, там есть страницы, и у них есть доп.поле kod_tovara. Так же у меня есть готовый скрипт с циклом, который по очереди выдаёт код товара из распарсеного файла. Как мне по этому коду товара найти страницу с соответствующим кодом, и получить остальные данные этой страницы (интересует именно изображение, ссылка и текст).?

Готов заплатить за решение этой задачи, ссылки продублированы, здесь (http://hashcode.ru/questions/142370/php-%D0%BF%D0%BE%D0%BB%D1%83%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D1%81%D1%82%D1%80%D0%B0%D0%BD%D0%B8%D1%86%D1%8B-%D0%BF%D0%BE-%D0%B4%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D0%BC%D1%83-%D0%BF%D0%BE%D0%BB%D1%8E-%D0%B2-umi) и здесь (http://freelance.ru/projects/157217/) (тут можно скачать скрипт).

Вобщем мне нужно этот скрипт сделать как макрос или модуль для UMI, чтобы вывести его потом на сайте.  Попытки сделать модуль привели к тому что из админки он не запускается, при удалении и установке пустой экран. Времени разбираться нет, очень надеюсь на вашу помощь, отблагодарю!
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: admin от 02 Сентября 2012, 22:58:40
Вам идеально подойдет usel запрос, без всякого программирования.
То есть просто создаете usel файл, который будет выбирать из базы страницы определенного типа данных со значением в поле kod_tovara равным заданному вами. О том как писать usel уже много описалось в том числе и тут на форуме ищи по запросу usel, ну или начни с документации по usel протоколу (http://help-dev.umi-cms.ru/chapter.XSLTTemplates.usel.html), там достаточно понятно расписано, а примеры в сети есть

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

Если вас интересен именно вариант, чтобы кто-то реализовал это для вас, то тогда пишите в раздел вакансии, все предложения по работе туда.
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: chuikoff от 03 Сентября 2012, 09:02:43
<udata generation-time="0.0">
<error>
<![CDATA[
You don't have permissions to call protocol "usel://" via HTTP
]]>
</error>
</udata>

Как исправить?
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: admin от 03 Сентября 2012, 10:26:48
внимательно просмотреть документацию, в самом начале пишется следующее
Цитировать
Замечание

Для версий до 2.8: если на запрос http://ваш_сайт/usel/имя_шаблона отображается сообщение, что протокол USel недоступен, создайте в корневой папке сайта пустой файл с именем scheme.usel.allow и обновите страницу.

Для версий, начиная с 2.8: необходимо указать параметр usel.http.allow = "1" в файле config.ini в секции [streams] (см. Секция [streams] (http://help-dev.umi-cms.ru/part.Config.streams.html)).

Название: Re:Получение данных страницы по значению до&#
Отправлено: chuikoff от 03 Сентября 2012, 12:55:32
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="usel" method="get-page" generation-time="0.027011">
<page id="78" parentId="75" link="/menu/salad/russkij_raznosol/" is-active="1" object-id="389" type-id="111" update-time="1346213250" alt-name="russkij_raznosol" xlink:href="upage://78">
<basetype id="24" module="news" method="item">Новости</basetype>
<name>Русский разносол</name>
</page>
<total>1</total>
</udata>

А как получить поле изображения?
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: admin от 03 Сентября 2012, 14:16:42
если вы работатете с tpl шаблонами то макрос %data doSelection()% решит ваш вопрос, прочитайте по нему, если не получиться пишите.

Если работатет с xslt, то на форуме уже обсуждались такие случаи, например тут http://umihelp.ru/forum/index.php/topic,539.msg1560.html#msg1560
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: chuikoff от 03 Сентября 2012, 14:31:04
Мы видимо по-разному смотрим на решение задачи. Я написал скрипт, он всё нормально выводит в файле. Я получаю данные в xml, либо json, но проблема в том что не получается спарсить json, и с xml тоже, чтобы сразу в скрипте использовать данные.

Кстати, как в шаблон потом вставить этот скрипт. xslt
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: chuikoff от 03 Сентября 2012, 15:23:00
Может быть есть более простой способ получить картинку по id страницы например?
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: admin от 03 Сентября 2012, 16:19:10

Цитировать
Я написал скрипт, он всё нормально выводит в файле
то есть вы написали свой кастом? или вы все же пользуетесь usel протоколом?

Цитировать
Я получаю данные в xml, либо json, но проблема в том что не получается спарсить json, и с xml тоже, чтобы сразу в скрипте использовать данные

как вы вызываете эти данные (и какой технологией в шаблоне или через js или еще как) какие данные к вам приходят и что вы хотите получить в итоге?

Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: chuikoff от 04 Сентября 2012, 03:59:52

то есть вы написали свой кастом? или вы все же пользуетесь usel протоколом?

как вы вызываете эти данные (и какой технологией в шаблоне или через js или еще как) какие данные к вам приходят и что вы хотите получить в итоге?



У меня написан скрипт, который обращается к результату который выдаёт usel протокол, просто сторонний файл с file_get_contents()

Приходят ко мне данные такие:

<?xml version="1.0" encoding="utf-8"?>
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="usel" method="get-page" generation-time="0.027290">
  <page id="78" parentId="75" link="/menu/salad/russkij_raznosol/" is-active="1" object-id="389" type-id="111" update-time="1346213250" alt-name="russkij_raznosol" xlink:href="upage://78">
    <basetype id="24" module="news" method="item">Новости</basetype>
    <name>Русский разносол</name>
  </page>
  <total>1</total>
</udata>
<!-- This page generated in 0.150447 secs -->

Но в этих данных нет значений полей, или картинки.

Я тут ещё нашёл фреймворк uf.php, насколько я понял, я могу в соседней директории создать приложение, обращаться к фреймворку, брать данные из БД даже без протокола usel, и получать все данные, а потом в шаблоне подключить этот скрипт?! Как подключаются сторонние скрипты, с помощью какой команды xslt?
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: chuikoff от 04 Сентября 2012, 04:08:27
И как открыть доступ по url к своему стороннему скрипту?
Ещё вижу что можно просто подключить к стороннему скрипту файл standalone.php и с помощью его API делать выборки.
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: admin от 04 Сентября 2012, 04:44:39
Оу-оу-оу какой-то очень обходной путь вами выбран.
Подытожим, вам надо своим макросом сделать выборку и как-то обработать результаты выборки. Я правильно вас понял?

Если да, то пишите макрос например в файле /classes/modules/custom.php (данный макрос не будет требовать разрешений на свое выполнение) и там уже работаем с выборкой средствами API

Вам нужен selector или umiSelection (в чем разница я описывал в одной из статей на сайте umihelp.ru (http://umihelp.ru)). Документацию по selector ищите на wiki.umisoft.ru , а документацию по umiSelection (http://umiSelection) ищите на api.umi-cms.ru (http://api.umi-cms.ru)

после того как разберетесь как делать запрос и получить массив данных, вам надо перебрать этот массив и получив id страницы (если вы работали через umiselection, так как selector сразу возвращает страницу) получить по ней саму страницу(пусть страница будет в итоге храниться в переменной $page)

Из страницы вы можете вытянуть значение любого поля, допустим у вас есть поле Фотография (fotografia), тогда чтобы получить значение данного поля пишем следующее:
$page->fotografia; или $page->getValue('fotografia'); 

подробнее смотрите тут
Название: Re:Получение данных страницы по значению до&#
Отправлено: chuikoff от 04 Сентября 2012, 06:02:17
А я могу по URL обращаться к моему методу в файле custom.php ??
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: admin от 04 Сентября 2012, 06:09:45
если через udata протокол то да , тогда обращение к макросу с названием ggg будет таким http://site.ru/udata://custom/ggg
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: chuikoff от 04 Сентября 2012, 06:14:09
Хорошо, попробую таким методом. И всё же, как подключить сторонний скрипт в шаблон?
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: admin от 04 Сентября 2012, 06:30:54
скрипт в смысле js или php или еще какой? и что вы понимаете под сторонним скриптом? набор библиотек которые добаdляют какой-то функционал и которые надо подключить к системе?, доп функционал который разрабатывается средствами самой системы (API)? или сторонний сервис который возвращает какой-то ответ на какой-то запрос (типа EMS)?
Название: Re:Получение данных страницы по значению до&#
Отправлено: chuikoff от 04 Сентября 2012, 06:43:18
php скрипт (http://chuikoff.ru/uploads/files/cassa.zip), который был написан отдельно, и который нужно вставить в сайт на umi, но при этом получить данные из БД и использовать их в этом скрипте.

А потом подключить этот скрипт в шаблоне, по типу include_once()
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: admin от 04 Сентября 2012, 06:51:04
тогда в самом скрипте делаете standalone вызов подключая тем самым ядро umi . Делаете там выборку, с которой проделываете все необходимые манипуляции силами данного скрипта, а затем вызываете данный скрипт из шаблона через uhttp протокол.
Uthhp - это тоже самое что и udata, только для работы с удаленными ресурсами. Хотя, опять же, если вам надо обезопасить результаты работы данного скрита, создаете макрос (в том же /classes/modules/custom.php), который обращается к добавленному вами скрипту, а сам скрипт закрываете от прямого обращения изменив ему chmod. А в шаблоне вызываете уже макрос из файла /classes/modules/custom.php..

Как-то так...
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: chuikoff от 04 Сентября 2012, 07:01:16
Да, такой путь меня устраивает.

Доступ к скрипту через URL (если в корне разместить) закрыт .htaccess
В макрос его как подключить? include_once() ?

А как в шаблонизаторе xslt вызвать этот метод?
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: chuikoff от 07 Сентября 2012, 13:53:16
Написал я кастомный метод, всё работает, выборку пока не делал:

<?php
class custom extends def_module {
public function cms_callMethod($method_name, $args) {
return call_user_func_array(Array($this, $method_name), $args);
}

public function __call($method, $args) {
throw new publicException("Method " . get_class($this) . "::" . $method . " doesn't exists");
}
//TODO: Write your own macroses here

public function cassa()
{
//Устанавливаем время.
date_default_timezone_set("Etc/GMT-11");
$date = date('Hi');
$dir = dirname(dirname(dirname(__FILE__))).'/files/pay/';

//Получаем список всех файлов.
$files = scandir($dir);unset($files[0]);unset($files[1]);
$data = array();

//Фильтруем.
foreach($files as $f)
{
if(substr($f,0,4)<=$date)
{
$data[] = $f;
}
}

//Выбираем последний из массива.
$last = (count($data)-1);

//Проверка на количество подходящих файлов
if(count($data)==0)
{
$file = "index.html";
}
else
{
$file = $data[$last];
}

//Проверяем существование файла и парсим.
if(file_exists($dir.$file))
{
//Подключаем парсер.
include_once('simple_html_dom.php');

//Открываем файл и ищем данные.
$html = file_get_html($dir.$file);
$id = $html->find("span.STL8");
$name = $html->find("span.STL9");
$num = $html->find("span.STL10");
$price = $html->find("span.STL12");

//Отчищаем данные от html
for($i=0;count($id)>$i;$i++)
{
$id[$i] = strip_tags($id[$i]);
$name[$i] = strip_tags($name[$i]);
$num[$i] = strip_tags($num[$i]);
$price[$i] = strip_tags($price[$i]);
}

$order = substr_replace(strip_tags($html->find("span.STL0",0)),"Заказ",0,3);
$time = substr(strip_tags($html->find("span.STL1",0)),11,16);

$list.= "<ul>\n";
for($i=0;count($id)>$i;$i++)
{
$list.= "
<li>
<img src='/image/".$id[$i].".jpg' width='150' alt='".$name[$i]."' /><br/>
<p>Количество: ".number_format($num[$i])." шт.</p>
<p>".$name[$i]."</p>
<p>Сумма: ".$price[$i]." руб.</p>
</li>
";
}
$list.= "</ul>";

return $list;
}
else
{
echo('Ничего не заказывали');
}
}
};
?>

Но вот при вызове в шаблоне:

<xsl:value-of select="document('udata://custom/cassa/')/udata" />

Ничего не происходит! Что делать?)
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: admin от 07 Сентября 2012, 14:10:07
проверь через адресную строку site_name.ru/udata/custom/cassa скрипт вообще возвращает хоть что-нибудь?
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: chuikoff от 07 Сентября 2012, 14:18:08
This page contains the following errors:

error on line 2 at column 54: Encoding error
Below is a rendering of the page up to the first error.
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: admin от 07 Сентября 2012, 14:25:37
посмотри результат как html исходник, у тебя результат возвращается явно не в xml формате , а особенно строчка "echo('Ничего не заказывали');" , замени echo на return.
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: chuikoff от 07 Сентября 2012, 14:28:16
<?xml version="1.0" encoding="utf-8"?>
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="custom" method="cassa" generation-time="0.027382">&lt;ul&gt;

               &lt;li&gt;
               &lt;img src='/image/164.jpg' width='150' alt='
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: admin от 07 Сентября 2012, 15:50:48
вот в принципе и причина.... ты пытаешься вернуть в xml кусок текста с тегами, либо экранируй их (почитай про CDATA), либо возвращай результат массивом, а не тегами, а потом его уже обрабатывай xsl шаблоном.

Думаю, для тебя проще и быстрее будет обвернуть конечную переменную $list в CDATA
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: chuikoff от 07 Сентября 2012, 17:05:01
$result = '<udata mode=\"cache\"><![CDATA['.$list.']]></udata>';
return $result;

Не проканало. Выдаёт ту же ошибку, только внутренностей udata нет.

<?xml version="1.0" encoding="utf-8"?>
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="custom" method="cassa" generation-time="0.004889">
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: admin от 07 Сентября 2012, 20:11:06
$result = '<udata mode=\"cache\"><![CDATA['.$list.']]></udata>';
return $result;

это не совсем то что вам надо, скорее вот так подойдет

$result = '<![CDATA['.$list.']]>';
return $result;

или вот так return array('node:text'=>'<![CDATA['.$list.']]>');

но это еще проверят надо
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: chuikoff от 08 Сентября 2012, 05:21:56
$result = '<![CDATA['.$list.']]>';
return $result;

Попробовал так, на выходе всё равно получаю:

<?xml version="1.0" encoding="utf-8"?>
<udata xmlns:xlink="http://www.w3.org/TR/xlink" module="custom" method="cassa" generation-time="0.019859">&lt;![CDATA['.&lt;ul&gt;

&lt;li&gt;
&lt;img src='/image/164.jpg' width='150' alt='
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: admin от 08 Сентября 2012, 11:45:56
так
return array('node:text'=>'<![CDATA['.$list.']]>');

тоже пробовал?
Название: Re:Получение данных страницы по значению дополнительного поля.
Отправлено: chuikoff от 08 Сентября 2012, 11:50:16
Да, тоже самое.