Всем привет!
Сегодня выкатил очень объемные и важные обновления на сайт. Для этого за последние три дня проработал порядка 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: Проглазел, бага была, из-за чего не получалось комментарии добавлять. Поправил.