История одного сайта - применение PHP и API

Добрый день, уважаемые читатели официального блога uCoz. Чуть больше года назад вы могли прочитать мой пост "История одного сайта - от задумки до реализации", про становление городского сайта "ЮБиК", посвящённого подмосковным городам Юбилейный и Королёв. Прошедший год не остался безрезультативным в плане развития и совершенствования сайта. В данном посте я расскажу о возможностях и практических реализациях, основанных на PHP и API, предоставленных не так давно компанией uCoz. Итак, по порядку.

Год назад, когда PHP и API на uCoz уже прошли тестирование и стали доступны пользователям системы, я начал приглядываться к новым возможностям. Тогда я ещё не понимал, как API и PHP можно применить на сайте, чем они так полезны и почему многие пользователи системы так ждали этих возможностей. Особо интересных примеров функционала я не обнаружил на официальном форуме uCoz, поэтому никаких действий по использованию не предпринимал. К концу 2011 года был запущен конкурс идей и их воплощений, основанных на PHP, предоставляемом хостингом. Это был первый опыт по уяснению тех возможностей, которые даёт PHP для реализации различных задумок. Из всего списка представленных работ меня заинтересовала только одна работа "Авторизация через соцсети". Поэтому в конце декабря 2011 года я перешёл на новый тариф (с поддержкой PHP) и установил скрипт авторизации на сайт. Пожалуй, это была единственная реализация, которая была сделана довольно качественно и была действительно нужной. Это был мой первый шаг, за которым последовали собственные идеи и их реализации, о которых сейчас и пойдёт речь.

В поисках хорошего мастера, готового взяться за освоение возможностей PHP,  API от uCoz и выполнение моих нетривиальных заданий, я почти сразу попал на веб-разработчика, известного на форуме uCoz как rsod. На него я вышел не случайно – мне посоветовал к нему обратиться автор скрипта "Авторизация через социальные сети", ныне являющийся сотрудником uCoz. Что же получилось от нашей совместной работы? Какие функции удалось реализовать? С какими проблемами столкнулись? Что позволяет сделать uCoz и чем он нас ограничивает?


КАРТА организаций

На сайте ЮБиК есть обширная и подробная справочная система организаций и учреждений городов Королёв и Юбилейный Московской области. Для удобства её использования не хватало только одного - карт! Адреса организаций есть, а вот посмотреть наглядно, где это находится возможности не было. Я знал, что это можно реализовать и без помощи PHP, но у меня была более масштабная задумка, в которой простыми средствами uCoz не обойтись. Необходимо было связать частные карты для конкретных организаций с единой картой всех организаций. Как это работает?

Любой объект (материал) Справочной можно привязать к Яндекс-карте посредством ввода адреса и указания тега (название группы), в который должна быть организация. После того, как модератором отмечается организация на карте, под материалом Справочной выводится спойлер, в котором скрыта Яндекс-карта с меткой объекта. Помимо этого есть кнопка «Все организации», которая ведет на общую карту со всеми объектами по данному тегу. Под общей картой выводятся все теги, которые выполняют функцию фильтров для отображения конкретных объектов на карте. Все объекты, что мы видим на текущий момент на поле карты, отображаются в левой части от карты. Причём можно включить режим, когда будут показываться названия всех объектов, вне зависимости от того, на каком участке карты мы сейчас находимся. При нажатии на любой объект из списка, на карте автоматически ищется объект и выводится нужная точка. При нажатии на метку на карте мы увидим все названия организаций, расположенных по данному адресу. Тут же можно перейти в справочную для ознакомления с подробной информацией об организации.

Помимо фильтрации объектов на карте с помощью тегов, был разработан специальный поиск по Карте по названиям материалов и/или по адресам. Если посетитель сайта помнит только адрес, то он с лёгкостью найдет все находящиеся по данному адресу объекты или, если знакомо только название, то узнает адрес данной организации и увидит его на карте города. Поиск выводит не только точные совпадения результатов запросов, но и похожие, что может пригодиться на случай,если человек сделал опечатку в запросе.

Учтён еще один важный момент, касающийся сохранения текущего положения карты, а также результатов фильтрации по тегам или поисковому запросу. Для этого есть специальная кнопка, называющаяся «Ссылка», при нажатии на которую предлагается сохранить адрес страницы с текущим расположением объектов на карте. Таким образом, пользователи сайта могут при необходимости обмениваться ссылками на карту, например, чтобы показать все «Образовательные учреждения» или все «Продуктовые магазины» города Королёва на карте.

Пример реализации «Карта организаций»

Комментарий веб-разработчика

При создании данной функции очень не хватало API для записи напрямую в материал из PHP-скрипта. Для реализации данной функции пришлось собственноручно писать функции сохранения необходимых данных материала в дополнительную базу данных, хранимую на PHP-сервере. Это не очень удобно по причине того, что мы вынуждены делать дополнительный запрос как во время добавления материала, так и во время чтения. При этом во время добавления материала возможна такая ситуация, когда, например, пользователь закроет вкладку прежде, чем запрос успеет отправиться на сервер и в результате материал будет отредактирован, но не будут отражены изменения на карте.

Кроме того, здесь может быть полезна система вызова скриптов при определённых действиях. Например, при добавлении материала в каком-либо модуле вызывается определённый скрипт, путь к которому задаётся в панели управления. В этот скрипт передаётся ссылка на материал и он производит добавление его в дополнительную базу данных. А при удалении материала вызывается другой скрипт. При изменении - ещё один и так далее, в общем, удобная была бы функция, которая могла бы компенсировать отсутствие API для записи. Кроме того, подобная функция относительно проста в реализации и безопасна для сайта, в отличие от API для записи.


КАРТА фотографий

Карта организаций стала основой для развития картографической составляющей сайта «Вся жизнь Юбилейного и Королёва». На многих крупных фотосайтах есть возможность отмечать загруженные фотографии на карте, то есть указывать место, где производилась фотосъёмка. Именно эта задача была реализована. Примечательно, что пользователи, добавившие фото, имеют возможность добавить точку на карте тремя способами: ввод адреса, установка метки на карте, ввод координат. То есть, если человек не знает точного адреса (или объект не имеет адреса), то объект можно отметить на карте примерно, просто поставив метку в нужную область карты. А если фото имеет GPS-метку, то тогда автор знает координаты и может ввести их в соответствующее поле.

Принцип работы «Карты фотографий» практически идентичен работе «Карты организаций», единственное, что добавлены дополнительные модераторские функции по управлению добавляемыми пользователями объектами на карте (автоматическое создание тега «непроверенные фотографии», удаление объектов с карты и т.п.).

Пример реализации «Карта фотографий»

Комментарий веб-разработчика

Поскольку модули практически идентичные, а по большому счёту – это и есть скопированная карта организаций с незначительными изменениями, то и комментарии здесь аналогичны предыдущим.


КАРТА недвижимости

На сайте «ЮБиК», как на любом городском портале, есть раздел «Доска объявлений». Его отдачу заметили не только обычные жители города, но и риэлторы, занимающиеся продажей, сдачей недвижимости. Долгое время не удавалось заставить их публиковать качественные объявления с указанием всех атрибутов недвижимости (адрес, цена, тип недвижимости, контакты, собственник или агентство и др.). Внедрение «Карты недвижимости» способствовало не только повышению удобства поиска объявлений по недвижимости, но и росту общего качества добавляемых объявлений.

Сразу же после добавления объявлений в разделы по недвижимости «Сдам» или «Продам» автору материала настоятельно предлагается добавить объявление на «Карту недвижимости». Если он этого не делает, то объявление помечается надписью «непроверенное объявление» и иконкой «внимание», при нажатии на которую выводится сообщение о том, что объявление сомнительного содержания и администрация сайта не рекомендует пользоваться данным предложением. При этом автор видит также ссылку с предложением исправить данную ситуацию.  Это единственный способ, который заставляет недобросовестных посетителей сайта добавлять объявления с корректными данными.

Основным отличием «Карты недвижимости» от предыдущих двух карт является то, что для неё разработан многофункциональный фильтр, который позволяет выводить конкретные объекты недвижимости по их типу, цене, собственнику/агентству и т.д.

При удалении объявления о недвижимости происходит автоматическое удаление объекта с карты. По умолчанию срок хранения всех меток на карте – месяц. После чего они также автоматически удаляются. Таким образом, на карте выводятся только самые актуальные объявления.

К сожалению, в данной реализации есть один неприятный момент. Если авторы объявлений ставят срок размещения меньше месяца, то при автоудалении объявления сервером, карта "не знает” о данном событии. В связи с этим, на карте появляются битые метки, ведущие на страницу 404. Решение по данному вопросу не найдено.

Пример реализации «Карта недвижимости»
Подробное описание возможностей трёх «Карт»

Комментарий веб-разработчика

Здесь ощущается особо остро нехватка вызова скриптов по событиям или отсутствие выборки произвольного количества материалов за один запрос. И если удаление вручную ещё можно отследить, хоть и не в 100% случаев, то автоматическое удаление не отслеживается и не может быть отслежено вообще никаким образом.


ЗАМЕТКИ для материалов

Ведение городской справочной – это сложный процесс. Постоянно происходит изменение информации, которую надо вовремя править. В разных источниках разные данные и какие из них верные – не всегда ясно. Как быть? Конечно же, в данной ситуации принять решение может только человек, то есть модератор, ведущий данный раздел. Но ему нужен на сайте «блокнот», прикреплённый к каждому материалу справочной, чтобы можно было концентрировать накопленную информацию, выбирать из неё нужную, хранить историю изменений. Так родилась идея создания заметок для модераторов.  

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

Пример реализации "Заметки": это внутренняя функция для модераторов, поэтому продемонстрировать её нет возможности.

Комментарий веб-разработчика

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


ОПРОСЫ для материалов

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

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

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

А как повысить «видимость» опросов на сайте? Для этого была сделана особенно полезная функция - копирование опроса в любой материал любого раздела сайта. При этом формат работы опроса полностью повторяет его работу в «корневом» материале: можно и голосовать и просматривать результаты (база голосов единая).

Это очень удобно для материалов, посвящённых одной и той же теме. (прим. разработчика: это на самом деле не копии опросов, а ссылки на один. Аналогию можно привести с файлом и ярлыком: файл (главный опрос) только один, а ярлыков может быть неограниченное количество, и при этом нет разницы, запускается ли ярлык или файл, так и здесь) Помимо этого, копировать опрос можно и на внешние ресурсы. Тогда на сайте ЮБиК фиксируются те сайты, на которых установлен код опроса и то количество людей, которые участвовали в голосовании с внешних доменов.

Пример реализации «Городские опросы»
Подробное описание возможностей «Опросов»

Комментарий веб-разработчика

В общем, здесь всё то же самое: нужна система вызова скрипта по событию и запись в материал посредством Write API. Хорошо было бы иметь поле произвольной максимальной длины или возможность сделать несколько произвольных полей.


МАТЕРИАЛЫ по теме

Эта разработка частично дублирует функцию тегов, предоставляемых системой. Только теги здесь выполняют чёткую задачу, направленную на концентрацию материалов одной темы из всех разделов за всю историю сайта. О чём же речь? В разделе «Справочная» располагаются материалы об организациях и учреждениях (адреса, контакты, описания). В других разделах сайта также есть информация, касающаяся конкретной организации: дополнительные материалы в справочной, фото в галерее, заметки жителей, новости городского СМИ и т.п. Как их все объединить? С помощью тега – названия организации. Это и было сделано. Теперь под материалами расположена фраза «См. также: материалы по теме», переход по которой приводит посетителя на страницу со всеми материалами по данной «теме». Причем, ключевой материал (справка с адресом, контактами и описанием) всегда расположена сверху, а уже под ним все остальные материалы согласно хронологии их появления на сайте. По сути, это напоминает работу календаря в разделе «Новости», но фильтрация идёт по многим параметрам (тег, раздел, год, месяц), а не только по месяцу и дате.

Пример реализации «Материалы по теме»

Комментарий веб-разработчика

Всё то же самое, что было описано в предыдущих разделах.


РЕЙТИНГ организаций

На сайте ЮБиК в разделе «Справочная» подключён стандартный рейтинг uCoz «звёздочки» (пятибалльная шкала оценки). Но для оценки «качества организации» этот рейтинг малопригоден. Неясно, за что пользователи ставят эти «звёзды». Выход был один – разработать свою систему оценки и рейтинга организаций. Причём, важно, что оценку можно поставить только с привязкой к комментарию. Система оценки выглядит так: +2 (отлично) +1 (хорошо) 0 (удовлетворительно/нейтрально) -1 (плохо) -2 (очень плохо/ужасно). Новая добавленная оценка «съедает» или «дополняет» величину текущего рейтинга.

Разработана общая страница рейтинга организаций Королёва и Юбилейного, на которой можно увидеть самые популярные у населения организации.

Рейтинг можно посмотреть и для отельной группы организаций (сортировка по тегам, взятым из базы тегов «Карта организаций»). Например, можно отдельно посмотреть рейтинг «Образовательных учреждений» города. Сортировка организаций осуществляется по тегам, числу отзывов (оценок), рейтингу (самый высокий/самый низкий), тенденциям (приросту или уменьшению рейтинга за последние 3 месяца).

Если модератор обнаружил некачественный отзыв (нецензурная лексика, неполные данные и т.п.), то при удалении комментария-отзыва автоматически удалится оценка (рейтинг организации вернётся к предыдущему состоянию). Примечательно, что реализована защита от накруток и недобросовестных пользователей (с одного ip можно оставить только  один отзыв об организации, следующий - только через 30 дней).

Пример реализации «Рейтинг организаций»

Комментарий веб-разработчика

Здесь опять же очень сильно не хватает системы вызова скриптов по событиям. Также здесь не хватает возможности вставки результата выполнения PHP-скрипта прямо в шаблон, что позволило бы отделить простые комментарии от отзывов, при этом не потеряв возможность индексации и тех, и других.


ФОТОГРАФИИ комментариев (не реализовано)

Как известно, в материалы можно прикрепить несколько десятков фотографий. Но часто бывают случаи, что посетителям сайта необходимо в обсуждениях к материалу прикрепить фото. Сделать они это могут, воспользовавшись тегом [img], предварительно залив фото на любой фотохостинг. Но тут есть, как минимум, 3 проблемы: фотография на чужом сервере (не индексируется поисковиками,  ведёт на другой сайт, может исчезнуть в любой момент и т.д.), фотография может испортить вид страницы, если её размер больше ширины области комментариев (красиво, когда все фото имеют превью фиксированного размера), многие не умеют пользоваться bb-кодами и не знают о фотохостингах (не берём во внимание продвинутую молодёжь).

Я хотел иметь реализацию функции по загрузке изображения в комментарии, её обработке, создания превью и прописывание домена yubik.net.ru на фото. Так, чтобы после добавления комментария под ним выводилось аккуратное превью фотографии. Все новые фотографии в комментариях можно было бы просмотреть на отдельной странице…

Важной составляющей ТЗ для веб-разработчика было условие, что фотографии в комментариях будут индексироваться поисковиками. Сначала были надежды эту непростую ситуацию разрешить, но, к сожалению, по этому вопросу столкнулись с непреодолимой трудностью и данная разработка «зависла в воздухе». Я и разработчик не смогли придумать «механизм», чтобы обойти «ограничения и отсутствие некоторых необходимых вещей» в системе uCoz.

Пример реализации на данный момент не реализовано

Комментарий веб-разработчика

Здесь очень не хватает Write API и системы вызова скриптов по событиям. Кстати, странно, почему нет кода, выводящего идентификатор комментария. Из-за этого приходится буквально городить костыли, которых, к слову, и так немало.

После многократных попыток решить проблемы, можно сказать только одно: нужен хотя бы id, без него уникальная идентификация комментария практически неосуществима (прикрепление индексируемых фото невозможно)


Мой вывод

В системе uCoz можно реализовать многое, что я и продемонстрировал, но порой сталкиваешься с непростыми ситуациями, и приходится придумывать сложные решения для казалось бы простых вещей. Но при этом однозначно можно сказать - в корне неправы те, кто заявляют, что система uCoz ограничивает и не даёт создать что-то уникальное и непохожее на других.

В целом, можно сделать четыре вывода:

  • 1. PHP и API системы uCoz действительно полезная вещь! Можно реализовать, даже не смотря на ограничения, многие интересные проекты и для этого не нужно переходить на другой хостинг (в том числе, использовать другую систему управления сайтом).
  • 2. Необходимо расширение функционала PHP и API системы uCoz. Это даст еще больше возможностей для воплощения самых инновационных идей!
  • 3. Нужна стабильная работа PHP-сервера (сейчас приходится использовать асинхронный код загрузки для описанных проектов, чтобы в какой-то «нестабильный» момент не завис весь сайт). Но, стоит заметить, что на текущий момент сервер работает намного стабильнее, чем год назад.
  • 4. Не хватает некоторых системных кодов


Вывод веб-разработчика

API для записи и вызов скрипта по событию катастрофически необходим.


Надеюсь, данный пост будет полезен сообществу uCoz, как пользователям, так и Администрации.


С уважением, администратор сайта yubik.net.ru


22 комментариев
1 Написал JonMagon 23 Августа 2012, 19:38
Интересно было почитать smile
2 Написал uMk@ 23 Августа 2012, 20:12
Да интересно было читать. И проблемы все очень знакомые. Главное чтобы dollar были, для реализации нестандартных решений.
avatar
3 Написал skalepov 23 Августа 2012, 20:38
у ucoz самая запущенная проблема в том, что у некоторых элементов вообще нет класса или id, это очень плохо сказывается и на дизайне и на верстке. если исправят это, до и не будет МАССЫ проблем у таких даже продвинутых разработчиков ЮБиКа.
должно быть даже у пресловутых скобок, которые постоянно приходится скриптом выдирать[]
ужас в общем, такое невнимание к деталям...
4 Написал sergeymitrichev 24 Августа 2012, 09:20
а без класса или id типа никак прицепиться нельзя? smile
8 Написал Drinko 26 Августа 2012, 04:08
Костыли форева? dry
avatar
9 Написал skalepov 27 Августа 2012, 13:18
скрипты для многих темный лес, учить Js для того чтобы "прицепится" к каким то мелочам - минус в багаж системы.

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

я вот например не могу изменить доисторический лоадер начала нулевых, который появляется при добавлении комментария, потому что тупо img забыли\не захотели\не посчтали нужным присвоить хотя бы класс
avatar
10 Написал skalepov 27 Августа 2012, 13:20
вообще юкозовские иконки почти всех без классов, а так уж замучали своей неэстетичностью и древностью
11 Написал AlexPS 27 Августа 2012, 15:57
да, да, да. посетители только и заходят на сайт что бы посмотреть на супер-пупер модные иконки biggrin
13 Написал sergeymitrichev 28 Августа 2012, 11:15
если не секрет, какие иконки? или сайт покажите. Вы, вероятно, про форум говорите?
5 Написал Mr-news 24 Августа 2012, 12:40
Согласен, но это дело времени, возможно в дальнейшем все будет smile
18 Написал jazator 07 Сентября 2012, 14:05
Любое - "возможно", продолжается годами, а в это время поезд уходит, чаще навсегда.
17 Написал jazator 07 Сентября 2012, 14:03
Именно, невнимание к деталям - огромная проблема ucoz, многие явные и очевидные недоработки висят годами! Это очень плохо и негативно сказывается на отношении к системе.
6 Написал †Angel† 24 Августа 2012, 16:54
А реально заказать парочку из этих скриптов для своего сайта? И во сколько это обойдётся?
12 Написал Sultanka 27 Августа 2012, 16:53
Действительно было бы интересно знать примерный уровень цен. Полезные разработки.
14 Написал sergeymitrichev 28 Августа 2012, 11:19
Вот здесь почитайте
http://partner.ucoz.ru/board/programmirovanie/13/
Может что-либо близкое по духу найдете
15 Написал Sultanka 28 Августа 2012, 15:27
Причем здесь заявки на Партнере ("сделайте мне сайт за 100руб..."), если привлек внимание этот материал и реализация конкретных задач.
16 Написал Victor 30 Августа 2012, 14:05
У каждого разработчика свои расценки. Унивиресальных нет. К тому же цена далеко не всегда зависит только от задачи. Есть другие факторы. Сроки, например.
Напишите на Партнёре нескольким разработчикам - узнаете цены, сравните...
7 Написал Skill 25 Августа 2012, 22:41
спасибо за информацию, было интересно почитать cool
19 Написал jazator 07 Сентября 2012, 14:07
Жму руку разработчикам ЮБиК - молодцы!
avatar
20 Написал baktria 07 Сентября 2012, 19:07
Интересный очерк, очень интересный опыт. Спасибо!
avatar
21 Написал avz 11 Сентября 2012, 16:49
Не пойму, зачем на карте недвижимости заморачиваться с php, когда можно с помощью информеров все вывести. И при удалении объекта, он исчезнет с карты. Я сделал на информерах без php/ Кому интересно, пишите в личку - сброшу ссылку.
22 Написал jazator 04 Октября 2012, 20:13
Автор статьи фактически взывает, что невозможно (будь ты хоть 7 пядей во лбу) реализовать возможность прикрепления фотографий к комментариям. С такой просьбой клиенты ucoz уже обращаются много лет. Потребность острая, необходимость огромная...
Реализуйте уже пожалуйста! Посмотрите на другие движки, их владельцы давно крепят и фото, и видео, и файлы, и опросы, и отметки на картах и т.д.
Данная возможность давно назрела и необходима тысячам сайтов на ucoz!

ps мужики, кто поддерживает - дико плюсуйте!
Ваш комментарий