• Создание сущности или в каких случаях оправданы сеттеры?

    @novrm
    Fortop: Извините за дотошность.
    Не совсем понял суть вашего ответа?
    Можно пример? И где именно там контракт?

    В трейте спокойно фиксируете проверку типов.
    Например:

    namespace Blog\Service\Traits;
    
    use Blog\Service;
    
    /**
     * PostServiceAwareTrait trait.
     *
     * @package Blog\Service\Traits
     */
    trait PostServiceAwareTrait
    {
    
        /**
         * $postService instance.
         *
         * @var Service\PostService
         */
        protected $postService = null;
    
        /**
         * Set $postService.
         *
         * @param  Service\PostService $postService
         * @return self
         */
        public function setPostService(Service\PostService $postService)
        {
            $this->postService = $postService;
    
            return $this;
        }
    
        /**
         * Retrieve $postService.
         *
         * @return Service\PostService $postService
         * @throws \InvalidArgumentException
         */
        public function getPostService()
        {                           /** Retrieve variable. */
            $postService = $this->postService;
                                    /** Has been set instance from setter? */
            if ($postService instanceof Service\PostService) {
                return $postService;
            };                      /** Set instance from ServiceManager. */
            if (method_exists($this, 'getServiceManager')) {
                $postService = $this->getServiceManager()->get(Service\PostService::class);
                $this->setPostService($postService);
    
                return $this->postService;
            };                      /** Else return exception. */
            throw new \InvalidArgumentException(sprintf('"%s" expects object of "%s" class.', __METHOD__, Service\PostService::class));
        }
    
    }
  • Как эту конструкция переделать в twig?

    @novrm
    Andrey_87: Смотрите - вы не замечаете странность?
    Функция isset($menu_new[$language['language_id']] проверяет существует ли в массиве $menu_new запись с ключом $language['language_id'].
    Так? Так.
    По логике вещей - если запись существует - ей присваивается значение:
    $menu_new[$language['language_id']] = "text";

    -------------------------------
    У вас ситуация обратная - если запись НЕ существует (!isset) - то нужно ее СОЗДАТЬ - И присвоить значение "text".

    -------------------------------
    Теперь в твиг - вы что проверяете?
    if (menu_new[language.language_id] is defined)

    Вы проверяете обратное... То, что я обозначил выше - ЕСЛИ ЗАПИСЬ СУЩЕСТВУЕТ.

    Скорее всего вам нужно писать нечто подобное:
    if (menu_new[language.language_id] not is defined)

    Или в twig - там есть другие синтаксисы - типа in_array...
  • Существует ли файловый менеджер для TinyMCE как в WordPress?

    @novrm
    vbelbel: Вам, наверно, видней.
    Не примите за рекламу.
    Сначала я долго, ооочень долго мусолил TinyMCE и CKeditor.
    Да. Эти редакторы очень "устойчивые" к хакерским атакам. И в этом плане очень полезны для пользователей сайта.
    Но... Для администрации - это просто "убейся лбом об бетон", особенно когда нужно написать html-разметку со всевозможными тегами и атрибутами...

    В итоге я начал искать более "податливый" редактор. Так и вышел на summernote.
    Так, как я смог выкрутить-кастомизировать summernote - я не смог бы с прежними...
    -----
    Вы пишите, что не находите сложности и ограниченности в настройках...
    Однако именно об этом ваш вопрос здесь... :)
  • Ошибка в php коде.Что нужно изменить?

    @novrm
    KlausWinter: Кстати - если нужна будет помощь по постройке блога на Zend Framework 3 - могу бесплатно помочь: novrm@ukr.net
  • Ошибка в php коде.Что нужно изменить?

    @novrm
    1. пишите сразу свой сайт в лоб как понимаете без CMS...
    2. изучайте готовые CMS.
    3. пишите блог на любом фреймворке - например Lavarel или Yii или Zend Framework или Symfony - в порядке сложности...
  • Ошибка в php коде.Что нужно изменить?

    @novrm
    KlausWinter: Если вы воспринимаете советы...
    ... то писание своей CMS это не самый лучший способ набраться опыта.
  • Как написать автогенерацию номера в Doctrina?

    @novrm
    Roquefort: Если вы получили правильный ответ - обозначьте его как решение. В противном случае - обозначьте заблуждение. Это будет полезно многим в подобном вопросе.
  • Как написать автогенерацию номера в Doctrina?

    @novrm
    Roquefort: Все правильно с id, все правильно с созданием записей, но вы не правильно строите бизнес-логику для сортировки.
    Вам нужно еще одно поле для сортировки таким образом как вы пишите.
    Это сделать можно, например полезным расширением для Doctrine:
    Gedmo Sortable behavior extension for Doctrine2

    Если нужно будет помощь с этим расширением - пишите на тостер или мне на почту novrm@ukr.net.
  • Как быть с контроллером?

    @novrm
    Николай Громов: Здравствуйте.
    Насколько я понял - вы начинающий разработчик на ZF3.
    Позвольте тогда вам несколько советов, которые сильно упростят ваши разработки.

    Во-первых у вас контроллер похож на нереальный микс разношерстного кода, который по мере роста вы устанете поддерживать.
    Контроллер должен быть максимально тонким - в контроллере вызывайте только сервисы и отдавайте вид.

    С конструктором в контроллере я бы не возился - это лишнее. Используйте геттеры/сеттеры.

    К примеру возьмем пример блога на ZF3, где есть только два объекта "post" и "tag". В вашем случае - "post" это "product", "tag" - '"category".
    Значит для отображения списка постов с применением пагинации - есть контроллер PostsController.

    namespace Blog\Controller;
    
    use Zend\Mvc\Controller\AbstractActionController;
    use Zend\View\Model\ViewModel;
    
    /**
     * PostsController controller.
     *
     * Handles the PostsController requests for the Blog module.
     *
     * @package Blog\Controller
     */
    class PostsController extends AbstractActionController
    {
    
        /**
         * Traits.
         */
        use \Fork\Zend\ServiceManager\Traits\ServiceManagerAwareTrait;
        use \Blog\View\Traits\PostsViewAwareTrait;
    
        /**
         * indexAction action.
         *
         * @return mixed
         */
        public function indexAction()
        {                                   /** Retrieve services and plugins. */
            $postsView = $this->getPostsView();
                                            /** Creates and settings view model. */
            return (new ViewModel())
            ->setVariables($postsView->getListVariables())
            ->setVariables($postsView->getPaginationVariables())
            ; 
        }
    
    }


    Для отображения отдельно взятого поста - другой контроллер PostController.

    namespace Blog\Controller;
    
    use Zend\Mvc\Controller\AbstractActionController;
    use Zend\View\Model\ViewModel;
    
    /**
     * PostController controller.
     *
     * Handles the PostController requests for the Blog module.
     *
     * @package Blog\Controller
     */
    class PostController extends AbstractActionController
    {
    
        /**
         * Traits.
         */
        use \Fork\Zend\ServiceManager\Traits\ServiceManagerAwareTrait;
        use \Blog\View\Traits\PostViewAwareTrait;
    
        /**
         * indexAction action.
         *
         * @return mixed
         */
        public function indexAction()
        {                                   /** Retrieve services and plugins. */
            $postView = $this->getPostView();
                                            /** Retrieve request parameters. */
            if (!empty($this->params('slugPost'))) {
                                            /** Fetches entity corresponding request parameters. */
                if (!empty($postViewVariables = $postView->getVariables())) {
                    return new ViewModel($postViewVariables);
                } else {                    /** If entity not exists - return page "404". */
                     return $this->CreateHttpNotFoundModel($this->getResponse());
                };
            } else {                        /** Redirect to posts controller. */
                return $this->redirect()->toRoute('posts');
            };
        }
    
    }


    Логику разного рода манипуляций, проверок, извлечения, работы с БД переносите в специализированные сервисы. Даже работу с переменными вида можете закинуть в отдельный сервис.

    Теперь дальше. Если работает с Doctrine - вам вполне будет достаточно и родного пагинатора для ZF3. Однако адаптер к пагинатору вам все же нужно будет написать свой.

    Дело в том, что снова же - настроить пагинацию - это тонны кода.

    Потом я бы вам рекомендовал все же перейти на шаблонизатор twig вместо родного php. twig легок в изучении и гораздо гибче. Это сэкономит вам уйму времени.

    --------------
    Еще вопрос. Извините, не совсем понимаю смысл ваших манипуляций с изображениями при помощи php на стороне сервера.
    Почему это нельзя сделать JavaScript на стороне клиента?
    Как я понимаю - это галерея? Тогда только JavaScript.
    --------------

    Если желаете продолжить диалог - пишите мне на почту novrm@ukr.net
  • Как быть с контроллером?

    @novrm
    Николай Громов: action - create, update, delete - соответственно создать, редактировать, удалить категорию.
    Для этого нужно создать соответствующие action ну и виды.
    Я ведь не знаю каким образом вы манипулируете категориями.

    Относительно слеша - это по вкусу. Можете добавлять.

    Извините немного трудно вам объяснить не зная уровня вашего познания ZF3.

    Теперь относительно вашего action 'file'.
    Как я понимаю у вас вместо defaults action index - нужно указать defaults action file.

    ---------------

    В общем, как я понимаю, у вас - есть 'category' и 'goods'.
    Вы собираетесь манипулировать этими объектами?
    Если да - то вам нужен CRUD - create, read, update, delete интерфейс.

    Честно говоря не совсем понимаю для чего вы пытаетесь через action вызвать изображение?
    Вы сохраняете изображения в БД? Это достаточно затратная по времени процедура.
    Почему просто не написать:
    <img src="/img/my_picture.jpg">

    Чем вы взаимодействуете с БД?

    Честно говоря - пагинатор это одновременно и легко и тяжело.
    В двух словах не опишешь.
  • Как правильно заменить ServiceLocator в ZF3?

    @novrm
    Сергей: То о чем вы спрашиваете можно сделать несколькими способами.
    Через сеттер/геттер или трейт, делегатор, инициализатор или как вы предлагаете - фабрику.

    Могу продемонстрировать вариант, на мой взгляд наиболее правильный.
    Суть - создаете некий общий трейт ServiceManagerAwareTrait в котором два метода сеттер и геттер - getServiceManager и setServiceManager.
    Добавляете его в начало каждого контроллера.
    Потом создаете общий делегатор ServiceManagerAwareDelegator, который инъецирует ServiceManager в контроллер через сеттер.

    После того, как вы создали общий трейт и общий делегатор, вам нужно дописывать для каждого контроллера только две строчки:

    В начале контроллера:
    class IndexController extends AbstractActionController
    {
        use \Fork\Zend\ServiceManager\Traits\ServiceManagerAwareTrait;
    
        ...
    }


    В конфигурации контроллера:
    'controllers' => [
        'delegators' => [
            Controller\IndexController::class => [ServiceManagerAwareDelegator::class],
        ],
    ],
  • Как использовать autoload.php из composer?

    @novrm
    dev400: Изменил ответ - смотрите выше.
    Так сделано, например, в новом ZendFramework 3: https://github.com/zendframework/ZendSkeletonAppli...
  • Какую выбрать книгу для PHP?

    @novrm
    На данном этапе развития технологий все знать невозможно...
    Важно знать - где искать ответы и решения...

    Технология такова - начинаешь писать проект, по ходу гуглиш готовые решения под свои цели, которые разбираешь через мануал...
  • Почему в данном случае не отрабатывается php код в html документе?

    @novrm
    Трудно сказать почему не работает - у меня работает...
    Возможно где-то в файлах конфигурации наоборот .html - заблокирован для обработки, как php. В целях защиты сервера...
    Выложи httpd.conf.
  • PHP namespaces как используете?

    @novrm
    Вы пробовали spl_autoload_register() ?
    Грузит классы.
    Или думаете, что все малограмотные и после добавления класса нужно каждый раз его прибавлять или удалять в index.php?
  • Скорость работы сайта на php?

    @novrm
    Сергей Протько: Посмотрите, как это устроено во фреймворках - один файл одной локали на один модуль.
    https://github.com/zendframework/ZendSkeletonAppli...
  • Правильная ли верстка сайта?

    @novrm
    Альфред: Так книгу можно прочитать по диагонали за пол дня...
    А в примерах коде разобраться?
    Снова упираемся в практику...