Upgrade to Pro — share decks privately, control downloads, hide ads and more …

EC-CUBE3のプラグインを作ってみよう!

amidaike
September 27, 2015

 EC-CUBE3のプラグインを作ってみよう!

amidaike

September 27, 2015
Tweet

More Decks by amidaike

Other Decks in Programming

Transcript

  1. EC-CUBE3ͷϓϥάΠϯ
    Λ࡞ͬͯΈΑ͏ʂ
    EC-CUBEؔ੢Ϣʔβάϧʔϓ
    2015-09-25

    View Slide

  2. ࣗݾ঺հ
    גࣜձࣾΩϡʔϧ
    ɹࢁଜ ਗ਼࢙
    γεςϜΤϯδχΞ
    EC-CUBE3ͷίϛολʔ(@k-yamamura)
    ͯ͠·͢

    View Slide

  3. ίϛοτͯ͠·͢ɻ

    View Slide

  4. αϚϦʔ
    1.EC-CUBE3ʹ͍ͭͯ
    2.ϓϥάΠϯͰग़དྷΔ͜ͱ
    3.ϓϥάΠϯͷ֓ཁ
    4.ϓϥάΠϯΛ࡞ͬͯΈΑ͏
    5.։ൃΛ͢Δ্Ͱͷ஫ҙ఺
    6.QAͳͲ

    View Slide

  5. 1.EC-CUBE3ʹ͍ͭͯ

    View Slide

  6. EC-CUBE3ʹ͍ͭͯ
    • 2015೥7݄1೔ʹ7೥ͿΓͷϝδϟʔόʔδϣϯΞοϓ
    • γεςϜ಺෦ͷେ෯ͳݟ௚͠

    Symfony2ίϯϙʔωϯτͰ͋ΔSilexͷ࠾༻

    Bootstrap3ͷ࠾༻

    Smarty͔ΒTwig΁ͷςϯϓϨʔτมߋ
    • ϨεϙϯγϒσβΠϯͷରԠ
    • ϓϥάΠϯػߏͷ࡮৽

    View Slide

  7. EC-CUBE3ʹ͍ͭͯ
    • http://www.ec-cube.net/download/

    ࠷৽ͷEC-CUBE3Λμ΢ϯϩʔυ
    • Macͷํ͸ͪ͜Β

    http://amidaike.hatenablog.com/entry/
    2015/07/02/015914
    • Windowsͷํ͸ͪ͜Β

    http://qiita.com/chihiro-adachi/items/
    5fb2175454d3bfa047ac

    View Slide

  8. EC-CUBE3ʹ͍ͭͯ
    • /ECCUBEROOT/src

    ഑Լ͕ϓϩάϥϜຊମͱͳΓɺ
    phpϑΝΠϧ΍twigϑΝΠϧΛ
    ഑ஔ

    View Slide

  9. EC-CUBE3ʹ͍ͭͯ
    • /ECCUBEROOT/html

    ͕ެ։σΟϨΫτϦͱͳΓɺ
    ϦιʔεϑΝΠϧ(css΍ը૾
    ϑΝΠϧ౳ʑ)Λ഑ஔ

    (֤σΟϨΫτϦͷઆ໌͸ޙड़)

    View Slide

  10. EC-CUBE3ʹ͍ͭͯ
    • /ECCUBEROOT/app

    ഑Լ͸ઃఆϑΝΠϧ΍ϩάϑΝ
    Πϧ౳͕഑ஔ͞Ε͓ͯΓɺϓ
    ϥάΠϯ͸ʮPluginʯσΟϨΫ
    τϦ഑ԼͰ࡞੒

    View Slide

  11. EC-CUBE3ʹ͍ͭͯ
    σΟϨΫτϦ໊ ػೳ໊
    Eccube௚Լ
    ϕʔεͱͳΔApplication.php͕ଘࡏ͠ɺඞ
    ͣ͜ͷΫϥε͔Β࣮ߦ͞ΕΔ
    Application Application.phpͷ਌ΫϥεϑΝΠϧ͕֨ೲ
    Command ConsoleίϚϯυ༻Ϋϥε
    Common ఆ਺ఆٛΫϥε
    Controller ίϯτϩʔϥʔΫϥε
    ControllerProvider URLϚοϐϯάఆٛؔ਺
    Doctrine Doctirine֦ுΫϥε
    Entity DB࿈ܞ༻EntityΫϥε
    Event FormΠϕϯτ༻Ϋϥε
    EventListner ΠϕϯτϦεφʔ༻Ϋϥε

    View Slide

  12. EC-CUBE3ʹ͍ͭͯ
    σΟϨΫτϦ໊ ػೳ໊
    Exception ۀ຿ΤϥʔΫϥε
    Form FormλΠϓΫϥε
    Plugin ϓϥάΠϯ༻ManagerΫϥε
    Repository DBΞΫηε༻ϦϙδτϦΫϥε
    Resource doctrine༻dcmϑΝΠϧ΍twigϑΝΠϧ౳
    Security ύεϫʔυϋογϡ༻Ϋϥε
    Service αʔϏεΫϥε
    ServiceProvider DIఆٛ༻Ϋϥε
    Twig Twig֦ு༻Ϋϥε
    Util ڞ௨ؔ਺Ϋϥε

    View Slide

  13. EC-CUBE3ʹ͍ͭͯ
    • ຊମଆͷ؆୯ͳ։ൃͷྲྀΕ͸ҎԼͷ௨Γ
    1. Controller࡞੒
    2. ControllerProvider΍ServiceProviderʹඞཁͳఆٛΛ௥Ճ
    3. TwigϑΝΠϧ࡞੒
    4. FormType࡞੒
    5. ඞཁͰ͋Ε͹Entity౳Λ࡞੒
    6. ը໘֬ೝ

    View Slide

  14. 2.ϓϥάΠϯͰग़དྷΔ͜ͱ

    View Slide

  15. ϓϥάΠϯͰग़དྷΔ͜ͱ
    • EC-CUBE3ʹରͯ͠ػೳΛ௥ՃՄೳ
    • طଘը໘ʹରͯ͠৽ن߲໨ͳͲΛ௥ՃՄೳ
    • ຊମͱ͸ಠཱͨ͠৽نը໘Λ࡞੒Մೳ
    • DBʹରͯ͠৽نςʔϒϧΛ࡞੒Մೳ
    • ཁ͸ͳΜͰ΋Մೳ

    View Slide

  16. 3.ϓϥάΠϯͷ֓ཁ

    View Slide

  17. ϓϥάΠϯͷ֓ཁ
    • ϓϥάΠϯͱ͸EC-CUBE3ʹରͯ͠؆୯ʹػೳ
    Λ௥Ճग़དྷΔ࢓૊Έ
    • ϓϥάΠϯΛ࡞੒͢Δ͜ͱͰຊମଆʹଘࡏ͠
    ͳ͍ΫϨδοτػೳ΍ɺ2ܥͰඪ४ͱͯ͠༻ҙ
    ͞Ε͍ͯͨػೳ͕ϓϥάΠϯͰରԠՄೳ

    View Slide

  18. ϓϥάΠϯͷ֓ཁ
    • ϓϥάΠϯઆ໌ϖʔδ

    http://www.ec-cube.net/plugin/
    • ϓϥάΠϯͷࢿྉ

    http://downloads.ec-cube.net/src/manual/v3/
    plugin.pdf
    • αϯϓϧϓϥάΠϯ

    https://github.com/EC-CUBE/category-content-plugin

    View Slide

  19. ϓϥάΠϯͷ֓ཁ
    • ΦʔφʔζετΞʹެ։Մೳ

    http://www.ec-cube.net/owners/
    • ΦʔφʔζετΞ΁ެ։͢Δʹ͸EC-CUBEύʔτ
    φʔ΁ొ࿥͢Δඞཁ͋Γ

    https://www.ec-cube.net/entry/partner_kiyaku.php
    • ৽نύʔτφʔొ࿥ޙɺϓϥάΠϯਃ੥ը໘ΑΓ
    ొ࿥Մೳ

    View Slide

  20. 4.ϓϥάΠϯΛ࡞ͬͯΈΑ͏

    View Slide

  21. ϓϥάΠϯΛ࡞ͬͯΈΑ͏
    • ؆қϥοϐϯάରԠදࣔϓϥάΠϯ

    https://github.com/k-yamamura/eccube3-sample-
    plugin
    • ঎඼ߪೖ࣌ʹϥοϐϯάͷ༗ແΛબ୒Մೳ
    • ϓϥάΠϯઃఆը໘Ͱ͸ϥοϐϯάදࣔՄ൱
    Λઃఆ

    View Slide

  22. ϓϥάΠϯΛ࡞ͬͯΈΑ͏
    1. config.ymlͷهड़ํ๏
    2. event.ymlͷهड़ํ๏
    3. PluginManagerͷهड़ํ๏
    4. Eventͷهड़ํ๏
    5. ServiceProviderͷهड़ํ๏
    6. ຊମʹ߹ΘͤͨσΟϨΫτϦߏ଄
    7. ϓϥάΠϯ༻؅ཧը໘ͷ࡞੒ํ๏
    8. طଘը໘ͷFormʹ߲໨Λ௥Ճ͢Δํ๏
    9. ؅ཧը໘ʹϝχϡʔΛ௥Ճ͢Δํ๏(࣍ճػձ͕͋Ε͹͓ݟͤ͠·͢)

    View Slide

  23. config.yml
    name: GiftWrappingϓϥάΠϯ ※ඞਢ
    code: GiftWrapping ※ඞਢ
    version: 1.0.0 ※ඞਢ
    service:
    - GiftWrappingServiceProvider
    orm.path:
    - /Resource/doctrine
    ※ϓϥάΠϯͰ௥Ճͨ͠ςʔϒϧΛ࡞੒͢Δ৔߹ɺorm.pathͷهड़͸ඞਢ
    event: GiftWrappingEvent
    ※eventΛ௥Ճ͢Δ৔߹ɺeventͷهड़͸ඞਢ
    form:
    - onPreSubmit:
    SampleForm
    ※FormΠϕϯτΛ֦ு͢Δ৔߹ɺformͷهड़͸ඞਢ
    ·ͨɺඞཁͰ͋Ε͹
    const:
    HOGE: 1
    HOGEHOGE: 2
    ͱఆ਺΋هड़Մೳɺୠ͠ݱόʔδϣϯͩͱϓϥάΠϯ͕ແޮͷ৔߹ɺ͜ͷఆ਺͕ಡΈࠐΊͳ͍

    View Slide

  24. event.yml
    eccube.event.render.shopping.before:
    - [onRenderGiftWrappingShoppingBefore, NORMAL]
    eccube.event.render.admin_setting_shop_payment_edit.before:
    - [onRenderGiftWrappingAdminPaymentBefore, NORMAL]
    Πϕϯτͷछྨʹ͸
    ΞϓϦέʔγϣϯશମͷϑοΫϙΠϯτ
    eccube.event.app.{before | after}
    ίϯτϩʔϥʔΠϕϯτͷϑοΫϙΠϯτ
    eccube.event.controller.{ϧʔςΟϯά໊}.{before | after | finish}
    ϨϯμʔΠϕϯτͷϑοΫϙΠϯτ
    eccube.event.render.{ϧʔςΟϯά໊}.before

    View Slide

  25. ϧʔςΟϯάͷ֬ೝํ๏
    $ php app/console router:debug
    +----------------------------------------+-----------------------------------------------------------+---------+
    | Name | Path | Pattern |
    +----------------------------------------+-----------------------------------------------------------+---------+
    | admin_logout | /admin/logout | GET |
    | admin_login_check | /admin/login_check | |
    | logout | /logout | GET |
    | login_check | /login_check | |
    | user_data | /user_data/{route} | ANY |
    | homepage | / | ANY |
    | top | / | ANY |
    | index | / | ANY |
    | block | /block | ANY |
    | cart | /cart | ANY |
    | cart_add | /cart/add | POST |
    | cart_up | /cart/up/{productClassId} | ANY |
    | cart_down | /cart/down/{productClassId} | ANY |
    | cart_set_quantity | /cart/setQuantity/{productClassId}/{quantity} | ANY |
    | cart_remove | /cart/remove/{productClassId} | ANY |
    | cart_buystep | /cart/buystep | ANY |
    | contact | /contact | ANY |
    | contact_complete | /contact/complete | ANY |
    | entry | /entry | ANY |
    | entry_complete | /entry/complete | ANY |
    | entry_activate | /entry/activate/{secret_key} | ANY |
    | forgot | /forgot | ANY |
    | forgot_reset | /forgot/reset/{reset_key} | ANY |
    | block_category | /block/category | ANY |
    | block_cart | /block/cart | ANY |
    | block_search_product | /block/search_product | ANY |
    | block_news | /block/news | ANY |
    | block_login | /block/login | ANY |
    | help_about | /help/about | ANY |
    | help_guide | /help/guide | ANY |
    | help_privacy | /help/privacy | ANY |
    | help_tradelaw | /help/tradelaw | ANY |
    | help_agreement | /help/agreement | ANY |

    View Slide

  26. PluginManagerͷهड़
    namespace Plugin\PayPalExpress;
    class PluginManager extends AbstractPluginManager
    {
    public function install($config, $app)
    {
    $this->migrationSchema($app, __DIR__ . '/Resource/doctrine/migration', $config['code']);
    }
    public function uninstall($config, $app)
    {
    $this->migrationSchema($app, __DIR__ . '/Resource/doctrine/migration', $config['code'], 0);
    }
    public function enable($config, $app)
    {
    }
    public function disable($config, $app)
    {
    }
    public function update($config, $app)
    {
    }
    }

    View Slide

  27. Eventͷهड़
    namespace Plugin\GiftWrapping;
    class GiftWrappingEvent
    {
    private $app;
    public function __construct($app)
    {
    $this->app = $app;
    }
    /**
    * ߪೖը໘ʹϥοϐϯά߲໨Λදࣔ
    *
    * @param FilterResponseEvent $event
    */
    public function onRenderGiftWrappingShoppingBefore(FilterResponseEvent $event)
    {
    $request = $event->getRequest();
    $response = $event->getResponse();
    $Wrapping = $this->app['eccube.plugin.repository.wrapping']->find(1);
    if ($Wrapping->getIsWrapping()) {
    $html = $this->getHtmlWrapping($request, $response);
    $response->setContent($html);
    }
    $event->setResponse($response);
    }
    /**
    *
    * @param Request $request

    View Slide

  28. ServiceProviderͷهड़
    namespace Plugin\GiftWrapping\ServiceProvider;
    class GiftWrappingServiceProvider implements ServiceProviderInterface
    {
    public function register(BaseApplication $app)
    {
    // ؅ཧը໘
    $app->match('/' . $app['config']['admin_route'] . '/plugin/giftwrapping/config', 'Plugin\GiftWrapping\Controller\ConfigController::index')-
    >bind('plugin_GiftWrapping_config');
    $app->match('/plugin/giftwrapping/checkout', 'Plugin\GiftWrapping\Controller\GiftWrappingController::index')->bind('plugin_giftwrapping_index');
    // Form
    $app['form.types'] = $app->share($app->extend('form.types', function ($types) use ($app) {
    $types[] = new GiftWrappingConfigType($app);
    return $types;
    }));
    // Form Extension
    $app['form.type.extensions'] = $app->share($app->extend('form.type.extensions', function ($extensions) use ($app) {
    $extensions[] = new ShoppingTypeExtension($app);
    return $extensions;
    }));
    // Repository
    $app['eccube.plugin.repository.wrapping'] = $app->share(function () use ($app) {
    return $app['orm.em']->getRepository('Plugin\GiftWrapping\Entity\Wrapping');
    });
    // Service
    $app['eccube.plugin.service.gift_wrapping'] = $app->share(function () use ($app) {
    return new \Plugin\GiftWrapping\Service\GiftWrappingService($app);
    });
    // ϝοηʔδొ࿥
    $app['translator'] = $app->share($app->extend('translator', function ($translator, \Silex\Application $app) {

    View Slide

  29. σΟϨΫτϦߏ଄
    • EC-CUBE3ຊମͱࣅͨΑ͏ͳ
    σΟϨΫτϦߏ੒ʹ͓͍ͯ͠
    ͨํ͕ྑ͍

    View Slide

  30. ϓϥάΠϯ༻؅ཧը໘ͷهड़
    class SampleServiceProvider implements ServiceProviderInterface
    {
    public function register(BaseApplication $app)
    {
    // ؅ཧը໘
    $app->match('/' . $app['config']['admin_route'] . '/plugin/giftwrapping/config', 'Plugin
    \GiftWrapping\Controller\ConfigController::index')->bind('plugin_GiftWrapping_config');
    // Form
    $app['form.types'] = $app->share($app->extend('form.types', function ($types) use ($app) {
    $types[] = new GiftWrappingConfigType($app);
    return $types;
    }));
    }
    public function boot(BaseApplication $app)
    {
    }
    }

    View Slide

  31. 5.։ൃΛ͢Δ্Ͱͷ஫ҙ఺

    View Slide

  32. ରԠϒϥ΢βʹ͍ͭͯ
    OS ϒϥ΢β
    Windows
    (Windows7Ҏ߱)
    Internet Explorer10 Ҏ߱
    Google Chrome ࠷৽൛
    Firefox ࠷৽൛
    Mac Safari ࠷৽൛
    iOS(7Ҏ߱) Safari ࠷৽൛
    Android(4.1Ҏ߱) ඪ४ϒϥ΢β ࠷৽൛

    View Slide

  33. σόοάϞʔυͷ༗ޮԽ
    • ௨ৗ / ΍/index.phpͰΞΫηε͍ͯ͠Δͱ͜ΖΛ /index_dev.php
    ͱॻ͖׵͑ͯΞΫηε͢Δ͜ͱʹΑΓɺtwigϑΝΠϧ͕Ωϟο
    γϡ͞ΕͣʹσόοάϞʔυ͕༗ޮʹͳΓ·͢ɻ


    http://localhost/index_dev.php
    • You are not allowed to access this file. Check index_dev.php for
    more information.ͱΤϥʔ͕දࣔ͞ΕΔ৔߹ɺindex_dev.phpΛ
    ։͖ɺΞΫηεݩͷIPΛҎԼͷ഑ྻʹ௥Ճ͍ͯͩ͘͠͞ɻ 

    $allow = array( '127.0.0.1', 'fe80::1', '::1', );

    View Slide

  34. ը໘ͷมߋ
    • EC-CUBE3ͷը໘Λมߋ͢Δओͳํ๏͸ҎԼͷ௨Γ
    1. ຊମඪ४ͷtwigϑΝΠϧΛίϐʔͯ͠मਖ਼
    2. ؅ཧը໘͔ΒtwigϑΝΠϧΛमਖ਼
    • ECCUBEROOT/srcҎԼͷϑΝΠϧ͸όʔδϣϯΞο
    ϓͰ্ॻ͖͞ΕΔͨΊɺ௚઀ຊମͷtwigϑΝΠϧ
    Λ৮Δͷ͸ඇਪ঑

    View Slide

  35. ςϯϓϨʔτͷ൓өॱং
    • σβΠϯςϯϓϨʔτΛ࡞੒ޙɺϑΝΠϧΛ഑ஔ͢Δ
    σΟϨΫτϦʹΑͬͯ༏ઌॱҐ͕͋Γ·͢ɻҎԼͷॱ
    ংͰ֘౰͢ΔςϯϓϨʔτϑΝΠϧ͕ଘࡏ͢Δͱઌʹ
    ൓ө͞Ε·͢ɻ(ϑϩϯτͷΈͷઆ໌ )
    1. ECCUBEROOT/app/template/default
    2. ECCUBEROOT/src/Eccube/Resource/template/default
    3. ECCUBEROOT/app/Plugin/[plugin_code]/Resource/
    template/default

    View Slide

  36. ࠓ೔͓࿩͠ग़དྷͳ͔ͬͨ͜ͱ
    • DBͱ࿈ܞͨ͠ϓϥάΠϯ
    • ৽نʹςʔϒϧΛ࡞੒͢ΔϓϥάΠϯ
    • ը໘Λ৽ͨʹ࡞੒͢ΔϓϥάΠϯ
    • ը໘ʹରͯ͠ͷઆ໌
    • ଞʹ΋͋Γ·͕͢·ͨػձ͕͋Ε͹͓࿩͠͠·͢ɻΑ
    ͘෼͔Βͳ͍Αɺͱ͍͏ํ͸ޙͰ௚઀ฉ͍͍ͯͩ͘͞ɻ

    View Slide

  37. ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ

    View Slide