Николай Ланец
14 авг. 2017 г., 6:08

MODX-Клуб превращается в фриланс-биржу

Всем привет!

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

Самое главное: теперь у каждого появилась возможность создавать свои команды. Эти команды выводятся в разделе "Каталог веб-студий". Хотя для сеошности я назвал этот раздел так, на самом деле это могут быть не только веб-студии, но и просто коллеги, даже удаленные. Сейчас я пока запретил создавать более одной команды, но на днях я эту функцию разлочу.

Для чего создавать команды? Как минимум для того, чтобы продвигать себя. Этот функционал развивается с весьма прокаченной перелинковкой. К примеру, если три пользователя добавят по три работы в портфолио каждый и создадут каждый по одной команде и добавятся каждый друг к другу в команду, то у каждого будет числиться по три команды и по 9 работ в портфолио. Так же в портфолио можно указывать по какому профилю участвовал (Дизайн, программирование, управление и т.п.), можно по несколько направлений на одну работу. И потом в профиле пользователя эта информация учитывается, в скольких работах по какому направлению он участвовал.

И по портфолио важный момент: кто в работе участвовал, тому работа навсегда, куда бы он не переходил, или остается один сам по себе. А вот с компаниями два момента: если работа указана, что она выполнялась для этой студии, то она за ней так же закрепляется. Если нет, то нет. Таким образом у компании портфолио суммируется из своих постоянных работ и работ ее участников. Взял себе пару человек с работами - портфолио добавилось. Ушли - уменьшилось.

Функционал добавления работ в портфолио так же появится в самые ближайшие дни.


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

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

В самой карточке компании есть две ссылки на портфолио:
1. Все работы команды.
2. Только собственные проекты.
Объясню подробней: как я и говорил выше, у компании есть собственное портфолио, то есть какие сайты были созданы непосредственно ей (не важно, заказали на стороне услуги фрилансера, или собственная команда трудилась, главное - авторство заявлено студией). А есть портфолио сотрудников студии. Вот все работы - это в том числе и сотрудников, а свои - это свои.

Ну и напоследок продемонстрирую один из запросов, который получает информацию о компаниях, ее работах, команде и т.п., просто для примера (чтобы ощутить размах).
SELECT modResource.*, modResource.id as `object_id`, tv_3_image.value as `tv_3_image`, tv_10_extras.value as `tv_10_extras`, concat('http://', modResource.pagetitle) as url, Company.id as developer_id, if(Company.website != '', concat('http://', Company.website), '') as developer_site, Company.name as developer_title, DeveloperResource.id as developer_resource_id, DeveloperResource.uri as developer_uri, ProjectMembers.*, AuthorCompanies.*, Author.id as author_id, Author.username as author_username, AuthorProfile.fullname as author_fullname, AuthorProfile.photo as author_photo FROM `tbl_site_content` AS `modResource` JOIN `tbl_users` `Author` ON modResource.createdby = Author.id JOIN `tbl_user_attributes` `AuthorProfile` ON Author.id = AuthorProfile.internalKey left join ( SELECT ProjectMembersProjects.project_id, group_concat(modUser.id SEPARATOR ',') as project_members, group_concat(modUser.username SEPARATOR ';') as project_members_username, group_concat(Profile.fullname SEPARATOR ';') as project_members_fullname, group_concat(Profile.photo SEPARATOR ';') as project_members_photo FROM `tbl_users` AS `modUser` JOIN `tbl_user_attributes` `Profile` ON `modUser`.`id` = `Profile`.`internalKey` inner join ( SELECT DISTINCT `user_id`, `project_id` FROM `tbl_modxsite_projects_members` AS `modProjectMember` WHERE `modProjectMember`.`status` = 1 ) `ProjectMembersProjects` ON modUser.id = ProjectMembersProjects.user_id WHERE ( `modUser`.`active` = 1 AND `Profile`.`blocked` = '0' ) GROUP BY ProjectMembersProjects.project_id ) `ProjectMembers` ON modResource.id = ProjectMembers.project_id LEFT JOIN `tbl_site_tmplvar_contentvalues` `tv_developer` ON tv_developer.tmplvarid = 11 AND tv_developer.contentid = modResource.id LEFT JOIN `tbl_site_content` `DeveloperResource` ON DeveloperResource.id = tv_developer.value LEFT JOIN `tbl_modxsite_companies` `Company` ON tv_developer.value = Company.resource_id LEFT JOIN `tbl_site_tmplvar_contentvalues` `tv_3_image` ON tv_3_image.tmplvarid = 3 AND tv_3_image.contentid = modResource.id LEFT JOIN `tbl_site_tmplvar_contentvalues` `tv_10_extras` ON tv_10_extras.tmplvarid = 10 AND tv_10_extras.contentid = modResource.id left join ( SELECT Experiences.user_id, GROUP_CONCAT(modCompany.id SEPARATOR '||') as companies_id, GROUP_CONCAT(modCompany.name SEPARATOR '||') as companies_name, GROUP_CONCAT(CompaniesResources.uri SEPARATOR '||') as companies_uri FROM `tbl_modxsite_companies` AS `modCompany` JOIN `tbl_site_content` `CompaniesResources` ON CompaniesResources.id = modCompany.resource_id AND CompaniesResources.deleted = 0 AND CompaniesResources.published = 1 JOIN `tbl_modxsite_experiences` `Experiences` ON modCompany.id = Experiences.company_id AND Experiences.status = 1 WHERE `modCompany`.`status` = 1 GROUP BY user_id ) `AuthorCompanies` ON modResource.createdby = AuthorCompanies.user_id WHERE ( ( `modResource`.`deleted` = 0 AND `modResource`.`hidemenu` = 0 AND `modResource`.`published` = 1 ) AND (Company.id = 6 OR EXISTS( SELECT `id` FROM `tbl_modxsite_experiences` AS `modExperience` WHERE company_id = 6 AND status = 1 AND (start_date < now() AND ( end_date > now() OR end_date IS NULL ) ) AND FIND_IN_SET(user_id, ProjectMembers.project_members) ) ) AND `modResource`.`parent` = 1443 AND `modResource`.`id` IN (2090,2077,1910,1669,1551,1546,1540,1521) ) ORDER BY modResource.publishedon DESC
Да-да, это один запрос. Получает он много информации. При этом выполняется 5 тысячных секунды...

При этом база-то не маленькая. Документов 2000+, пользователей 3000, и куча прочей связанной инфы.

UPD: Проглазел, бага была, из-за чего не получалось комментарии добавлять. Поправил.

Добавить комментарий