Silverstripe-ideannotator - Generate docblocks for DataObjects, Page, PageControllers and (Data)Extensions

Overview

silverstripe-ideannotator

Scrutinizer Travis codecov Packagist Packagist Packagist Pre Release

This module generates @property, @method and @mixin tags for DataObjects, PageControllers and (Data)Extensions, so ide's like PHPStorm recognize the database and relations that are set in the $db, $has_one, $has_many and $many_many arrays.

The docblocks can be generated/updated with each dev/build and with a DataObjectAnnotatorTask per module or classname.

Requirements

SilverStripe Framework and possible custom code.

By default, mysite is an enabled "module".

Version ^2:

SilverStripe 3.x framework

Version ^3:

SilverStripe 4.x

Installation

{
  "require-dev": {
    "silverleague/ideannotator": "3.x-dev"
  }
}

Please note, this example omitted any possible modules you require yourself!

Example result

<?php

/**
 * Class NewsItem
 *
 * @property string $Title
 * @property int $Sort
 * @property int $Version
 * @property int $AuthorID
 * @method \SilverStripe\Security\Member Author()
 * @method \SilverStripe\ORM\DataList|Category[] Categories()
 * @method \SilverStripe\ORM\ManyManyList|Tag[] Tags()
 * @mixin Versioned
 */
class NewsItem extends \SilverStripe\ORM\DataObject
{
    private static $db = array(
        'Title'	=> 'Varchar(255)',
        'Sort'	=> 'Int'
    );

    private static $has_one = array(
        'Author' => Member::class
    );

    private static $has_many = array(
        'Categories' => Category::class
    );

    private static $many_many = array(
        'Tags' => Tag::class
    );
}

Further information

For installation, see installation

For the Code of Conduct, see CodeOfConduct

For contributing, see Contributing

For further documentation information, see the docs

A word of caution

This module changes the content of your files and currently there is no backup functionality. PHPStorm has a Local history for files and of course you have your code version controlled... I tried to add complete UnitTests, but I can't garantuee every situation is covered.

This module should never be installed on a production environment.

Comments
  • Move to a modern version of reflection docblock

    Move to a modern version of reflection docblock

    This pull request incorporates changes from #139 but more importantly switches to phpdocumentor/reflection-docblock ^5.2 to address compatibility with PHPUnit ^9.5 that Silverstripe 4.10 supports. I believe this may also break compatibility with Silverstripe projects using PHPUnit 5.7 because of conflicting dependencies between the two versions.

    opened by UndefinedOffset 22
  • Unit tests include hardcoded paths

    Unit tests include hardcoded paths

    I found this lovely piece of code in the AnnotatorPageTest.php. We moved Page and PageController to a different location (under Pages folder) in our project. Since these paths are hard coded unit tests are now failing. At least the code comments were honest about the situation.

    // Why is this required?
    // @todo get it to work properly
    require_once(BASE_PATH . '/mysite/code/Page.php');
    require_once(BASE_PATH . '/mysite/code/PageController.php');
    

    I recommend avoiding using hard coded paths for includes if you're including stuff from project folder.

    bug help wanted dev-issue 
    opened by mfendeksilverstripe 15
  • Generate metadata for factory method auto completion

    Generate metadata for factory method auto completion

    Currently methods like TextField::create(); does not 'resolve' to the TextField class but stays in Object.

    Laravel as a great ide helper: https://github.com/barryvdh/laravel-ide-helper which generates a same kind of helper file.

    PHPStorm documentation https://confluence.jetbrains.com/display/PhpStorm/PhpStorm+Advanced+Metadata

    I looked into this, but it is not as easy as it seems.

    The problem is that Object::create(); uses get_called_class(); to get the class to generate. If any has an idea to tackle this, I think this would be a great feature..

    opened by axyr 15
  • Altered annotations are removed

    Altered annotations are removed

    When an annotation is edited by the user, it gets destroyed. It would be nice to compare the existing, and only destroy those that are not needed anymore.

    opened by Firesphere 14
  • Master seems to no more removed unused properties

    Master seems to no more removed unused properties

    I updated to the master version yesterday, and I really appreciate how things work without needing to add the start and end tags, however it seems that unused properties are no more removed. See below - I removed ReadMoreTitle and Content, but after a db build they are still there

    <?php
    
    /**
     * ReadMoreBlock
     *
     * @author Anselm Christophersen <[email protected]>
     * @date April 2016
     * @property string $Summary
     * @property string $Content
     * @property string $ReadMoreTitle
     * @property int $ImageID
     * @method Image Image()
     * @property int $LinkID
     * @method Link Link()
     */
    class ReadMoreBlock extends Block
    {
        private static $singular_name = 'Read More';
        private static $plural_name = 'Read More';
    
        private static $db = [
            'Summary' => 'Text',
        ];
    
        private static $has_one = [
            'Image' => 'Image',
            'Link' => 'Link',
        ];
    }
    
    opened by anselmdk 14
  • Feature: Generate API documentation

    Feature: Generate API documentation

    opened by pandauxstudio 13
  • Error when running dev/build

    Error when running dev/build

    Strange one for some reason i think its unable to find files it should be able to?

    dev/build completes but this error is still shown below the output

    GET /dev/build?flushtoken=b0ca9d6852f5b8536f106e5d10fe3639&flush=1
    
    Line 227 in /Users/phyzical/Sites/dasdasds/vendor/silverstripe/framework/src/Core/ClassInfo.php
    Source
    
    218         }
    219 
    220         $key = strtolower($nameOrObject);
    221         if (!isset(static::$_cache_class_names[$key])) {
    222             // Get manifest name
    223             $name = ClassLoader::inst()->getManifest()->getItemName($nameOrObject);
    224 
    225             // Use reflection for non-manifest classes
    226             if (!$name) {
    227                 $reflection = new ReflectionClass($nameOrObject);
    228                 $name = $reflection->getName();
    229             }
    230             static::$_cache_class_names[$key] = $name;
    231         }
    232 
    233         return static::$_cache_class_names[$key];
    
    Trace
    
        ReflectionClass->__construct(silverstripe\filesystem\storage\dbfile)
        ClassInfo.php:227
        SilverStripe\Core\ClassInfo::class_name(silverstripe\filesystem\storage\dbfile)
        DataObjectAnnotator.php:127
        SilverLeague\IDEAnnotator\DataObjectAnnotator->setupExtensionClasses()
        DataObjectAnnotator.php:89
        SilverLeague\IDEAnnotator\DataObjectAnnotator->__construct()
        ReflectionClass->newInstance()
        InjectionCreator.php:26
        SilverStripe\Core\Injector\InjectionCreator->create(SilverLeague\IDEAnnotator\DataObjectAnnotator, Array)
        Injector.php:585
        SilverStripe\Core\Injector\Injector->instantiate(Array, SilverLeague\IDEAnnotator\DataObjectAnnotator, singleton)
        Injector.php:993
        SilverStripe\Core\Injector\Injector->getNamedService(SilverLeague\IDEAnnotator\DataObjectAnnotator, 1, Array)
        Injector.php:946
        SilverStripe\Core\Injector\Injector->get(SilverLeague\IDEAnnotator\DataObjectAnnotator)
        Annotatable.php:81
        SilverLeague\IDEAnnotator\Extensions\Annotatable->setUp()
        Annotatable.php:56
        SilverLeague\IDEAnnotator\Extensions\Annotatable->afterCallActionHandler(SilverStripe\Control\HTTPRequest, build, HTTP/1.1 200 OK content-type: text/html; charset=utf-8 , , , , )
        Extensible.php:464
        SilverStripe\View\ViewableData->extend(afterCallActionHandler, SilverStripe\Control\HTTPRequest, build, HTTP/1.1 200 OK content-type: text/html; charset=utf-8 )
        RequestHandler.php:322
        SilverStripe\Control\RequestHandler->handleAction(SilverStripe\Control\HTTPRequest, build)
        Controller.php:284
        SilverStripe\Control\Controller->handleAction(SilverStripe\Control\HTTPRequest, build)
        RequestHandler.php:202
        SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
        Controller.php:212
        SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
        RequestHandler.php:226
        SilverStripe\Control\RequestHandler->handleRequest(SilverStripe\Control\HTTPRequest)
        Controller.php:212
        SilverStripe\Control\Controller->handleRequest(SilverStripe\Control\HTTPRequest)
        Director.php:361
        SilverStripe\Control\Director->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
        VersionedHTTPMiddleware.php:40
        SilverStripe\Versioned\VersionedHTTPMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
        HTTPMiddlewareAware.php:62
        SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
        BasicAuthMiddleware.php:68
        SilverStripe\Security\BasicAuthMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
        HTTPMiddlewareAware.php:62
        SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
        AuthenticationMiddleware.php:61
        SilverStripe\Security\AuthenticationMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
        HTTPMiddlewareAware.php:62
        SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
        AkismetMiddleware.php:22
        SilverStripe\Akismet\Config\AkismetMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
        HTTPMiddlewareAware.php:62
        SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
        CanonicalURLMiddleware.php:188
        SilverStripe\Control\Middleware\CanonicalURLMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
        HTTPMiddlewareAware.php:62
        SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
        HTTPCacheControlMiddleware.php:42
        SilverStripe\Control\Middleware\HTTPCacheControlMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
        HTTPMiddlewareAware.php:62
        SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
        ChangeDetectionMiddleware.php:27
        SilverStripe\Control\Middleware\ChangeDetectionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
        HTTPMiddlewareAware.php:62
        SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
        FlushMiddleware.php:29
        SilverStripe\Control\Middleware\FlushMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
        HTTPMiddlewareAware.php:62
        SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
        RequestProcessor.php:66
        SilverStripe\Control\RequestProcessor->process(SilverStripe\Control\HTTPRequest, Closure)
        HTTPMiddlewareAware.php:62
        SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
        SessionMiddleware.php:20
        SilverStripe\Control\Middleware\SessionMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
        HTTPMiddlewareAware.php:62
        SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
        AllowedHostsMiddleware.php:60
        SilverStripe\Control\Middleware\AllowedHostsMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
        HTTPMiddlewareAware.php:62
        SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
        TrustedProxyMiddleware.php:176
        SilverStripe\Control\Middleware\TrustedProxyMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
        HTTPMiddlewareAware.php:62
        SilverStripe\Control\Director->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
        HTTPMiddlewareAware.php:65
        SilverStripe\Control\Director->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
        Director.php:370
        SilverStripe\Control\Director->handleRequest(SilverStripe\Control\HTTPRequest)
        HTTPApplication.php:48
        SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
        call_user_func(Closure, SilverStripe\Control\HTTPRequest)
        HTTPApplication.php:66
        SilverStripe\Control\HTTPApplication->SilverStripe\Control\{closure}(SilverStripe\Control\HTTPRequest)
        call_user_func(Closure, SilverStripe\Control\HTTPRequest)
        ErrorControlChainMiddleware.php:56
        SilverStripe\Core\Startup\ErrorControlChainMiddleware->SilverStripe\Core\Startup\{closure}(SilverStripe\Core\Startup\ErrorControlChain)
        call_user_func(Closure, SilverStripe\Core\Startup\ErrorControlChain)
        ErrorControlChain.php:236
        SilverStripe\Core\Startup\ErrorControlChain->step()
        ErrorControlChain.php:226
        SilverStripe\Core\Startup\ErrorControlChain->execute()
        ErrorControlChainMiddleware.php:69
        SilverStripe\Core\Startup\ErrorControlChainMiddleware->process(SilverStripe\Control\HTTPRequest, Closure)
        HTTPMiddlewareAware.php:62
        SilverStripe\Control\HTTPApplication->SilverStripe\Control\Middleware\{closure}(SilverStripe\Control\HTTPRequest)
        HTTPMiddlewareAware.php:65
        SilverStripe\Control\HTTPApplication->callMiddleware(SilverStripe\Control\HTTPRequest, Closure)
        HTTPApplication.php:67
        SilverStripe\Control\HTTPApplication->execute(SilverStripe\Control\HTTPRequest, Closure, 1)
        HTTPApplication.php:49
        SilverStripe\Control\HTTPApplication->handle(SilverStripe\Control\HTTPRequest)
        index.php:26
    

    the offending lines seem to be located in DataObjectAnnotator.php setupExtensionClasses() line 115 $extendableClasses had 814 items for me but i assume this is normal as it filters items out. All the classes are lowercase which i thought was strange but is probably normal also.

     $extendableClasses = Config::inst()->getAll();
            // We need to check all config to see if the class is extensible
            // @todo change this to a proper php array_walk or something method?
            foreach ($extendableClasses as $key => $configClass) {
                // If the class doesn't already exist in the extension classes
                // And the 'extensions' key is set in the config class
                // And the 'extensions' key actually contains values
                // Add it.
                if (!in_array(self::$extension_classes, $configClass, true) &&
                    isset($configClass['extensions']) &&
                    count($configClass['extensions']) > 0
                ) {
                    $extension_classes[] = ClassInfo::class_name($key);
                }
            }
    

    my composer.json as follows

    
        "name": "dsaasd",
        "license": "proprietary",
        "require": {
            "php": ">=5.6.0",
            "silverstripe/recipe-plugin": "1.3.0",
            "silverstripe/recipe-cms": "4.2.1",
            "symbiote/silverstripe-addressable": "^4.0.1"
        },
        "require-dev": {
            "squizlabs/php_codesniffer": "3.2.3",
            "phpunit/phpunit": "^5.7",
            "silverleague/ideannotator": "3.x-dev"
        },
        "extra": {
            "project-files": [
                "mysite/_config/*",
                ".env.example"
            ],
            "public-files": [
                "assets/*",
                "favicon.ico"
            ],
            "branch-alias": {
                "4.x-dev": "4.2.x-dev",
                "dev-master": "5.x-dev"
            },
            "project-files-installed": [
                "app/.htaccess",
                "app/_config.php",
                "app/_config/mysite.yml",
                "app/src/Page.php",
                "app/src/PageController.php",
                "mysite/.htaccess",
                "mysite/_config.php",
                "mysite/_config/mysite.yml",
                "mysite/code/Page.php",
                "mysite/code/PageController.php"
            ],
            "public-files-installed": [
                ".htaccess",
                "index.php",
                "install-frameworkmissing.html",
                "install.php",
                "web.config"
            ]
        },
        "config": {
            "process-timeout": 600
        },
        "prefer-stable": true,
        "minimum-stability": "dev"
    

    hopefully you can replicate

    let me know if you need any more info

    opened by phyzical 11
  • Version 3 / SilverStripe 4 support

    Version 3 / SilverStripe 4 support

    I have spent the better part of the night porting this module to SilverStripe 4 and would like to tag a new release now. According to the mailing list both the SilverStripe community and the composer guys suggest solving multiple framework versions with multiple major releases. Therefore I would like to propose to make this release "3.0", so we would maintain "2.x" for SilverStripe 3 and "4.x" for SilverStripe 4.

    Is that alright with you guys @axyr @Firesphere?

    And, how to we manage branches. Following the example of SilverStripe we should make master the branch for version 3 (SilverStripe 4) and create a new branch for version 2. Can I go ahead and re-arrange the branches?

    opened by Zauberfisch 10
  • how do you use this module?

    how do you use this module?

    I am keen to run this from the command line on a vendor module, rather than app/mysite.

    Would it be OK to have something like this:

    if(Director::isCli()) {
        Config::inst()->update(DataObjectAnnotator::class, 'enabled_modules', [$this->request->getVar('module')]);
    }
    
    opened by sunnysideup 8
  • Support short names

    Support short names

    Adding support for short classnames and updating the docs accordingly. This works via a config, that gets the short classname to prevent IDE's from mentioning "Unnecessary FQN"

    Included is a fix for a whitespace trim introduced in rc-1 Resolves #108 , SQN instead of FQN

    bug enhancement dev-issue 
    opened by Firesphere 8
  • Namespaced classes not always annotated

    Namespaced classes not always annotated

    I get this error: Could not find string 'class Firesphere\YubiAuth\SiteConfigExtension'. Please check casing and whitespace.

    This is wrong, as it should look for class SiteConfigExtension, since the NameSpacing is not in the Class declaration but in the Namespace declaration.

    bug help wanted 
    opened by Firesphere 8
  • Owner annotation is missing from Extensions

    Owner annotation is missing from Extensions

    It looks like the owner property is now missing from the annotations in 3.2.2 this appears to have been introduced after 3.2.0 as in that version the owner annotation is present.

    opened by UndefinedOffset 1
  • Crash when using Versioned.versioned

    Crash when using Versioned.versioned

    In projects using the Versioned::class . '.versioned' variant (versions without staging, see docs), the annotator throws:

    ERROR [UNKNOWN TYPE, ERRNO -1]: Uncaught ReflectionException: Class "SilverStripe\Versioned\Versioned.versioned" does not exist

    bug 
    opened by oddnoc 1
  • Question around mixins

    Question around mixins

    Hiya,

    Sorry for the issue a tad on the question side.

    I've been using silverstripe-ideannotator and really enjoying it. Unfortunately I've encountered an issue when playing around with psalm.

    Whilst parsing the docblocks specifically ( psalm is unhappy with annotations like the following @mixin \SilverStripe\Versioned\Versioned("Stage","Live")

    Here is the question part 😄 . I've been doing some digging around and cannot find anything indicating this sort of syntax. Is this a valid syntax, a bug or is it just a sort of code comment / nicety?

    Would PR to either fix this or make it configurable be accepted?

    bug 
    opened by LiamKearn 1
  • Extensions on Controller doesn't work as expected

    Extensions on Controller doesn't work as expected

    Having an extension that extends SilverStripe\Control\Controller appears to cut off classes.

    An example docblock that gets generated is: @property \SilverStripe\Admin\SecurityAdmin|\SilverStripe\GraphQL\Controller|\SilverStripe\TestSession\TestSessionController|\SilverShop\Comparison\Pagetypes\ProductComparisonPageController|\SilverShop\Admin\ProductCatalogAdmin|\SilverShop\Cart\ShoppingCartController|\SilverShop\Page\AccountPageController|\SilverShop\Page\CheckoutPageController|\SilverShop\Page\ProductCategoryController|\SilverShop\Page\ProductController|\SilverShop\Discounts\Admin\DiscountModelAdmin|\SilverStripe\CMS\Controllers\CMSMain|\SilverStripe\CMS\Controllers\CMSPageSettingsController|\SilverStripe\CMS\Controllers\ContentController|\SilverStripe\CMS\Controllers\ModelAsController|\SilverStripe\Control\Controller|\SilverStripe\Dev\DevBuildController|\App\Extensions\ControllerExtension $owner

    I would have expected either one of two things to happen:

    • Only the direct extended class gets added as $owner (e.g. @property SilverStripe\Control\Controller|App\Extensions\ControllerExtension $owner)
    • Every single sub-class of Controller gets added (there are a lot more than what's listed here).

    I'm not sure which option is better, but this seems to be the worst of both worlds? I haven't had a chance to investigate yet, but is there thought on which solution is better?

    Alternatively, maybe I'm just confused how this works, but e.g. PageController isn't there, so there are entire hierarchies missing.

    bug hacktoberfest 
    opened by madmatt 5
  • hasMany through causes notices

    hasMany through causes notices

    The current mock data uses this

    Array
    (
        [SubTeams] => SilverLeague\IDEAnnotator\Tests\SubTeam
        [Comments] => SilverLeague\IDEAnnotator\Tests\TeamComment
        [Supporters] => Array
            (
                [through] => SilverLeague\IDEAnnotator\Tests\TeamSupporter
                [from] => Team
                [to] => Supporter
            )
    
    )
    

    However, it's not supported in the framework (that runs a preg_replace when calling hasMany()) causing array to string conversion notices. I don't see anywhere in the docs that it's possible to use that notation for has_many, only for many_many.

    Therefore, should I report a bug to the framework (hasMany should supported nested array => some mapping needs to be done before running preg_replace) or is this module using invalid features?

    bug 
    opened by lekoala 2
  • has_many, many_many etc should import the namespace for HasManyList etc

    has_many, many_many etc should import the namespace for HasManyList etc

    Example model:

    namespace Foo;
    class Foo extends \SilverStripe\ORM\DataObject
    {
        private static $has_many = [
            'Bars' => Bar::class,
        ];
    }
    
    namespace Bar;
    class Bar extends \SilverStripe\ORM\DataObject {}
    

    When running dev/build you'll get this in the Foo docblock:

    * @method DataList|Bar[] Bars()
    

    It's missing use SilverStripe\ORM\DataList; imported - this is a bug

    bug 
    opened by robbieaverill 2
Releases(3.2.2)
  • 3.2.2(Nov 29, 2022)

    When the namespace for a Controller would be App\Src\Page\Controller\PageController and the corresponding Page would be App\Src\Page\Page, an error would be thrown that the Page would be instantiated twice, because the Controller part of the namespace would be stripped out too.

    This release fixes that.

    Source code(tar.gz)
    Source code(zip)
  • 3.2.0(Aug 6, 2022)

    What's Changed

    • Move to a modern version of reflection docblock by @UndefinedOffset in https://github.com/silverleague/silverstripe-ideannotator/pull/140

    Full Changelog: https://github.com/silverleague/silverstripe-ideannotator/compare/3.1.2...3.2.0

    Source code(tar.gz)
    Source code(zip)
  • 3.1.2(Apr 27, 2022)

  • 3.0.0(Jul 11, 2018)

    • Support short classnames
    • fix bug from RC1 that would strip whitespaces a tad too enthousiastically
    • Stop attempting to fully instantiate abstracts
    Source code(tar.gz)
    Source code(zip)
  • 3.0-rc1(Jan 30, 2018)

  • 3.0-beta1(Oct 8, 2017)

  • 3.0.0-alpha1(Apr 29, 2017)

    This release covers everything needed to work on SilverStripe 4 Alpha releases (and expected to work on beta releases)

    Changes:

    • Namespacing
    • Removal of redundant or non-existing calls to director
    • Skip test that only fails on Travis and nowhere else
    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(Apr 17, 2016)

  • 2.0.0(Apr 15, 2016)

    • Implemented phpDocumentor
    • Remove start/end tags
    • All classes in a single file annotated
    • Added DataRecord and Data() annotation for _Controller methods
    • Added Changelog (now... just to keep it updated...) Many work done by @axyr!
    Source code(tar.gz)
    Source code(zip)
  • 1.0.4(Apr 4, 2016)

    Updated documentation. Started implementation of phpDocumentor methods instead of current self-build method. Removed undo method since it isn't needed or used. Added code climate. Only show annotations message if the annotations actually changed. Hardened security, so only generated in actual dev-mode (so even in ?isDev on livesite, no docblocks are generated)

    Source code(tar.gz)
    Source code(zip)
  • 1.0.3(Apr 3, 2016)

    Minor changes. Restructured the classes to be in a logical directory structure and updated the documentation at https://axyr.github.io/ideannotator

    Updated config to be run before mysite, so mysite overrides the defaults.

    Source code(tar.gz)
    Source code(zip)
  • 1.0.2(Mar 30, 2016)

  • 1.0(Mar 28, 2016)

Owner
SilverLeague
Community powered SilverStripe modules
SilverLeague
A SilverStripe module for conveniently injecting JSON-LD metadata into the header of each rendered page in SilverStripe

A SilverStripe module for conveniently injecting JSON-LD metadata into the header of each rendered page in Silver

null 4 Apr 20, 2022
Silverstripe-searchable - Adds to the default Silverstripe search by adding a custom results controller and allowing properly adding custom data objects and custom fields for searching

SilverStripe Searchable Module UPDATE - Full Text Search This module now uses Full Text Support for MySQL/MariaDB databases in version 3.* Adds more c

ilateral 13 Apr 14, 2022
Silverstripe-masquerade - SilverStripe module to allow users to "masquerade" as other users

SilverStripe Masquerade Module About This module is designed to allow an Administrator to "login" as another "Member" without changing their password

Daniel Hensby 14 Apr 14, 2022
Silverstripe-debugbar/ - SilverStripe DebugBar module

SilverStripe DebugBar module Requirements SilverStripe ^4.0 maximebf/php-debugbar jdorn/sql-formatter Installation You can install the debug bar with

Thomas Portelange 52 Dec 21, 2022
Silverstripe-fulltextsearch - Adds external full text search engine support to SilverStripe

FullTextSearch module Adds support for fulltext search engines like Sphinx and Solr to SilverStripe CMS. Compatible with PHP 7.2 Important notes when

Silverstripe CMS 42 Dec 30, 2022
Automatically delete old SiteTree page versions from Silverstripe

Version truncator for Silverstripe An extension for Silverstripe to automatically delete old versioned DataObject records from your database when a re

Ralph Slooten 35 Dec 7, 2022
Alerts users in the SilverStripe CMS when multiple people are editing the same page.

Multi-User Editing Alert Alerts users in the SilverStripe CMS when multiple people are editing the same page. Maintainer Contact Julian Seidenberg <ju

Silverstripe CMS 15 Dec 17, 2021
Melek Berita Backend is a service for crawling data from various websites and processing the data to be used for news data needs.

About Laravel Laravel is a web application framework with expressive, elegant syntax. We believe development must be an enjoyable and creative experie

Chacha Nurholis 2 Oct 9, 2022
Silverstripe-sspy - Python based SSPAK export with higher reliability and cross-platform compatibility

SSPY - Python Stand-alone SSPAK solution © Simon Firesphere Erkelens; Moss Mossman Cantwell Usage: sspy [create|load|extract] (db|assets) --file=my.

Simon Erkelens 1 Jun 29, 2021
This module integrates Silverstripe CMS with Google Translate API and then allows content editors to use automatic translation for every translatable field.

Autotranslate This module integrates Silverstripe CMS with Google Translate API and then allows content editors to use automatic translation for every

null 4 Jan 3, 2022
Silverstripe-tinytidy - Control which styles are available in TinyMCE's style dropdown menu and what elements they can be applied to

TinyTidy for SilverStripe This module mainly serves as an example of how to customise the 'styles' dropdown menu in the TinyMCE editor to control whic

Jono Menz 30 Jul 30, 2020
Silverstripe module allowing editors to create newsletters using elemental blocks and export them to a sendy instance

Silverstripe Sendy Silverstripe module allowing editors to create newsletters using elemental blocks and export them to a sendy instance. Introduction

Syntro Opensource 4 Apr 20, 2022
Demo Silverstripe and JavaScript sources for Lightning Talk "FormField Mini Apps" at StripeCon EU 2022

Watch the Lightning Talk on Youtube ?? Demo repository for Lightning Talk "FormField Mini Apps with the JavaScript framework/lib/style of your choice"

Julian Scheuchenzuber 2 Sep 20, 2022
SilverStripe Garbage Collection Module

SilverStripe Module for defining and processing Garbage Collection on SilverStripe Applications.

Brett Tasker 8 Aug 12, 2022
Sspak - Tool for managing bundles of db/assets from SilverStripe environments

SSPak SSPak is a SilverStripe tool for managing database and assets content, for back-up, restoration, or transfer between environments. The file form

Silverstripe CMS 45 Dec 14, 2022
Markdownfield - Markdown field for SilverStripe

MarkdownField This module introduces a new DB field type Markdown & Markdown Editor. It uses github style Markdown style. And uses the simple markdown

SilverStripers 10 Jul 10, 2022
Silverstripe-populate - Populate your database through YAML files

Populate Module This module provides a way to populate a database from YAML fixtures and custom classes. For instance, when a building a web applicati

Silverstripe CMS 22 Oct 3, 2022
Helper plugin to install SilverStripe recipes

SilverStripe recipe-plugin Introduction This plugin enhances composer and allows for the installation of "silverstripe-recipe" packages. These recipes

Silverstripe CMS 10 Oct 4, 2022
SilverStripe Model Annotations Task

A SilverStripe Task to generate data object model annotations for defined db fields. Also for configs from data extensions.

CSoellinger 2 Apr 21, 2022