カテゴリー
EC-CUBE

【EC-CUBE4】1円ズレる原因

カスタマイズにより、マイナス伝票を作成していたプロジェクトで発生

通常の消費税計算へマイナス値を渡すと、切り捨て処理が反転する

[temp id=3]

消費税取得処理へ負数を使用すると端数処理が反転する。

対象コードを一部抜粋

ファイルパス:src/Eccube/Service/PurchaseFlow/Processor/TaxProcessor.php

PHP
<?php
// 税込表示の場合は, priceが税込金額のため割り戻す.
if ($item->getTaxDisplayType()->getId() == TaxDisplayType::INCLUDED) {
    $tax = $this->taxRuleService->calcTaxIncluded(
        $item->getPrice(), $item->getTaxRate(), $item->getRoundingType()->getId(),
        $item->getTaxAdjust());
} else {
    $tax = $this->taxRuleService->calcTax(
        $item->getPrice(), $item->getTaxRate(), $item->getRoundingType()->getId(),
        $item->getTaxAdjust());
}

端数を切り捨てにしている場合は、第三引数をnullにして繰切り上げにすれば良い

PHP
<?php
// 税込表示の場合は, priceが税込金額のため割り戻す.
if ($item->getTaxDisplayType()->getId() == TaxDisplayType::INCLUDED) {
    $tax = $this->taxRuleService->calcTaxIncluded(
        $item->getPrice(), $item->getTaxRate(), null,
        $item->getTaxAdjust());
} else {
    $tax = $this->taxRuleService->calcTax(
        $item->getPrice(), $item->getTaxRate(), null,
        $item->getTaxAdjust());
}
カテゴリー
EC-CUBE

【EC-CUBE4】価格を少数第二位まで登録する

卸価格で少数第二位まで使用する要件が上がった。

[temp id=3]

実装できるか調査

dtb_product_classのprice02に小数点が登録できるのは把握していた。

通過設定を変更

プログラムを調査していると、envの設定を変更すれば登録できるようになる事がわかった。

デフォルト(未定義):ECCUBE_CURRENCY=JPY

ドルへ変更:ECCUBE_CURRENCY=USD

管理画面:商品登録で少数第二位まで登録可能になった。

price01, price02両方ともに影響する。

各所円マークがドルマークへ変更される

price02のみ使用したい

PriceTypeのSCALEで、小数点以下の桁数を制御しているのがわかった。

ProductClassTypeExtensionを作成

app/Customize/Form/Extension/Admin/ProductClassTypeExtension.php

PHP
<?php
/**
 * price02へWholesalePriceTypeを適用する
 */
namespace Customize\Form\Extension\Admin;
use Customize\Form\Type\WholesalePriceType;
use Eccube\Form\Type\Admin\ProductClassType;
use Symfony\Component\Form\AbstractTypeExtension;
use Doctrine\ORM\EntityManagerInterface;
use Eccube\Common\EccubeConfig;
use Eccube\Entity\ClassCategory;
use Eccube\Form\DataTransformer;
use Eccube\Form\Type\Master\DeliveryDurationType;
use Eccube\Form\Type\Master\SaleTypeType;
use Eccube\Form\Type\PriceType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints as Assert;
class ProductClassTypeExtension extends AbstractTypeExtension
{
    /**
     * @var EntityManagerInterface
     */
    protected $entityManager;
    /**
     * @var EccubeConfig
     */
    protected $eccubeConfig;
    /**
     * ProductClassType constructor.
     *
     * @param EntityManagerInterface $entityManager
     */
    public function __construct(
        EntityManagerInterface $entityManager,
        EccubeConfig $eccubeConfig
    ) {
        $this->entityManager = $entityManager;
        $this->eccubeConfig = $eccubeConfig;
    }
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('code', TextType::class, [
                'required' => false,
                'constraints' => [
                    new Assert\Length([
                        'max' => $this->eccubeConfig['eccube_stext_len'],
                    ]),
                ],
            ])
            ->add('stock', NumberType::class, [
                'required' => false,
                'constraints' => [
                    new Assert\Regex([
                        'pattern' => "/^\d+$/u",
                        'message' => 'form_error.numeric_only',
                    ]),
                ],
            ])
            ->add('stock_unlimited', CheckboxType::class, [
                'label' => 'admin.product.stock_unlimited__short',
                'value' => '1',
                'required' => false,
            ])
            ->add('sale_limit', NumberType::class, [
                'required' => false,
                'constraints' => [
                    new Assert\Length([
                        'max' => 10,
                    ]),
                    new Assert\GreaterThanOrEqual([
                        'value' => 1,
                    ]),
                    new Assert\Regex([
                        'pattern' => "/^\d+$/u",
                        'message' => 'form_error.numeric_only',
                    ]),
                ],
            ])
            ->add('price01', PriceType::class, [
                'required' => false,
            ])
            ->add('price02', WholesalePriceType::class, [
            ])
            ->add('tax_rate', TextType::class, [
                'required' => false,
                'constraints' => [
                    new Assert\Range(['min' => 0, 'max' => 100]),
                    new Assert\Regex([
                        'pattern' => "/^\d+(\.\d+)?$/",
                        'message' => 'form_error.float_only',
                    ]),
                ],
            ])
            ->add('delivery_fee', PriceType::class, [
                'required' => false,
            ])
            ->add('sale_type', SaleTypeType::class, [
                'multiple' => false,
                'expanded' => false,
                'constraints' => [
                    new Assert\NotBlank(),
                ],
            ])
            ->add('delivery_duration', DeliveryDurationType::class, [
                'required' => false,
                'placeholder' => 'common.select__unspecified',
            ])
            ->addEventListener(FormEvents::POST_SUBMIT, function ($event) {
                $form = $event->getForm();
                $data = $form->getData();
                if (empty($data['stock_unlimited']) && is_null($data['stock'])) {
                    $form['stock_unlimited']->addError(new FormError(trans('admin.product.product_class_set_stock_quantity')));
                }
            });
        $transformer = new DataTransformer\EntityToIdTransformer($this->entityManager, ClassCategory::class);
        $builder
            ->add($builder->create('ClassCategory1', HiddenType::class)
                ->addModelTransformer($transformer)
            )
            ->add($builder->create('ClassCategory2', HiddenType::class)
                ->addModelTransformer($transformer)
            );
    }
    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'Eccube\Entity\ProductClass',
        ]);
    }
    /**
     * {@inheritdoc}
     */
    public static function getExtendedTypes(): iterable
    {
        return [ProductClassType::class];
    }
}

PriceTypeをコピーして、SCALEを定数で2に設定したWholesalePriceTypeを作成

ファイルパス:app/Customize/Form/Type/WholesalePriceType.php

PHP
<?php
/**
 * 卸価格:price02専用Formクラス
 * 小数点第2位まで、登録できるように調整
 * 通貨タイプ:デフォルトJPYの場合は、小数点の桁数は0に設定されている
 */
namespace Customize\Form\Type;
use Eccube\Common\EccubeConfig;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\MoneyType;
use Symfony\Component\OptionsResolver\Options;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\NotBlank;
use Symfony\Component\Validator\Constraints\Range;
class WholesalePriceType extends AbstractType
{
    const SCALE = 2;
    /**
     * @var EccubeConfig
     */
    protected $eccubeConfig;
    /**
     * @var ContainerInterface
     */
    protected $container;
    /**
     * PriceType constructor.
     *
     * @param EccubeConfig $eccubeConfig
     */
    public function __construct(EccubeConfig $eccubeConfig, ContainerInterface $container)
    {
        $this->eccubeConfig = $eccubeConfig;
        $this->container = $container;
    }
    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $currency = $this->container->getParameter('currency');
        $scale = self::SCALE;
        $max = $this->eccubeConfig['eccube_price_max'];
        $min = -$max;
        $constraints = function (Options $options) use ($max, $min) {
            $constraints = [];
            // requiredがtrueに指定されている場合, NotBlankを追加
            if (isset($options['required']) && true === $options['required']) {
                $constraints[] = new NotBlank();
            }
            if (isset($options['accept_minus']) && true === $options['accept_minus']) {
                $constraints[] = new Range([
                    'min' => $min,
                    'max' => $max,
                ]);
            } else {
                $constraints[] = new Range(['min' => 0, 'max' => $max]);
            }
            return $constraints;
        };
        $resolver->setDefaults(
            [
                'currency' => $currency,
                'scale' => $scale,
                'grouping' => true,
                'constraints' => $constraints,
                'accept_minus' => false, // マイナス値を許容するかどうか
            ]
        );
    }
    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return MoneyType::class;
    }
    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'price';
    }
}
カテゴリー
EC-CUBE

【EC-CUBE4】EC-CUBE2からデータ移行

バージョンは「2.11」からの結構カスタマイズされているサイトの移行となります。

どのように移行する?

特にDBの項目増やしたり、プラグインを入れたりしてなければ、データ移行プラグインで最低限移行できる。

データ構成を把握していて、SQLで変換スクリプトを作成して移行しても問題はない。

今回は、データ移行プラグインをカスタマイズして対応した。

2系のデータが多すぎてdumpで落ちる場合

サーバーのスペックにもよるが、dtb_order_detailで5万件以上+その他諸々でサーバー落ち

結局テーブル毎に一覧を取得し、データ移行プラグイン用にcsvを作成し対応

受注明細の消費税のズレ

税率が基本情報で設定されるので、受注明細に設定されているものを優先するように変更

app/Plugin/DataMigration4/Controller/Admin/ConfigController.php

PHP
// 2.4.4, 2.11, 2.12
if (isset($this->baseinfo) && !empty($this->baseinfo)) {
    // $value['tax_rate'] = $data['tax_rate'] = $this->baseinfo['tax'];
    // 商品別税率設定へ対応_dtb_order_detailの[tax_rule]があればそのまま移行
    $value['tax_rate'] = $data['tax_rate'] ? $data['tax_rate'] : $this->baseinfo['tax'];
    $data['point_rate'] = $this->baseinfo['point_rate'];
}

商品別税率機能

2系から移行すると「dtb_tax_rule」テーブルのproduct_class_idが設定されていないので、うまく表示できない

対応方法

商品規格を使用していなければ、productに対してproduct_classが1つなので、対象を取得してアップデートする

カスタムするコードのヒント

app/Customize/Repository/ProductClassRepository.phpへメソッドの追加

PHP
public function getTranslationData()
{
    $qb = $this->createQueryBuilder('pc');
    $qb->select('IDENTITY(pc.Product) AS product_id, pc.id AS product_class_id');
    return $qb->getQuery()->getArrayResult();
}

app/Plugin/DataMigration4/Controller/Admin/ConfigController.php

作成したメソッド呼び出して、加工して当て込む

PHP
/** @var array $productData */
$productData = $this->productClassRepository->getTranslationData();
$this->productIdProductClassId = array_column($productData, 'product_class_id', 'product_id');

if ($data['product_id'] != 0) {
    $productId = $data['product_id'];
    if (isset($this->productIdProductClassId[$productId])) {
        $value['product_class_id'] = $this->productIdProductClassId[$productId];
    }
}

改行コード

app/Plugin/DataMigration4/Controller/Admin/ConfigController.php

PHP
/**
 * 改行コードを変換
 */
public function convertToNewlineCode($staring) {
    $convert = [
        '\r' => "\r",
        '\n' => "\n",
    ];
    
    $target = array_keys($convert);
    $replace = array_values($convert);
    
    return str_replace($target, $replace, $staring);
}

/* 下記のような項目は変換が必要な場合もある */
$data['main_list_comment'];
$data['main_comment'];
$data['comment3'];
$data['body'];
カテゴリー
PHP

【PHP】独自メソッド

たまに使う便利なメソッド

JSTをUTCへ変換

PHP
/**
 * JSTをUTCへ変換
 * @param null|DateTime
 * @return string 
 */
public function convertJstToUtc($DateTime) {
    // 引数がnullの場合、「1970-01-01」を返却
    if (is_null($DateTime)) {
        return date("Y-m-d", null);
    }

    if ($DateTime instanceof DateTime) {
        $DateTime->setTimezone(new \DateTimeZone('UTC'));
        return $DateTime->format("Y-m-d H:i:s");
    }
}

改行コードの置換

PHP
$convert = [
    '\r' => "\r",
    '\n' => "\n",
];

$target = array_keys($convert);
$replace = array_values($convert);

$newBody = str_replace($target, $replace, $body);

$ajestBody = addslashes($newBody);

ハイフンなし郵便番号へハイフンを入れる

PHP
function zipFormat($zipNumber) {
    $result = '〒 '. preg_replace("/(\d{3})(\d{4})/", "$1-$2", $zipNumber);
    return $result;
}

電話番号を3,3,4でハイフン

PHP
function phoneFormat($phoneNumber) {
    $result = preg_replace("/(\d{3})(\d{3})(\d{4})/", "$1-$2-$3", $phoneNumber);
    return $result;
}

指定パスのファイル一覧取得

PHP
// $result = glob('./SampleDirectory/*');
$result = glob($csvDir.'*');
dump($result);

指定パスのファイル一覧取得

PHP
■str_replace:複数
$data = array(
    '\r\n' => '<br>',
    '\\' => '',
);

$target = array_keys($data);
$replace = array_values($data);

$new_text = str_replace($target, $replace, $text);

カテゴリー
EC-CUBE

【EC-CUBE4】初期注文ステータス変更

銀行支払いの場合は購入処理後に「新規受付」→「入金待ち」になるように変更する。

このカスタマイズは一例になります。

プラグインによっては、うまく胃開かない可能性があるのでご「注意ください。

もっと良いカスタマイズ方法があれば、コメントください。

[temp id=3]

購入フローの確認

購入フローは、使用する複数クラスで構成されています。

購入フローの設定は基本的に下記ファイルで行ってます。

ファイルパス:eccube/app/config/eccube/packages/purchaseflow.yaml

詳細は公式のドキュメントを確認ください。

EC-CUBE4開発者向けドキュメントサイト

OrderUpdateProcessorの確認

通常の購入フローで「新規受付」に変更しているのは、こちらのファイルです。

ファイルパス:eccube/src/Eccube/Service/PurchaseFlow/Processor/OrderUpdateProcessor.php

PHP
<?php

/*
 * This file is part of EC-CUBE
 *
 * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
 *
 * http://www.ec-cube.co.jp/
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Eccube\Service\PurchaseFlow\Processor;

use Eccube\Entity\ItemHolderInterface;
use Eccube\Entity\Master\OrderStatus;
use Eccube\Entity\Order;
use Eccube\Repository\Master\OrderStatusRepository;
use Eccube\Service\PurchaseFlow\PurchaseContext;

/**
 * 受注情報更新処理.
 */
class OrderUpdateProcessor extends AbstractPurchaseProcessor
{
    /**
     * @var OrderStatusRepository
     */
    private $orderStatusRepository;

    /**
     * OrderUpdateProcessor constructor.
     *
     * @param OrderStatusRepository $orderStatusRepository
     */
    public function __construct(OrderStatusRepository $orderStatusRepository)
    {
        $this->orderStatusRepository = $orderStatusRepository;
    }

    public function commit(ItemHolderInterface $target, PurchaseContext $context)
    {
        if (!$target instanceof Order) {
            return;
        }
        $OrderStatus = $this->orderStatusRepository->find(OrderStatus::NEW);
        $target->setOrderStatus($OrderStatus);
        $target->setOrderDate(new \DateTime());
    }
}

OrderUpdateProcessorの作成

本体の「OrderUpdateProcessor」をコピーしCustomizeでカスタマイズ

Payment::BANK_PAYMENTは、別途拡張して定数を追加したます。

PAID_WAIT_STATUSを配列にする事で、銀行振込以外でも入金待ちにしたい支払い方法追加可能としました。

PHP
<?php

namespace Customize\Service\PurchaseFlow\Processor;

use Eccube\Service\PurchaseFlow\Processor\AbstractPurchaseProcessor;
use Eccube\Entity\ItemHolderInterface;
use Customize\Entity\Master\OrderStatus;
use Customize\Entity\Payment;
use Eccube\Entity\Order;
use Eccube\Repository\Master\OrderStatusRepository;
use Eccube\Service\PurchaseFlow\PurchaseContext;


/**
 * 受注情報更新処理.
 */
class OrderUpdateProcessor extends AbstractPurchaseProcessor
{
    // 入金待ちにする注文ステータス
    const PAID_WAIT_STATUS = [
        Payment::BANK_PAYMENT,
    ];

    /**
     * @var OrderStatusRepository
     */
    private $orderStatusRepository;

    /**
     * OrderUpdateProcessor constructor.
     *
     * @param OrderStatusRepository $orderStatusRepository
     */
    public function __construct(OrderStatusRepository $orderStatusRepository)
    {
        $this->orderStatusRepository = $orderStatusRepository;
    }

    public function commit(ItemHolderInterface $target, PurchaseContext $context)
    {
        if (!$target instanceof Order) {
            return;
        }

        $Payment = $target->getPayment();

        // 支払い方法により、ステータスを変更する
        if (in_array($Payment->getId(), self::PAID_WAIT_STATUS, true)) {
            $OrderStatus = $this->orderStatusRepository->find(OrderStatus::PAID_WAIT);
        } else {
            $OrderStatus = $this->orderStatusRepository->find(OrderStatus::NEW);
        }
        $target->setOrderStatus($OrderStatus);
        $target->setOrderDate(new \DateTime());
    }
}

PurchaseFlowの設定変更

カスタマイズした「OrderUpdateProcessor」を読み込むように変更

Bash
services:

    # Purchase Flow for Cart

    eccube.purchase.flow.shopping.purchase:
        class: Doctrine\Common\Collections\ArrayCollection
        arguments:
            - #
                - '@Eccube\Service\PurchaseFlow\Processor\PreOrderIdValidator'
                - '@Eccube\Service\PurchaseFlow\Processor\PointProcessor'
                - '@Eccube\Service\PurchaseFlow\Processor\StockReduceProcessor'
                - '@Eccube\Service\PurchaseFlow\Processor\CustomerPurchaseInfoProcessor'
                # - '@Eccube\Service\PurchaseFlow\Processor\OrderUpdateProcessor'
                # 支払い方法で初回ステータスを変更できるようカスタマイズ
                - '@Customize\Service\PurchaseFlow\Processor\OrderUpdateProcessor'
カテゴリー
Plugin WordPress

【WordPress】Code Block Proプラグイン

プログラムコードの表示が見やすくなるプラグイン

プログラムコード表示比較

WordPressデフォルトコード表示

/**
 * お届け先一覧画面.
 *
 * @Route("/mypage/delivery", name="mypage_delivery")
 * @Template("Mypage/delivery.twig")
 */
public function index(Request $request)
{
    $Customer = $this->getUser();

    return [
        'Customer' => $Customer,
    ];
}

Code Block Proで少し設定したコード表示

PHP
/**
 * お届け先一覧画面.
 *
 * @Route("/mypage/delivery", name="mypage_delivery")
 * @Template("Mypage/delivery.twig")
 */
public function index(Request $request)
{
    $Customer = $this->getUser();

    return [
        'Customer' => $Customer,
    ];
}

Code Block Proの設定

言語の設定・表示テーマ・行番号など沢山あるので自分好みにカスタマイズ可能

行番号のバグやカラーのバグ

themeのcssと競合し綺麗に表示できない可能性がある

今回はCocoonのCSSと競合していました。

修正方法

Cocoonのコード設定

ソースコードをハイライト表示と行番号表示のチェックを外すだけでOKです。

該当設定のチェックを外す

直後のキャプチャーを撮り忘れたので、修正後にカスタムしたキャプチャーになります。

カテゴリー
フリーランスエンジニア

【フリーランス】マネーフォワードの会社設立つかってみた

今回は、巷で流行っている個人事業主と法人との二刀流をしようと思い法人を作りましす。

2023/05/06 現在:定款認証まで完了

わからなかった事や注意点も紹介していきます。

始める前に揃えた方が良いもの一覧

法人印:作成に2週間かかるものがございます。私はローマ字と漢字で書体を変更してもらったので、13日程かかりました。

本店住所:バーチャルオフィスなどをご利用の際は、定款にも登録が必要になるので、手続きを済ませてからの方が良いです。

登録免許税を半額にする方法

特定創業支援等事業の制度を利用する。

法人の場合、最低税額15万円かかる登録免許税が7.5万円になります。

合同会社の場合、最低税額6万円かかる登録免許税が3万円になります。

松戸市で確認した内容だと、1一ヶ月以上かけて、4回以上指定の相談会社などを利用する事が条件でした。

私は設立予定日まで、あまり余裕がないので利用できませんでした。

注意事項

電子署名は不要

マネーフォワード経由で電子定款を作成して頂けるので、Adobeの「Acrobat Reader」の不要です。

電子定款について

作成するのに5営業日かかります。

特急+1万円で3営業日で依頼可能です。

会計をご契約いただくと5000円が無料になります。※2023/05/07現在

CD-Rについて

公証人役場で登記関連の書類をCD-Rで登録して、頂けます。

場所によっては、不要な場合はがあるみたいなので前もって問い合わせても良いと思います。

ロイヤルホームセンターなどで探しましたが、データ用のCD-R50枚セットなどで余分だったので、Amazonで10枚セットを購入しました。

ダイソーは、音楽用のみでした、、、

綺麗にする小技

綺麗にしたいタイプで、試行錯誤した結果の方法です。

お役に立てればなによりです。

ホチキスで同じ幅に留める方法

ホチキスをよーくみたら、引っ掛ける箇所がありました。

こちらに引っ掛けて、ホチキスをする事で端から同じ幅で留める事ができます。

契印を綺麗に押す準備

ホチキス後に紙に折り目を入れるところで、斜めになり追加で折り目をつけで汚くなりました、、、

さすがに抵抗があるので、やり直しました。

プラレールをホチキスに合わせておきます。

あとは右のプラレールをズレないように抑えながら、左のプラレールで挟んで擦るだけです。

綺麗な折線ができたので、開いて折り目を丁寧につけて契印をするだけです。

市川公証人合同役場

  • CD-Rを求められました。
  • 役場の反対側に駐車場があるみたいです。:役場内に駐車場案内がありました。
カテゴリー
EC-CUBE

【EC-CUBE4】よく使うコマンド

[temp id=3]

使用頻度の高いコマンド

そのまま実行できないサーバーもあるので、「php」を追加しました。

キャッシュクリア

twigファイルの反映後やプロキシー更新後に使用する

Bash
php bin/console c:c --no-warmup
Bash
php bin/console cache:clear --no-warmup

プロキシ作成・再構築

Bash
php bin/console eccube:generate:proxies

本体・カスタマイズ・プラグインのEntityをまとめている

下記フォルダに作成される

※4.1以上は削除してもコマンドで作り直せる

※4.0系は作り直されないので、ゴミ箱まで空にしない事
eccube/app/proxy/entity/src:src + customizeのentity
eccube/app/proxy/entity/app:pluginのEntity

マイグレーションコマンド

マイグレーションの実行状態確認

Bash
php bin/console doctrine:migrations:status

全ての実行されていないマイグレーション実行

Bash
php bin/console doctrine:migrations:migrate

空のマイグレーションファイル作成

Bash
php bin/console doctrine:migrations:generate

マイグレーションファイルを指定して実行

Bash
php bin/console doctrine:migrations:execute 20210324060716 --up
Bash
php bin/console doctrine:migrations:execute 20210324060716 --down

4.2からか上記では実行できなくなった。

Bash
php bin/console doctrine:migrations:execute 'DoctrineMigrations\Version20210324060716' --up
Bash
php bin/console doctrine:migrations:execute 'DoctrineMigrations\Version20210324060716' --down

スキーマ更新

EntityからDBへ反映

Bash
php bin/console doctrine:schema:update --dump-sql --force

4.2を使用していたら警告が発生

Bash
 [WARNING] Not passing the "--complete" option to "orm:schema-tool:update" is deprecated and will not be supported when 
           using doctrine/dbal 4

–completeオプションを追加して実行すると「doctrine_migration_versions」テーブル削除されます。

マイグレーション実行し直せば、復旧可能だが複数回実行して良いマイグレーションだけとは限らないので、くれぐれも注意してください!

カテゴリー
PHP

【PHP】メモ

以外に書く事がなかったので、随時更新する

PHP調べたメソッド

try&catchでエラー誘発

try中にエラーを発生させたい時

 try {
     // 例外が発生する可能性のあるコード
 

     // ↓↓ 例外発生可能
     throw new Exception();
 } catch (Exception $e) {
     // 例外が発生した場合に行う処理
 } 

PHPエラー

FPDIライブラリ

エラー内容

This PDF document probably uses a compression technique which is not supported by the free parser shipped with FPDI. (See https://www.setasign.com/fpdi-pdf-parser for more details)

FPDIライブラリで、テンプレートファイルを使用する際にエラー発生

解決方法

PDFの読み込みを行うFPDIは、有償のパーサーを別途導入しない場合、PDF 1.5以上のファイルをパースすることができません。テンプレートとなるPDFファイルは PDF 1.4以下の圧縮形式で作成する必要があります。

Acrobat Pro DCをダウンロード(7日間無料期間があった)

Acrobat Pro DCをダウンロード

Acrobat Pro DCを起動して「高度な最適化」
サイズが縮小される場合のみ画像を最適化のチェックを外す
テンプレートファイルを入れ替える
カテゴリー
育児ブログ

【育児】子育てで重宝するアイテム

[temp id=3]

年子の子持ちです。

実は第二子出産から6ヶ月間3時間労働で、家庭優先で育児に専念しております。

優先度:大

特におすすめの商品です。

ベビーモニター

寝室で寝かせた後に活用してます。

抱っこしに行かないと寝れない時の判断に使えます。

これがあるだけで、仕事や家事の効率が上がります。

https://amzn.to/3nohS6p

手動の鼻水吸引機

子供の風邪は、結構長引きます。

これがあれば自動の鼻水吸引機は、なくても良いかも!

使用しているうちに、引けなくなるが油をさせば直るみたいなので覚えておきましょう!!

https://amzn.to/331SgYw

優先度:中

センサーライト

どこにでもつけれて、ネジで固定や両面テープでも設置できます。

やっとの思いで寝かしつけできた子供を起こさないように、階段に設置しています。

https://amzn.to/32P1yHD

オイルヒーター

冬場の暖房は、25万円ぐらいの「しろくまくん」で高性能エアコンでしたが加湿器とセットでも乾燥がひどくオイルヒーターを購入しました。

火傷しにくいだけで、何秒も触っていたら火傷するので注意が必要です。

https://amzn.to/3f9AWUt

トランポリン

長男の2回目のクリスマスプレゼントです。

周りにネットがあるトランポリンは、なかなかありませんでした!

組み立ては、T字の道具の使い方がわかれば2時間ぐらいで組み立てられます!

https://amzn.to/3rYI6k2