Read from the package's own PHP files at the commit 19769706a596: its namespaces, classes, interfaces and enums, their public constants, properties and methods with their PHPDoc, and the options its factories take. Nothing of it is run.
ScholarBundleclassA researcher's site: who they are (Scholar), what they published (Publication: a glitchr/omnischolar Work kept here, with what the site adds to it), their CV (Cv\Position, Degree, Award, Grant, Course, Supervision) and their research themes and projects (Theme). The works are read again each week by scholar:sync (the cron container); a new one waits in the back office until it is validated. Talks are omnibase/agenda Events, services omnibase/consulting Offerings.
3 methods
PendingPublicationsWidgetTypeclassThe dashboard's "New publications to validate": what the last syncs found that is not on the site yet - each with its "Validate" and "Reject" -, the CV lines read and still hidden, and when the sources were last read. `yield MenuItem::block('scholar_pending', ...)` in the dashboard's configureWidgetItems() places it.
4 methods
SyncCommandclassEvery scholar's works read again from their sources (OpenAlex, HAL, Crossref... through glitchr/omnischolar), their counts and their CV: new works wait in the back office's "Publications to validate", known ones are brought up to date, what the site added is kept. Run it from the cron container (once a week is plenty: deployments/docker/cron/crontab), or from the back office's "Sync now".
1 method
Base\Scholar\Controller\Admin\Crud\Scholar
AwardCrudControllerclassA line of the CV: a distinction - a prize, a medal, a fellowship - and who gave it.
6 methods
CourseCrudControllerclassA course taught: its title, where, the level, its volume, its years, a link to its material.
6 methods
DegreeCrudControllerclassA line of the CV: a degree - its title, where, when, the thesis and its supervisor.
6 methods
GrantCrudControllerclassA line of the CV: a grant or a funded project - its funder, reference, role, years and amount.
6 methods
PositionCrudControllerclassA line of the CV: a position held - the title, the organization, the department, the years.
6 methods
PublicationCrudControllerclassThe publications: what the sources gave (read only, refreshed at each sync) and what the site adds (validated or not, hidden, pinned, in the selection, a PDF, links to buy it or to the publisher, a cover, a note, themes). "Validate" and "Reject" on each one - the dashboard's "Publications to validate" has the same two buttons. A publication typed by hand ("New") is the site's: its title, authors, year and venue are the record.
10 methods
ScholarCrudControllerclassWho the site is about: the name and the title, the affiliation, the identifiers, where the works are read from (one "source: author" a line - "openalex: A5108007452", "hal: Keitaro Nakatani"), the pages that are theirs elsewhere, the portrait and the biography. "Sync now" reads the sources at once, as the weekly scholar:sync does.
6 methods
SupervisionCrudControllerclassA supervision: the student, the level, the subject, the co-supervisors, what became of it.
6 methods
ThemeCrudControllerclassThe research themes and the projects: a page each (/research/{slug}), the publications filed under it (chosen on each publication).
3 methods
Base\Scholar\Controller\Client
ScholarControllerclassThe scholar's pages: the publications (filtered by kind, year, theme and words; each to cite or to take as BibTeX, RIS or CSL-JSON, the list as well), one publication's page, the books with their covers, the CV, the teaching (courses and supervisions), the research themes and projects. Only what was validated and not hidden is shown.
10 methods
Base\Scholar\DependencyInjection
ScholarConfigurationclass1 method
ScholarExtensionclass2 methods
PublicationclassA work of the scholar's, as the site shows it: the glitchr/omnischolar Work the sources gave, kept whole (`work`, JSON) and refreshed at each sync, with a few columns copied out of it to sort and filter by; and what the site adds, which no sync ever touches - hidden, pinned, in the selection, a PDF of its own, a link to buy it or to the publisher's page, a cover, a note, its themes, and its status (a new work waits to be validated). A publication typed by hand (`manual`) is the site's alone: its columns are the record.
74 methods
ScholarclassThe person the site is about: how they are named and titled, where they work, their identifiers (ORCID, idHAL, OpenAlex), where their works are read from (the profiles: an omnischolar source's name => the author there), the pages that are theirs elsewhere (sameAs), a portrait and a biography - both left empty until they are given: the pages then show a marked draft, never an invented text.
51 methods
ThemeclassA line of research ("Photochromism and fluorescence switching") or a project (with its years, its funder, its page): a page of its own on the site, and the publications filed under it.
33 methods
AwardclassA distinction: a prize, a medal, a fellowship, an honorary title - given by whom (`organization`), the year (`start`).
CourseclassA course taught: its title, where (`organization`), the level ("L3", "Master 2", "teacher training"), its years, its volume, a link to its material.
4 methods
CvEntryclassA line of the CV: what (`title`), where (`organization`, `city`, `country`), when (`start` and `end`, ISO 8601 as precise as known: "2001", "2001-09"), a few words more, a link - and where it came from: typed in the back office, or read from ORCID by scholar:sync (`origin`, `externalKey`), in which case it waits hidden until it is checked.
33 methods · 1 constant
DegreeclassA degree: its title ("PhD in Chemistry", "Habilitation"), where and when (`end`, or `start` alone), its thesis, and who supervised it.
4 methods
GrantclassA grant or a funded project: its title, the funder (`organization`), its reference, the scholar's role ("Principal investigator", "Partner"), its years, its amount as it should be printed.
6 methods
PositionclassA position held: "Professeur des universités" at "ENS Paris-Saclay", since 2015 - the title, the organization, the department or the laboratory.
2 methods
SupervisionclassA supervision: who (`title` holds the student's name), at what level (PhD, master, post-doc), the subject, with whom, and what became of it.
9 methods
PublicationStatusenumWhere a publication stands: read by scholar:sync and waiting for the scholar's eye (pending), on the site (published), or set aside for good (rejected: a homonym's work, a duplicate the sources could not tell apart) - a rejected work found again by the next sync stays rejected.
2 methods · 3 cases
SupervisionLevelenumWho was supervised: a doctoral student, a master's student, a post-doc, an intern.
2 methods · 5 cases
ThemeKindenumA line of research (a theme), or a project with its dates and funding.
2 methods · 2 cases
SitemapListenerclassThe publications' and the themes' own pages in /sitemap.xml: omnibase lists the routes it can generate by itself (/publications, /cv...), a publication or a theme is behind an id or a slug it cannot know.
2 methods
SyncSummaryclassWhat one sync did for one scholar: works new (waiting to be validated, or online at once when the scholar says so), brought up to date, found unchanged, the CV lines read, the sources that did not answer - a sync with a source missing is never taken for "that work is gone".
2 methods · 8 properties
PublicationRepositoryclass11 methods
ScholarRepositoryclass2 methods
ThemeRepositoryclass3 methods
CitationsclassHow a publication is cited: a reference line to copy (authors, year, title, where, volume, pages, DOI - the order the sciences read), and the files a reference manager takes - BibTeX, RIS, CSL-JSON - written by glitchr/omnischolar's Export from what the site shows (its overrides included).
6 methods
CurriculumclassThe CV's sections, each line checked (visible) and in order: the position set by hand first, then the latest - a current one before those that ended.
4 methods · 1 constant
JsonLdclassThe scholar and their works as schema.org reads them: a Person (name, title, affiliation, the pages that are theirs - ORCID, OpenAlex, HAL - as sameAs, research interests as knowsAbout), a ScholarlyArticle, a Book (its ISBNs, its publisher) or a Chapter for each publication.
3 methods
PublicationIndexclassThe scholar's publications, findable by what names a work: any identifier ever seen for it (a DOI, a HAL id, an ISBN of any edition), else its title and year - unless both carry a DOI and they differ (two versions of a dataset, an erratum).
3 methods
SynchronizerclassA scholar's works read again from every source of their profiles (glitchr/omnischolar's Collector: every page, merged), and laid over the publications the site has: a work it does not know comes in waiting to be validated (online at once if the scholar auto-approves), a known one has its sources' record refreshed - and nothing the site added to it moves (hidden, pinned, selection, PDF, links, cover, note, themes, and a work typed by hand). A rejected work found again stays rejected. A work the sources no longer give is left as it is. The counts (h-index...) come from the metrics source, the CV lines from the CV source (ORCID), hidden until checked.
4 methods
WorkDataclassA glitchr/omnischolar Work as the database keeps it - plain arrays in a JSON column - and back, every field included (authors with their identifiers, the venue, a book's editions). What makes two records the same work for the site (keys(), fingerprint()) is here too.
5 methods
ScholarExtensionclassWhat a host's own pages ask the scholar bundle: the person (a home page's portrait and title, their JSON-LD), the selection or the latest publications, the books, the themes, a CV section, a publication's reference line, a work type's name.
3 methods
Base\Scholar
ScholarBundle class
class ScholarBundle extends AbstractBaseBundle ScholarBundle.php:18
A researcher's site: who they are (Scholar), what they published (Publication: a glitchr/omnischolar Work kept here, with what the site adds to it), their CV (Cv\Position, Degree, Award, Grant, Course, Supervision) and their research themes and projects (Theme). The works are read again each week by scholar:sync (the cron container); a new one waits in the back office until it is validated. Talks are omnibase/agenda Events, services omnibase/consulting Offerings.
ScholarBundle::__construct()
public function __construct()ScholarBundle::getPath()
public function getPath(): stringModern layout: the class lives in src/, the bundle root is the package root.
ScholarBundle::build()
public function build(ContainerBuilder $container): voidBase\Scholar\Admin\Widget
PendingPublicationsWidgetType class
final class PendingPublicationsWidgetType implements DashboardWidgetTypeInterface PendingPublicationsWidgetType.php:18
The dashboard's "New publications to validate": what the last syncs
found that is not on the site yet - each with its "Validate" and
"Reject" -, the CV lines read and still hidden, and when the sources
were last read. yield MenuItem::block('scholar_pending', ...) in the
dashboard's configureWidgetItems() places it.
PendingPublicationsWidgetType::__construct()
public function __construct(readonly PublicationRepository $publications, readonly ScholarRepository $scholars, readonly Curriculum $curriculum)PendingPublicationsWidgetType::getName()
public static function getName(): stringPendingPublicationsWidgetType::getTemplate()
public function getTemplate(): stringPendingPublicationsWidgetType::getTemplateVars()
public function getTemplateVars(MenuItem $widget): arrayBase\Scholar\Command
SyncCommand class
final class SyncCommand extends Command SyncCommand.php:22
Every scholar's works read again from their sources (OpenAlex, HAL, Crossref... through glitchr/omnischolar), their counts and their CV: new works wait in the back office's "Publications to validate", known ones are brought up to date, what the site added is kept. Run it from the cron container (once a week is plenty: deployments/docker/cron/crontab), or from the back office's "Sync now".
SyncCommand::__construct()
public function __construct(readonly ScholarRepository $scholars, readonly Synchronizer $synchronizer)Base\Scholar\Controller\Admin\Crud\Scholar
AwardCrudController class
class AwardCrudController extends AbstractCrudController AwardCrudController.php:20
A line of the CV: a distinction - a prize, a medal, a fellowship - and who gave it.
AwardCrudController::getEntityFqcn()
public static function getEntityFqcn(): stringAwardCrudController::getPreferredIcon()
public static function getPreferredIcon(): ?stringAwardCrudController::setScholarRepository()
public function setScholarRepository(ScholarRepository $scholars): voidAwardCrudController::configureFilters()
public function configureFilters(Filters $filters): FiltersAwardCrudController::createEntity()
public function createEntity(string $entityFqcn): objectAwardCrudController::configureFields()
public function configureFields(string $pageName): iterableCourseCrudController class
class CourseCrudController extends AbstractCrudController CourseCrudController.php:20
A course taught: its title, where, the level, its volume, its years, a link to its material.
CourseCrudController::getEntityFqcn()
public static function getEntityFqcn(): stringCourseCrudController::getPreferredIcon()
public static function getPreferredIcon(): ?stringCourseCrudController::setScholarRepository()
public function setScholarRepository(ScholarRepository $scholars): voidCourseCrudController::configureFilters()
public function configureFilters(Filters $filters): FiltersCourseCrudController::createEntity()
public function createEntity(string $entityFqcn): objectCourseCrudController::configureFields()
public function configureFields(string $pageName): iterableDegreeCrudController class
class DegreeCrudController extends AbstractCrudController DegreeCrudController.php:20
A line of the CV: a degree - its title, where, when, the thesis and its supervisor.
DegreeCrudController::getEntityFqcn()
public static function getEntityFqcn(): stringDegreeCrudController::getPreferredIcon()
public static function getPreferredIcon(): ?stringDegreeCrudController::setScholarRepository()
public function setScholarRepository(ScholarRepository $scholars): voidDegreeCrudController::configureFilters()
public function configureFilters(Filters $filters): FiltersDegreeCrudController::createEntity()
public function createEntity(string $entityFqcn): objectDegreeCrudController::configureFields()
public function configureFields(string $pageName): iterableGrantCrudController class
class GrantCrudController extends AbstractCrudController GrantCrudController.php:20
A line of the CV: a grant or a funded project - its funder, reference, role, years and amount.
GrantCrudController::getEntityFqcn()
public static function getEntityFqcn(): stringGrantCrudController::getPreferredIcon()
public static function getPreferredIcon(): ?stringGrantCrudController::setScholarRepository()
public function setScholarRepository(ScholarRepository $scholars): voidGrantCrudController::configureFilters()
public function configureFilters(Filters $filters): FiltersGrantCrudController::createEntity()
public function createEntity(string $entityFqcn): objectGrantCrudController::configureFields()
public function configureFields(string $pageName): iterablePositionCrudController class
class PositionCrudController extends AbstractCrudController PositionCrudController.php:20
A line of the CV: a position held - the title, the organization, the department, the years.
PositionCrudController::getEntityFqcn()
public static function getEntityFqcn(): stringPositionCrudController::getPreferredIcon()
public static function getPreferredIcon(): ?stringPositionCrudController::setScholarRepository()
public function setScholarRepository(ScholarRepository $scholars): voidPositionCrudController::configureFilters()
public function configureFilters(Filters $filters): FiltersPositionCrudController::createEntity()
public function createEntity(string $entityFqcn): objectPositionCrudController::configureFields()
public function configureFields(string $pageName): iterablePublicationCrudController class
class PublicationCrudController extends AbstractCrudController PublicationCrudController.php:38
The publications: what the sources gave (read only, refreshed at each sync) and what the site adds (validated or not, hidden, pinned, in the selection, a PDF, links to buy it or to the publisher, a cover, a note, themes). "Validate" and "Reject" on each one - the dashboard's "Publications to validate" has the same two buttons. A publication typed by hand ("New") is the site's: its title, authors, year and venue are the record.
PublicationCrudController::setScholarServices()
public function setScholarServices(TranslatorInterface $translator, ScholarRepository $scholars): voidPublicationCrudController::getEntityFqcn()
public static function getEntityFqcn(): stringPublicationCrudController::getPreferredIcon()
public static function getPreferredIcon(): ?stringPublicationCrudController::configureCrud()
public function configureCrud(Crud $crud): CrudPublicationCrudController::configureFilters()
public function configureFilters(Filters $filters): FiltersPublicationCrudController::configureFields()
public function configureFields(string $pageName): iterablePublicationCrudController::configureActions()
public function configureActions(Actions $actions): ActionsPublicationCrudController::createEntity()
public function createEntity(string $entityFqcn): objectPublicationCrudController::approve()
public function approve(Request $request, string $entityId): ResponsePublicationCrudController::reject()
public function reject(Request $request, string $entityId): ResponseScholarCrudController class
class ScholarCrudController extends AbstractCrudController ScholarCrudController.php:29
Who the site is about: the name and the title, the affiliation, the identifiers, where the works are read from (one "source: author" a line - "openalex: A5108007452", "hal: Keitaro Nakatani"), the pages that are theirs elsewhere, the portrait and the biography. "Sync now" reads the sources at once, as the weekly scholar:sync does.
ScholarCrudController::setScholarServices()
public function setScholarServices(Synchronizer $synchronizer, TranslatorInterface $translator): voidScholarCrudController::getEntityFqcn()
public static function getEntityFqcn(): stringScholarCrudController::getPreferredIcon()
public static function getPreferredIcon(): ?stringScholarCrudController::configureFields()
public function configureFields(string $pageName): iterableScholarCrudController::configureActions()
public function configureActions(Actions $actions): ActionsScholarCrudController::sync()
public function sync(string $entityId): ResponseThe scholar's sources read now, as scholar:sync does each week.
SupervisionCrudController class
class SupervisionCrudController extends AbstractCrudController SupervisionCrudController.php:21
A supervision: the student, the level, the subject, the co-supervisors, what became of it.
SupervisionCrudController::getEntityFqcn()
public static function getEntityFqcn(): stringSupervisionCrudController::getPreferredIcon()
public static function getPreferredIcon(): ?stringSupervisionCrudController::setScholarRepository()
public function setScholarRepository(ScholarRepository $scholars): voidSupervisionCrudController::configureFilters()
public function configureFilters(Filters $filters): FiltersSupervisionCrudController::createEntity()
public function createEntity(string $entityFqcn): objectSupervisionCrudController::configureFields()
public function configureFields(string $pageName): iterableThemeCrudController class
class ThemeCrudController extends AbstractCrudController ThemeCrudController.php:21
The research themes and the projects: a page each (/research/{slug}), the publications filed under it (chosen on each publication).
ThemeCrudController::getEntityFqcn()
public static function getEntityFqcn(): stringThemeCrudController::getPreferredIcon()
public static function getPreferredIcon(): ?stringThemeCrudController::configureFields()
public function configureFields(string $pageName): iterableBase\Scholar\Controller\Client
ScholarController class
class ScholarController extends AbstractController ScholarController.php:29
The scholar's pages: the publications (filtered by kind, year, theme and words; each to cite or to take as BibTeX, RIS or CSL-JSON, the list as well), one publication's page, the books with their covers, the CV, the teaching (courses and supervisions), the research themes and projects. Only what was validated and not hidden is shown.
ScholarController::__construct()
public function __construct(readonly PublicationRepository $publications, readonly ScholarRepository $scholars, readonly ThemeRepository $themes, readonly Curriculum $curriculum, readonly Citations $citations, readonly JsonLd $jsonLd, readonly int $perPage = 100, readonly bool $withJsonLd = true)ScholarController::publications()
public function publications(Request $request): ResponseScholarController::publicationsExport()
public function publicationsExport(Request $request, string $format): ResponseThe list, filtered as the page is, for a reference manager.
ScholarController::publication()
public function publication(Request $request, int $id, string $slug = ''): ResponseScholarController::publicationExport()
public function publicationExport(int $id, string $format): ResponseScholarController::books()
public function books(): ResponseScholarController::cv()
public function cv(Request $request): ResponseScholarController::teaching()
public function teaching(): ResponseScholarController::research()
public function research(): ResponseScholarController::theme()
public function theme(string $slug): ResponseBase\Scholar\DependencyInjection
ScholarConfiguration class
class ScholarConfiguration extends AbstractBaseConfiguration ScholarConfiguration.php:8
ScholarConfiguration::getConfigTreeBuilder()
public function getConfigTreeBuilder(): TreeBuilderScholarExtension class
class ScholarExtension extends AbstractBaseExtension ScholarExtension.php:11
ScholarExtension::getConfiguration()
public function getConfiguration(array $config, ContainerBuilder $container): ScholarConfigurationScholarExtension::load()
public function load(array $configs, ContainerBuilder $container): voidBase\Scholar\Entity
Publication class
class Publication Publication.php:30
A work of the scholar's, as the site shows it: the glitchr/omnischolar
Work the sources gave, kept whole (work, JSON) and refreshed at each
sync, with a few columns copied out of it to sort and filter by; and what
the site adds, which no sync ever touches - hidden, pinned, in the
selection, a PDF of its own, a link to buy it or to the publisher's page,
a cover, a note, its themes, and its status (a new work waits to be
validated). A publication typed by hand (manual) is the site's alone:
its columns are the record.
Publication::__construct()
public function __construct(?Scholar $scholar = null, ?Work $work = null)Publication::__toString()
public function __toString(): stringPublication::refresh()
public function refresh(Work $work, ?\DateTimeImmutable $at = null): boolThe sources' record, again: the columns follow it, nothing the site added moves. Answers whether anything the page shows changed.
Publication::toWork()
public function toWork(): WorkThe work as the site shows and exports it: the sources' record with what the site changed - the columns of a manual one, its own PDF, the publisher's page it gave.
Publication::getId()
public function getId(): ?intPublication::getScholar()
public function getScholar(): ?ScholarPublication::setScholar()
public function setScholar(?Scholar $scholar): selfPublication::getStatus()
public function getStatus(): PublicationStatusPublication::setStatus()
public function setStatus(PublicationStatus|string $status): selfPublication::isPending()
public function isPending(): boolPublication::isPublished()
public function isPublished(): boolPublication::approve()
public function approve(): selfPublication::reject()
public function reject(): selfPublication::isShown()
public function isShown(): boolOn the site: validated and not hidden.
Publication::getTitle()
public function getTitle(): ?stringPublication::setTitle()
public function setTitle(?string $title): selfPublication::getType()
public function getType(): stringPublication::setType()
public function setType(WorkType|string|null $type): selfPublication::getWorkType()
public function getWorkType(): WorkTypePublication::isBook()
public function isBook(): boolPublication::getYear()
public function getYear(): ?intPublication::setYear()
public function setYear(?int $year): selfPublication::getVenue()
public function getVenue(): ?stringPublication::setVenue()
public function setVenue(?string $venue): selfPublication::getAuthors()
public function getAuthors(): ?stringPublication::setAuthors()
public function setAuthors(?string $authors): selfPublication::getDoi()
public function getDoi(): ?stringPublication::setDoi()
public function setDoi(?string $doi): selfPublication::getCitations()
public function getCitations(): ?intPublication::getWork()
public function getWork(): ?arrayPublication::getAbstract()
public function getAbstract(): ?stringThe sources' abstract.
Publication::getSources()
public function getSources(): arrayPublication::getIdentifiers()
public function getIdentifiers(): array- Returns
identifiers by scheme
Publication::getHalId()
public function getHalId(): ?stringPublication::getArxivId()
public function getArxivId(): ?stringPublication::getIsbns()
public function getIsbns(): array- Returns
ISBN-13s, the editions' included
Publication::getEditions()
public function getEditions(): array- Returns
a book's editions, newest first
Publication::getMatchKeys()
public function getMatchKeys(): arrayPublication::getFingerprint()
public function getFingerprint(): ?stringPublication::getFetchedAt()
public function getFetchedAt(): ?\DateTimeImmutablePublication::getLastSeenAt()
public function getLastSeenAt(): ?\DateTimeImmutablePublication::getCreatedAt()
public function getCreatedAt(): \DateTimeImmutablePublication::isManual()
public function isManual(): boolPublication::setManual()
public function setManual(bool $manual): selfPublication::isHidden()
public function isHidden(): boolPublication::setHidden()
public function setHidden(bool $hidden): selfPublication::isPinned()
public function isPinned(): boolPublication::setPinned()
public function setPinned(bool $pinned): selfPublication::isSelected()
public function isSelected(): boolPublication::setSelected()
public function setSelected(bool $selected): selfPublication::getPdf()
public function getPdf(): ?stringPublication::getPdfFile()
public function getPdfFile(): ?FilePublication::setPdf()
public function setPdf($pdf): selfPublication::hasPdf()
public function hasPdf(): boolPublication::getPdfUrl()
public function getPdfUrl(): ?stringPublication::setPdfUrl()
public function setPdfUrl(?string $pdfUrl): selfPublication::getBuyUrl()
public function getBuyUrl(): ?stringPublication::setBuyUrl()
public function setBuyUrl(?string $buyUrl): selfPublication::getPublisherUrl()
public function getPublisherUrl(): ?stringPublication::setPublisherUrl()
public function setPublisherUrl(?string $publisherUrl): selfPublication::getCover()
public function getCover(): ?stringPublication::getCoverFile()
public function getCoverFile(): ?FilePublication::setCover()
public function setCover($cover): selfPublication::hasCover()
public function hasCover(): boolPublication::getCoverUrl()
public function getCoverUrl(): ?stringThe cover to show: the one uploaded, else the sources' (Open Library's).
Publication::getFullTextUrl()
public function getFullTextUrl(): ?stringThe full text to offer: the PDF uploaded, the address given, else the sources'.
Publication::getLink()
public function getLink(): ?stringWhere the work is read: the publisher's page given, else the DOI, else the sources' page.
Publication::isOpenAccess()
public function isOpenAccess(): boolPublication::getNote()
public function getNote(): ?stringPublication::setNote()
public function setNote(?string $note): selfPublication::getThemes()
public function getThemes(): CollectionPublication::addTheme()
public function addTheme(Theme $theme): selfPublication::removeTheme()
public function removeTheme(Theme $theme): selfPublication::getSlug()
public function getSlug(): stringThe page's address piece: "acid-sensitive-photoswitches".
Scholar class
class Scholar Scholar.php:19
The person the site is about: how they are named and titled, where they work, their identifiers (ORCID, idHAL, OpenAlex), where their works are read from (the profiles: an omnischolar source's name => the author there), the pages that are theirs elsewhere (sameAs), a portrait and a biography - both left empty until they are given: the pages then show a marked draft, never an invented text.
Scholar::__construct()
public function __construct(?string $name = null)Scholar::__toString()
public function __toString(): stringScholar::getId()
public function getId(): ?intScholar::getName()
public function getName(): ?stringScholar::setName()
public function setName(?string $name): selfScholar::getGivenName()
public function getGivenName(): ?stringScholar::setGivenName()
public function setGivenName(?string $givenName): selfScholar::getFamilyName()
public function getFamilyName(): ?stringScholar::setFamilyName()
public function setFamilyName(?string $familyName): selfScholar::getHonorific()
public function getHonorific(): ?stringScholar::setHonorific()
public function setHonorific(?string $honorific): selfScholar::getFullName()
public function getFullName(): string"Dr. Monica Neagoy".
Scholar::getJobTitle()
public function getJobTitle(): ?stringScholar::setJobTitle()
public function setJobTitle(?string $jobTitle): selfScholar::getAffiliation()
public function getAffiliation(): ?stringScholar::setAffiliation()
public function setAffiliation(?string $affiliation): selfScholar::getAffiliationUrl()
public function getAffiliationUrl(): ?stringScholar::setAffiliationUrl()
public function setAffiliationUrl(?string $affiliationUrl): selfScholar::getOrcid()
public function getOrcid(): ?stringScholar::setOrcid()
public function setOrcid(?string $orcid): selfScholar::getProfiles()
public function getProfiles(): arrayScholar::setProfiles()
public function setProfiles(array $profiles): selfScholar::addProfile()
public function addProfile(string $source, string $author): selfScholar::getProfilesText()
public function getProfilesText(): stringThe profiles as the back office types them: one "source: author" a line.
Scholar::setProfilesText()
public function setProfilesText(?string $text): selfScholar::getSameAs()
public function getSameAs(): arrayScholar::setSameAs()
public function setSameAs(array $sameAs): selfScholar::getSameAsText()
public function getSameAsText(): stringScholar::setSameAsText()
public function setSameAsText(?string $text): selfScholar::getIdentityUrls()
public function getIdentityUrls(): arrayEvery page that is this person's: the ones typed, and the profiles read from that have an address (ORCID, OpenAlex, HAL's idHAL).
Scholar::getKeywords()
public function getKeywords(): arrayScholar::setKeywords()
public function setKeywords(array $keywords): selfScholar::getKeywordsText()
public function getKeywordsText(): stringScholar::setKeywordsText()
public function setKeywordsText(?string $text): selfScholar::getPortrait()
public function getPortrait(): ?stringScholar::getPortraitFile()
public function getPortraitFile(): ?FileScholar::setPortrait()
public function setPortrait($portrait): selfScholar::hasPortrait()
public function hasPortrait(): boolScholar::getPortraitUrl()
public function getPortraitUrl(): ?stringThe portrait's address on the site ("/uploads/…"), what an <img> takes.
Scholar::getBiography()
public function getBiography(): ?stringScholar::setBiography()
public function setBiography(?string $biography): selfScholar::getBiographyParagraphs()
public function getBiographyParagraphs(): arrayScholar::isAutoApprove()
public function isAutoApprove(): boolScholar::setAutoApprove()
public function setAutoApprove(bool $autoApprove): selfScholar::getFromYear()
public function getFromYear(): ?intScholar::setFromYear()
public function setFromYear(?int $fromYear): selfScholar::getMetrics()
public function getMetrics(): ?arrayScholar::setMetrics()
public function setMetrics(?array $metrics): selfScholar::getLastSyncAt()
public function getLastSyncAt(): ?\DateTimeImmutableScholar::getLastSync()
public function getLastSync(): ?arrayScholar::rememberSync()
public function rememberSync(array $summary, \DateTimeImmutable $at): selfTheme class
class Theme Theme.php:21
A line of research ("Photochromism and fluorescence switching") or a project (with its years, its funder, its page): a page of its own on the site, and the publications filed under it.
Theme::__construct()
public function __construct(?string $title = null, ThemeKind $kind = ThemeKind::THEME)Theme::__toString()
public function __toString(): stringTheme::getId()
public function getId(): ?intTheme::getKind()
public function getKind(): ThemeKindTheme::setKind()
public function setKind(ThemeKind|string $kind): selfTheme::isProject()
public function isProject(): boolTheme::getTitle()
public function getTitle(): ?stringTheme::setTitle()
public function setTitle(?string $title): selfTheme::getSlug()
public function getSlug(): ?stringTheme::setSlug()
public function setSlug(?string $slug): selfTheme::getSummary()
public function getSummary(): ?stringTheme::setSummary()
public function setSummary(?string $summary): selfTheme::getDescription()
public function getDescription(): ?stringTheme::setDescription()
public function setDescription(?string $description): selfTheme::getParagraphs()
public function getParagraphs(): arrayTheme::getImage()
public function getImage(): ?stringTheme::getImageFile()
public function getImageFile(): ?FileTheme::setImage()
public function setImage($image): selfTheme::getImageUrl()
public function getImageUrl(): ?stringThe picture's address on the site ("/uploads/…").
Theme::getStartYear()
public function getStartYear(): ?intTheme::setStartYear()
public function setStartYear(?int $startYear): selfTheme::getEndYear()
public function getEndYear(): ?intTheme::setEndYear()
public function setEndYear(?int $endYear): selfTheme::getYears()
public function getYears(): ?string"2019–2023", "since 2021".
Theme::getFunder()
public function getFunder(): ?stringTheme::setFunder()
public function setFunder(?string $funder): selfTheme::getUrl()
public function getUrl(): ?stringTheme::setUrl()
public function setUrl(?string $url): selfTheme::getPosition()
public function getPosition(): intTheme::setPosition()
public function setPosition(?int $position): selfTheme::isVisible()
public function isVisible(): boolTheme::setVisible()
public function setVisible(bool $visible): selfTheme::getPublications()
public function getPublications(): CollectionBase\Scholar\Entity\Cv
Award class
class Award extends CvEntry Award.php:11
A distinction: a prize, a medal, a fellowship, an honorary title - given by whom
(organization), the year (start).
Course class
class Course extends CvEntry Course.php:11
A course taught: its title, where (organization), the level ("L3", "Master 2", "teacher
training"), its years, its volume, a link to its material.
Course::getLevel()
public function getLevel(): ?stringCourse::setLevel()
public function setLevel(?string $level): staticCourse::getVolume()
public function getVolume(): ?stringCourse::setVolume()
public function setVolume(?string $volume): staticCvEntry class
abstract class CvEntry CvEntry.php:16
A line of the CV: what (title), where (organization, city,
country), when (start and end, ISO 8601 as precise as known:
"2001", "2001-09"), a few words more, a link - and where it came from: typed
in the back office, or read from ORCID by scholar:sync (origin,
externalKey), in which case it waits hidden until it is checked.
const ORIGIN_SITE = 'site'
CvEntry::__construct()
public function __construct(?Scholar $scholar = null, ?string $title = null)CvEntry::__toString()
public function __toString(): stringCvEntry::getId()
public function getId(): ?intCvEntry::getScholar()
public function getScholar(): ?ScholarCvEntry::setScholar()
public function setScholar(?Scholar $scholar): staticCvEntry::getTitle()
public function getTitle(): ?stringCvEntry::setTitle()
public function setTitle(?string $title): staticCvEntry::getOrganization()
public function getOrganization(): ?stringCvEntry::setOrganization()
public function setOrganization(?string $organization): staticCvEntry::getCity()
public function getCity(): ?stringCvEntry::setCity()
public function setCity(?string $city): staticCvEntry::getCountry()
public function getCountry(): ?stringCvEntry::setCountry()
public function setCountry(?string $country): staticCvEntry::getStart()
public function getStart(): ?stringCvEntry::setStart()
public function setStart(int|string|null $start): staticCvEntry::getEnd()
public function getEnd(): ?stringCvEntry::setEnd()
public function setEnd(int|string|null $end): staticCvEntry::getStartYear()
public function getStartYear(): ?intCvEntry::getEndYear()
public function getEndYear(): ?intCvEntry::isCurrent()
public function isCurrent(): boolStarted and not ended.
CvEntry::getPeriod()
public function getPeriod(): ?string"2019–2023", "2019–" (current), "2019".
CvEntry::getDescription()
public function getDescription(): ?stringCvEntry::setDescription()
public function setDescription(?string $description): staticCvEntry::getUrl()
public function getUrl(): ?stringCvEntry::setUrl()
public function setUrl(?string $url): staticCvEntry::getPosition()
public function getPosition(): intCvEntry::setPosition()
public function setPosition(?int $position): staticCvEntry::isVisible()
public function isVisible(): boolCvEntry::setVisible()
public function setVisible(bool $visible): staticCvEntry::getOrigin()
public function getOrigin(): stringCvEntry::setOrigin()
public function setOrigin(?string $origin): staticCvEntry::getExternalKey()
public function getExternalKey(): ?stringCvEntry::setExternalKey()
public function setExternalKey(?string $externalKey): staticDegree class
class Degree extends CvEntry Degree.php:11
A degree: its title ("PhD in Chemistry", "Habilitation"), where and when (end, or start
alone), its thesis, and who supervised it.
Degree::getThesis()
public function getThesis(): ?stringDegree::setThesis()
public function setThesis(?string $thesis): staticDegree::getAdvisor()
public function getAdvisor(): ?stringDegree::setAdvisor()
public function setAdvisor(?string $advisor): staticGrant class
class Grant extends CvEntry Grant.php:11
A grant or a funded project: its title, the funder (organization), its reference, the
scholar's role ("Principal investigator", "Partner"), its years, its amount as it should be printed.
Grant::getReference()
public function getReference(): ?stringGrant::setReference()
public function setReference(?string $reference): staticGrant::getRole()
public function getRole(): ?stringGrant::setRole()
public function setRole(?string $role): staticGrant::getAmount()
public function getAmount(): ?stringGrant::setAmount()
public function setAmount(?string $amount): staticPosition class
class Position extends CvEntry Position.php:11
A position held: "Professeur des universités" at "ENS Paris-Saclay", since 2015 - the title, the organization, the department or the laboratory.
Position::getDepartment()
public function getDepartment(): ?stringPosition::setDepartment()
public function setDepartment(?string $department): staticSupervision class
class Supervision extends CvEntry Supervision.php:12
A supervision: who (title holds the student's name), at what level (PhD, master, post-doc),
the subject, with whom, and what became of it.
Supervision::getStudent()
public function getStudent(): ?stringSupervision::getLevel()
public function getLevel(): SupervisionLevelSupervision::setLevel()
public function setLevel(SupervisionLevel|string $level): staticSupervision::getSubject()
public function getSubject(): ?stringSupervision::setSubject()
public function setSubject(?string $subject): staticSupervision::getCoSupervisors()
public function getCoSupervisors(): ?stringSupervision::setCoSupervisors()
public function setCoSupervisors(?string $coSupervisors): staticSupervision::getOutcome()
public function getOutcome(): ?stringSupervision::setOutcome()
public function setOutcome(?string $outcome): staticBase\Scholar\Enum
PublicationStatus enum
enum PublicationStatus implements TranslatableInterface PublicationStatus.php:14
Where a publication stands: read by scholar:sync and waiting for the scholar's eye (pending), on the site (published), or set aside for good (rejected: a homonym's work, a duplicate the sources could not tell apart) - a rejected work found again by the next sync stays rejected.
case PENDING = 'pending'case PUBLISHED = 'published'case REJECTED = 'rejected'
PublicationStatus::label()
public function label(): stringPublicationStatus::trans()
public function trans(TranslatorInterface $translator, ?string $locale = null): stringIts name in the scholar domain: what a select of the back office shows.
SupervisionLevel enum
enum SupervisionLevel implements TranslatableInterface SupervisionLevel.php:9
Who was supervised: a doctoral student, a master's student, a post-doc, an intern.
case PHD = 'phd'case MASTER = 'master'case POSTDOC = 'postdoc'case INTERN = 'intern'case OTHER = 'other'
SupervisionLevel::label()
public function label(): stringSupervisionLevel::trans()
public function trans(TranslatorInterface $translator, ?string $locale = null): stringIts name in the scholar domain: what a select of the back office shows.
ThemeKind enum
enum ThemeKind implements TranslatableInterface ThemeKind.php:9
A line of research (a theme), or a project with its dates and funding.
case THEME = 'theme'case PROJECT = 'project'
ThemeKind::label()
public function label(): stringThemeKind::trans()
public function trans(TranslatorInterface $translator, ?string $locale = null): stringIts name in the scholar domain: what a select of the back office shows.
Base\Scholar\EventListener
SitemapListener class
final class SitemapListener SitemapListener.php:15
The publications' and the themes' own pages in /sitemap.xml: omnibase lists the routes it can generate by itself (/publications, /cv...), a publication or a theme is behind an id or a slug it cannot know.
SitemapListener::__construct()
public function __construct(readonly PublicationRepository $publications, readonly ThemeRepository $themes)SitemapListener::__invoke()
public function __invoke(SitemapEvent $event): voidBase\Scholar\Model
SyncSummary class
final class SyncSummary SyncSummary.php:11
What one sync did for one scholar: works new (waiting to be validated, or online at once when the scholar says so), brought up to date, found unchanged, the CV lines read, the sources that did not answer - a sync with a source missing is never taken for "that work is gone".
public int $read = 0public int $created = 0public int $updated = 0public int $unchanged = 0public int $ignored = 0Works the scholar rejected once, found again: they stay rejected.
public int $cv = 0public array $incomplete = []public array $errors = []
SyncSummary::isComplete()
public function isComplete(): boolSyncSummary::toArray()
public function toArray(): arrayBase\Scholar\Repository
PublicationRepository class
class PublicationRepository extends ServiceEntityRepository PublicationRepository.php:14
PublicationRepository::__construct()
public function __construct(ManagerRegistry $registry)PublicationRepository::shown()
public function shown(): QueryBuilderWhat the site shows: validated, not hidden.
PublicationRepository::findShown()
public function findShown(array $types = [], ?int $year = null, ?Theme $theme = null, ?string $text = null, ?int $limit = null, int $offset = 0, array $excludeTypes = []): arrayThe list of the publications page: pinned first, then newest first; filtered by kind, year, theme and words of the title, authors or venue.
PublicationRepository::countShown()
public function countShown(array $types = [], ?int $year = null, ?Theme $theme = null, ?string $text = null, array $excludeTypes = []): intPublicationRepository::findSelected()
public function findSelected(int $limit = 5): array- Returns
the selection: the ones marked, else the pinned, else the latest
PublicationRepository::findOneShown()
public function findOneShown(int $id): ?PublicationPublicationRepository::findYears()
public function findYears(): array- Returns
the years that have a publication, newest first
PublicationRepository::countByType()
public function countByType(): array- Returns
type => count
PublicationRepository::findAllOf()
public function findAllOf(Scholar $scholar): array- Returns
every publication of a scholar, whatever its status: what a sync matches against
PublicationRepository::findPending()
public function findPending(?int $limit = null): array- Returns
the ones waiting for the scholar's eye, newest first
PublicationRepository::countPending()
public function countPending(): intScholarRepository class
class ScholarRepository extends ServiceEntityRepository ScholarRepository.php:10
ScholarRepository::__construct()
public function __construct(ManagerRegistry $registry)ScholarRepository::findMain()
public function findMain(): ?ScholarThe site's scholar: the first one typed (a site is usually one person's).
ThemeRepository class
class ThemeRepository extends ServiceEntityRepository ThemeRepository.php:11
ThemeRepository::__construct()
public function __construct(ManagerRegistry $registry)ThemeRepository::findVisible()
public function findVisible(?ThemeKind $kind = null): array- Returns
the visible ones, in their order; of one kind when asked
ThemeRepository::findOneVisible()
public function findOneVisible(string $slug): ?ThemeBase\Scholar\Service
Citations class
final class Citations Citations.php:19
How a publication is cited: a reference line to copy (authors, year, title, where, volume, pages, DOI - the order the sciences read), and the files a reference manager takes - BibTeX, RIS, CSL-JSON - written by glitchr/omnischolar's Export from what the site shows (its overrides included).
Citations::__construct()
public function __construct(bool $abstracts = false)Citations::reference()
public function reference(Publication $publication): string"Chocron, L., Nakatani, K. et al. (2024). Acid-sensitive photoswitches. Chemical Science, 15(41), 17060–17071. https://doi.org/10.1039/d4sc04973j"
Citations::export()
public function export(string $format, Publication|iterable $publications): string$formatbibtex, ris, csl-json
Citations::contentType()
public static function contentType(string $format): stringCitations::extension()
public static function extension(string $format): string"bib" for BibTeX, "ris", "json" for CSL-JSON: the file's extension.
Citations::format()
public static function format(string $extension): ?string"bib" => bibtex: a file's extension to its format, null if none.
Curriculum class
final class Curriculum Curriculum.php:19
The CV's sections, each line checked (visible) and in order: the position set by hand first, then the latest - a current one before those that ended.
const SECTIONS = ['positions' => Position::class, 'degrees' => Degree::class, 'awards' => Award::class, 'grants' => Grant::class, 'courses' => Course::class, 'supervisions' =…Section => entity, in the order a CV reads.
Curriculum::__construct()
public function __construct(readonly EntityManagerInterface $entityManager)Curriculum::sections()
public function sections(?array $sections = null): array$sectionsthe ones wanted (SECTIONS' keys)
- Returns
the sections that have a line
Curriculum::entries()
public function entries(string $class): arrayCurriculum::countHidden()
public function countHidden(): intHow many lines of the CV wait hidden (read from ORCID, not checked yet).
JsonLd class
final class JsonLd JsonLd.php:16
The scholar and their works as schema.org reads them: a Person (name, title, affiliation, the pages that are theirs - ORCID, OpenAlex, HAL - as sameAs, research interests as knowsAbout), a ScholarlyArticle, a Book (its ISBNs, its publisher) or a Chapter for each publication.
JsonLd::person()
public function person(Scholar $scholar, ?string $url = null, ?string $image = null): arrayJsonLd::publication()
public function publication(Publication $publication, ?string $url = null, ?Scholar $scholar = null): arrayJsonLd::list()
public function list(array $publications, string $name, ?Scholar $scholar = null): arrayPublicationIndex class
final class PublicationIndex PublicationIndex.php:14
The scholar's publications, findable by what names a work: any identifier ever seen for it (a DOI, a HAL id, an ISBN of any edition), else its title and year - unless both carry a DOI and they differ (two versions of a dataset, an erratum).
PublicationIndex::__construct()
public function __construct(iterable $publications = [])PublicationIndex::add()
public function add(Publication $publication): voidPublicationIndex::find()
public function find(Work $work): ?PublicationSynchronizer class
class Synchronizer Synchronizer.php:34
A scholar's works read again from every source of their profiles (glitchr/omnischolar's Collector: every page, merged), and laid over the publications the site has: a work it does not know comes in waiting to be validated (online at once if the scholar auto-approves), a known one has its sources' record refreshed - and nothing the site added to it moves (hidden, pinned, selection, PDF, links, cover, note, themes, and a work typed by hand). A rejected work found again stays rejected. A work the sources no longer give is left as it is. The counts (h-index...) come from the metrics source, the CV lines from the CV source (ORCID), hidden until checked.
Synchronizer::__construct()
public function __construct(readonly EntityManagerInterface $entityManager, readonly PublicationRepository $publications, readonly ?Registry $registry = null, readonly ?Collector $collector = null, readonly int $max = 2000, readonly ?string $metricsSource = 'openalex', readonly ?string $cvSource = 'orcid')Synchronizer::isAvailable()
public function isAvailable(): boolWhether omnischolar is there to be asked.
Synchronizer::sync()
public function sync(Scholar $scholar, ?\DateTimeImmutable $at = null): SyncSummarySynchronizer::merge()
public function merge(Scholar $scholar, iterable $works, ?SyncSummary $summary = null, ?\DateTimeImmutable $at = null): SyncSummaryWorks laid over the scholar's publications, as a sync does after reading them (public: a test, an import of a file, call it directly).
Persisted, not flushed.
WorkData class
final class WorkData WorkData.php:18
A glitchr/omnischolar Work as the database keeps it - plain arrays in a JSON column - and back, every field included (authors with their identifiers, the venue, a book's editions). What makes two records the same work for the site (keys(), fingerprint()) is here too.
WorkData::toArray()
public static function toArray(Work $work): arrayWorkData::fromArray()
public static function fromArray(array $data): Work$datawhat toArray() gave
WorkData::keys()
public static function keys(Work $work): arrayWhat names the work for good: its identifiers ("doi:10.1039/d4sc04973j", "hal:hal-04772417", "isbn:9781412996600"...), its editions' included.
WorkData::fingerprint()
public static function fingerprint(Work $work): stringIts title without accents nor punctuation, and its year: the last resort to tell it again.
WorkData::authorsLine()
public static function authorsLine(Work $work, int $max = 8): string"Chocron, L.; Nakatani, K. et al.": the authors as a list prints them.
Base\Scholar\Twig
ScholarExtension class
final class ScholarExtension extends AbstractExtension ScholarExtension.php:26
What a host's own pages ask the scholar bundle: the person (a home page's portrait and title, their JSON-LD), the selection or the latest publications, the books, the themes, a CV section, a publication's reference line, a work type's name.
ScholarExtension::__construct()
public function __construct(readonly ScholarRepository $scholars, readonly PublicationRepository $publications, readonly ThemeRepository $themes, readonly Curriculum $curriculum, readonly Citations $citations, readonly JsonLd $jsonLd, readonly TranslatorInterface $translator)ScholarExtension::getFunctions()
public function getFunctions(): arrayScholarExtension::getFilters()
public function getFilters(): array