[Ликбез]

Форма входа
Логин:
Пароль:

Меню сайта


Скрипты и коды для юкоз - Форум аццкого кодера » Юкоз API - описание, синтаксис, приемы » Ликбезз по юкоз API

Ликбезз по юкоз API
[1] likbezz [07.11.2013, 03:40]
Собственно, вот об этом.
Сейчас уже поздно, ничего осмысленного писать не буду, но вкратце так.

Тему решил создать по причине, практически полного отсутствия внятных разъяснений по данной теме.
Конечно, полно каких-то кодов/скриптов, даже здесь есть пару тем, но там большее для продвинутых в области скриптинга.

Здесь же, просто попытаюсь (наверняка не получится - как показывает практика - все хотят готовое и совсем не хотят вкуривать что-то новое) объяснить принцип, как с этим работать, и накидаю простенькие примеры, типа - как получить аватар из апи, или любую другую инфу доступную в нем.

Вот так и будет.
Всем спокойной, на сегодня отбой.
[2] likbezz [07.11.2013, 23:54]
Для начала отвечу на несколько простых вопросов. Они хоть и простые, но ответ будет сложным, ибо те кто спрашивает подобные вещи, походу даже не знает что такое API в принципе.
И так:

Q:
Цитата
1. АПИ чисто скриптовый "интерфейс" ввода запроса? или можно обернуть в <div> и тому подобное и импортировать данные из ХТМЛ в ХТМЛ по типу условных операторов-переменных.

Нет, просто так что-то обернуть не получится.
Апи - это не операторы или что-то подобное, это просто сервис предоставление информации по определенному адресу.
То бишь, по сути - это те же страницы сайта, только в упрощенной xml форме (API - XML-RPC)

Для чего это тогда? Для упрощения получения каких-то данных, ибо страница выводится без ничего - только данные в структурированной форме.

Получать их можно как при помощи php, так и при помощи JavaScript.
Все запросы к API выполняются посредством GET-запросов/
Примеры будут ниже.



Q:
Цитата
2. автор в первом посте, да и вообще во всех малочисленных примерах на данном форуме приводят конструкцию через скрипт с синтаксисом вообще отличительным от мануалов юкоза, поправте если я не правильно вник в мануал, синтаксис:
Код
http://manual.ucoz.net/board/10-1-0-91
$.get(http://SITE_ADDRESS/api/MODULENAME/ANYRELPATH)
<struct></struct><name></name><value></value><array></array>

теги берем из таблиц, а адрес до нужного уровня вложения страницы (естественно смотрим где и что может вернуть апи)

Здесь схематически показан принцип формирования ссылки.
Где:
SITE_ADDRESS = вас сайт, в данном случае, http://likbezz.ru/
MODULENAME = модуль, в данном случае = forum
ANYRELPATH = остальная часть ссылки? в данном случае, для первого поста будет == 100-1574-1
В сумме получаем: http://likbezz.ru/api/forum/100-1574-1

Короче, не заморачивайтесь особо, проще можно - просто вставить в текущую ссылку /api/
Например, для списка последних постов форума:
HTML адрес == http://likbezz.ru/forum/0-0-1-34
Ссылка на те же данные, но в Апи == http://likbezz.ru/api/forum/0-0-1-34
Вот и все.



Q:
Цитата
3. если ориентироваться на все примеры что в встречались в данном форуме, то данную конструкцию(выше) нигде не встречал, написал наугад тупо ориентируясь на мануал. добавлю: синтаксис именно Get запросов нигде в мануалах не встречал,

Данный “синтаксис” не суть как важен, вы быстро вкурите тему если попытаетесь хоть чуть-чуть разобраться.
Все достаточно просто и интуитивно понятно.



Q:
Цитата
а $.get() чаще встречается в примерах на структуре скриптов,

Так и есть.
Чаще всего данные получают именно гет запросом, в данном случае jQuery $.GET



Q:
Цитата
и куда вписывать ключ и нужно ли его вообще вписывать в пределах одного доменна (правда прикрепленного)
Обобщенно: как правильно писать get запрос(синтаксис), во что его можно обернуть (див, табл, ячейку или все таки только в скрипт), куда тулить ключ(при каких условиях)

Ключ вписывать в самый конец адреса запроса, типа:
Код
http://likbezz.ru/api/forum/0-0-1-34?apikey=APIKEY

Где вместо
Код
APIKEY

- ваш ключ который можно взять в ПУ, если вы включили эту функцию.
Включается и выключается она там же, в ПУ » Общие настройки » Использовать API key
После того как будет поставлена галочка - появится поле с ключом. Вот это и пихать в apikey



По теме:
Как получить аватар пользователя через API
Как получить репутацию через API, АПИ uCoz
[3] likbezz [08.11.2013, 01:52]
Q:
Цитата Info
Может быть кто-то уже спрашивал, возможно повторюсь.
Цитата
Получить данные можно так:
Код
http://site.com/api/load/razdel/category/name_file/32-1-0-305?apikey=API key

но получить данные по короткой ссылке (без ЧПУ) не возможно:
Код
http://site.com/api/load/32-1-0-305?apikey=API key

Это очень не удобно, можно ли это как-то исправить или обойти? Спасибо!


На данный момент обойти можно только если вы получаете данные при помощи php скрипт, или с использованием php + JavaScript.
В любом случае, нужен либо php, либо костыли с ифреймом.

Подробнее тут: Как получить API данные по короткой ссылке, без ЧПУ
[4] vinni [20.08.2014, 08:45]
likbezz, интересно. Сейчас активно юзать пытаюсь.) Жаль в модуле видео пока не предусмотрено.

У меня четыре вопроса назрело, надеюсь поможешь.

Речь идет про твой скрипт:

Код
function getXml(url,id,num){  
if(url){var url=url,cont=document.getElementById(id),tmp='';  
$.ajax({type:'GET',url:url,  
beforeSend:function(){cont.innerHTML='<img src="http://likbezz.ru/_source/_ico/loader/aj2.gif" alt="" />';},  
success:function(d){  
var n=d.getElementsByTagName('name'),j=num;  
var obj={TITLE:[],MESSAGE:[],ENTRY_URL:[],CATEGORY_NAME:[],CATEGORY_URL:[]};  
$.each(n,function(i,n){var o=$(n).text(),v=$(n.nextSibling.firstChild).text();  
if(o=='TITLE')obj.TITLE.push(v);  
if(o=='MESSAGE')obj.MESSAGE.push(v);  
if(o=='ENTRY_URL')obj.ENTRY_URL.push(v);  
if(o=='CATEGORY_NAME')obj.CATEGORY_NAME.push(v);  
if(o=='CATEGORY_URL')obj.CATEGORY_URL.push(v);  
});  
$.each(obj.TITLE,function(i){  
if(i<j){  
tmp+=['<h4><a href="'+obj.ENTRY_URL[i]+'">',obj.TITLE[i],'</a></h4>',obj.MESSAGE[i],'<br /><br />'].join('');  
}  
});  
cont.innerHTML=tmp;  
},  
error:function(a,b){if(b=='error'){cont.innerHTML='<b style="color:#F33;">Извините, но произошла ошибка: «'+a.status+'» '+a.statusText+'!</b>';}}  
});};};


1.) Просмотрел "список возвращаемых данных". img (img1,2,3,т.д.) не предусмотрено, я правильно понял?
И если нет... Как картинку поймать от новости?)

2.) Тянем данные с главной новостей

Код
<script>getXml('/api/news/','container',5);</script>


Все круто, но выводится ровно столько материалов - сколько задано в настройках модуля на главной странице. В нашем случае 9. Нашел коммент с этой же проблемой в описании api на юкозвских мануалах. Вопрос так и не решился. Как это обойти? Очень надо чтоб больше можно было выводить и желательно не ставить в настройках большее число.(

3.)
Код
<script>getXmlCont('/api/news/','container',60);</script>


container: можно использовать вместо id - class? Пробовал вот тут заменить id на class

Код
function getXml(url,[u]id[/u],num){


но не работало. Чувствую, что тут попахивает не хилым пробелом в знаниях, но бывало, что заменял и работало.

4.) Попытался совместить скрипт с подгрузкой в аякс окне (про которую недавно писал))

Код
function getXmlCont(url,id,num){
if(url){var url=url,cont=document.getElementById(id),tmp='';
$.ajax({type:'GET',url:url,
beforeSend:function(){cont.innerHTML='<img src="http://likbezz.ru/_source/_ico/loader/aj2.gif" alt="" />';},
success:function(d){
var n=d.getElementsByTagName('name'),j=num;
var obj={TITLE:[],MESSAGE:[],ENTRY_URL:[],CATEGORY_NAME:[],CATEGORY_URL:[],DATE:[],TIME:[],MATERIAL_ID:[]};
$.each(n,function(i,n){var o=$(n).text(),v=$(n.nextSibling.firstChild).text();
if(o=='TITLE')obj.TITLE.push(v);
if(o=='MESSAGE')obj.MESSAGE.push(v);
if(o=='ENTRY_URL')obj.ENTRY_URL.push(v);
if(o=='CATEGORY_NAME')obj.CATEGORY_NAME.push(v);
if(o=='CATEGORY_URL')obj.CATEGORY_URL.push(v);
if(o=='DATE')obj.DATE.push(v);
if(o=='TIME')obj.TIME.push(v);
if(o=='MATERIAL_ID')obj.MATERIAL_ID.push(v);
});
$.each(obj.TITLE,function(i){
if(i<j){
tmp+=[
'<div class="grid">',
'<div class="imgholder"><img src="/AW_v5/img/no-image.jpg" /></div>',
'<strong><a href="javascript://" onClick="apoloadme(',''+obj.MATERIAL_ID[i]+'', ''+obj.ENTRY_URL[i]+'',');return false;">',obj.TITLE[i],'</a> <img src="/AW_v5/img/ajax-loader.gif" id="loader',''+obj.MATERIAL_ID[i]+'','" style="display: none"></strong>',
obj.MESSAGE[i],
'<div class="meta feed-date" id="xDate$ID$">'+obj.DATE[i]+', '+obj.TIME[i]+'</div>',
'<div class="apoloadfull',''+obj.MATERIAL_ID[i]+'','" style="display: none"></div>',
'</div>'
].join('');
}
});
cont.innerHTML=tmp;
},
error:function(a,b){if(b=='error'){cont.innerHTML='<b style="color: #F33;">Извините, но произошла ошибка: «'+a.status+'» '+a.statusText+'!</b>';}}
});};};


В частности вот этот страх вышел:

Код
tmp+=[
'<div class="grid">',
'<div class="imgholder"><img src="/AW_v5/img/no-image.jpg" /></div>',
'<strong><a href="javascript://" onClick="apoloadme(',''+obj.MATERIAL_ID[i]+'', ''+obj.ENTRY_URL[i]+'',');return false;">',obj.TITLE[i],'</a> <img src="/AW_v5/img/ajax-loader.gif" id="loader',''+obj.MATERIAL_ID[i]+'','" style="display: none"></strong>',
obj.MESSAGE[i],
'<div class="meta feed-date" id="xDate$ID$">'+obj.DATE[i]+', '+obj.TIME[i]+'</div>',
'<div class="apoloadfull',''+obj.MATERIAL_ID[i]+'','" style="display: none"></div>',
'</div>'
].join('');


likbezz, что не так делаю? Вроде все правильно, а новость не подгружается.

Сам скрипт подгрузки:



В общем, вот... За скрипт большое спасибо. Как раз информеры кончились, не знал как быть пока твою статью не нашел.

Добавлено (20.08.2014, 08:45)
---------------------------------------------

Цитата vinni
В частности вот этот страх вышел:

На всякий скидываю как это выглядит в виде материалов стандартного информера:

Код
<?ifnot(substr($DATE$,-4)='2012')?><div class="grid">
<div class="imgholder">
<a href="javascript://" onClick="apoloadme('$ID$', '$ENTRY_URL$'); return false;"><img src="<?if($IMG_URL1$)?>$IMG_URL1$<?else?>/AW_v5/img/no-image.jpg<?endif?>" /></a>
</div>
<strong><a href="$ENTRY_URL$">$TITLE$</a> <img src="/AW_v5/img/ajax-loader.gif" id="loader$ID$" style="display: none"></strong>
$MESSAGE$
<div class="meta feed-date" id="xDate$ID$">$DATE$, $TIME$</div>
<div class="apoloadfull$ID$" style="display: none"></div>
</div><?endif?>
[5] likbezz [20.08.2014, 08:51]
vinni,
Цитата vinni, Ср, 20.08.2014, 08:37:03
1.) Просмотрел "список возвращаемых данных". img (img1,2,3,т.д.) не предусмотрено, я правильно понял?

Правильно.
Обойти можно, лишь добавив в скрытом виде в текст материала

Цитата vinni, Ср, 20.08.2014, 08:37:03
2.) Тянем данные с главной новостей.
Все круто, но выводится ровно столько материалов - сколько задано в настройках модуля на главной странице. В нашем случае 9. Нашел коммент с этой же проблемой в описании api на юкозвских мануалах. Вопрос так и не решился. Как это обойти?

Перебором страниц - /api/news/2 и так далее.

Цитата vinni, Ср, 20.08.2014, 08:37:03
container: можно использовать вместо id - class? Пробовал вот тут заменить id на class

Можно, но не так “просто”.
Лучше использовать ID

Цитата vinni, Ср, 20.08.2014, 08:37:03
Попытался совместить скрипт с подгрузкой в аякс окне (про которую недавно писал)) что не так делаю? Вроде все правильно, а новость не подгружается.

Смотри логи, ошибки.. так навскидку не скажу.

И не забываем - это простейший пример скрипта, а не многопрофильный функционал.
[6] vinni [20.08.2014, 09:29]
Цитата likbezz
Обойти можно, лишь добавив в скрытом виде в текст материала

Что-то вроде темы, где ты показал как оформлять похожие материалы картинками? Именно тот скрипт и пытался приспособить, хэх.)

Цитата likbezz
Перебором страниц - /api/news/2 и так далее.

Пробовал сделать вот что:

Код
<script>getXmlCont('/api/news/1','/api/news/2','container',18);</script>


и

Код
function getXmlCont(url,url,id,num){


вместо

Код
function getXmlCont(url,id,num){


И ниже также дублировал url,url. Не получилось. Можешь показать правильный пример?)

Цитата likbezz
Смотри логи, ошибки.. так навскидку не скажу.

А сам код на первый взгляд верный? оО Думал, что может не так где...

Блин... А MATERIAL_ID можно дублировать в коде? Если сам код правильный, тогда и не знаю... Точная копия информера в принципе. Окно по сути должно открываться.

Добавлено (20.08.2014, 09:23)
---------------------------------------------

Цитата likbezz
Обойти можно, лишь добавив в скрытом виде в текст материала

Стоп. Кажется дошло. В сам текст или в краткое описание?

Добавлено (20.08.2014, 09:29)
---------------------------------------------

Цитата likbezz
И не забываем - это простейший пример скрипта, а не многопрофильный функционал.

А по мне так - сокровище. хд
[7] likbezz [20.08.2014, 09:36]
vinni,
Цитата vinni, Ср, 20.08.2014, 09:23:06
вроде темы, где ты показал как оформлять похожие материалы картинками?

Не совсем.
Просто добавлять (вручную или скриптом) к тексту материала скрытый блок с картинкой, или html-комментарий, а в скрипте уже искать картинку в тексте материала и выводить, если есть.

Цитата vinni, Ср, 20.08.2014, 09:23:06
Пробовал сделать вот что

Данный скрипт выводит только первую страницу.

Цитата vinni, Ср, 20.08.2014, 09:23:06
Можешь показать правильный пример?)

Правильный - нет - лениво писать подобный функционал за спасибо.
Как вариант - два разных блока подряд и два вызова, соответственно.
Типа:
Код
<div id="container1"></div>
<script type="text/javascript">
getXml('/api/news/','container1',5);
</script>
<div id="container2"></div>
<script type="text/javascript">
getXml('/api/news/2','container2',5);
</script>


Цитата vinni, Ср, 20.08.2014, 09:23:06
А MATERIAL_ID можно дублировать в коде?

ID материала - уникальный номер в модуле.

Цитата vinni, Ср, 20.08.2014, 09:23:06
В сам текст или в краткое описание?

По адресу /api/news/2 выводится краткое содержание (или обрезанное полное, если в настройках установлено обрезать...)
[8] vinni [20.08.2014, 10:02]
Цитата likbezz
Не совсем.
Просто добавлять (вручную или скриптом) к тексту материала скрытый блок с картинкой, или html-комментарий, а в скрипте уже искать картинку в тексте материала и выводить, если есть.

Угу... Понятно, буду пробовать.)

Цитата likbezz
Правильный - нет - лениво писать подобный функционал за спасибо.
Как вариант - два разных блока подряд и два вызова, соответственно.

Пробовал, так работает, да.)

Цитата likbezz
ID материала - уникальный номер в модуле.

Знаю, говорю можно ли дублировать MATERIAL_ID. Например код статистики нельзя два раза размещать на странице, поэтому и спросил.) Мало ли. Там MATERIAL_ID используется три раза. Но явно проблема в другом.))

Спасибо.)

Добавлено (20.08.2014, 10:02)
---------------------------------------------

Цитата likbezz
По адресу /api/news/2 выводится краткое содержание (или обрезанное полное, если в настройках установлено обрезать...)

Так и думал.)
[9] likbezz [20.08.2014, 10:09]
Цитата vinni, Ср, 20.08.2014, 10:02:37
Например код статистики нельзя два раза размещать на странице, поэтому и спросил.)

Можно - это же скрипт...


Полная версия сайта