Ответы пользователя по тегу PHP
  • Как реализовать роутинг PHP MVC?

    @novrm
    В любом большом веб-приложении есть потребность в иерархии...
    Пример - интернет магазин - две основные МОДЕЛИ (Model) - Category и Product:

    Бытовая техника (Category)
    |---------- Холодильники (Category)
    __________|__________ Samsung2019 (Product)
    |__________ Телевизоры (Category)
    ____________|__________ Sony2019 (Product)

    Как вывести в броузер (придумать единственный URL) переменные ВИДА (View) о Sony2019.
    ... существует миллион и один способ это сделать - все зависит от фантазии веб-программиста и желания заказчика.

    Например так:
    market.com/sony2019
    market.com/sony2019/
    market.com/sony2019.html
    market.com/p201569-sony2019.html

    Эти варианты - попроще, легко реализуются и веб-программист будет настаивать на таком положении вещей...
    Однако заказчик желает иметь УРЛы SEO-правильные, как ему нашептал Лебедев...
    ... и веб-программист получает головняк:
    market.com/Бытовая техника/Телевизоры/sony2019
    market.com/Бытовая техника/Телевизоры/sony2019.html

    Как это работает...
    Все УРЛы съедаются КОНТРОЛЛЕРОМ (Controller) в простейшем случае...
    Однако в фреймворках перед КОНТРОЛЛЕРОМ может быть РОУТЕР - куда УРЛы попадают еще раньше...
    URL -> ROUTER -> CONTROLLER -> MODEL -> VIEW

    Вот в этой цепочке "перетравливается" УРЛ... Как из SEO-URL иерархической цепочки получить искомые ВИДИ - существует миллион и один способ...

    Например так...
    Задаете для ROUTER
    - если URL заканчивается на слеш "/" - то перенаправляй на контроллер CategoryController - ибо получили КАТЕГОРИЮ... Например "market.com/Бытовая техника/Телевизоры/"
    - если URL НЕ заканчивается на слеш "/" - то перенаправляй на контроллер ProductController - ибо получили ПРОДУКТ... Например "market.com/Бытовая техника/Телевизоры/sony2019"

    Дальше в CategoryController берем часть URL, например "Бытовая техника/Телевизоры" и придумываем алгоритм - извлечь МОДЕЛЬ "Телевизоры", которая является ребенком для МОДЕЛИ "Бытовая техника"... Извлекаем МОДЕЛЬ из БД - передаем ее переменные в ВИД или помощники вида...

    Аналогично для МОДЕЛИ "sony2019" Берем часть URL, например "Бытовая техника/Телевизоры/sony2019" и придумываем алгоритм - извлечь МОДЕЛЬ "sony2019", которая является ребенком МОДЕЛИ "Телевизоры", которая является ребенком для МОДЕЛИ "Бытовая техника"... Извлекаем МОДЕЛЬ из БД - передаем ее переменные в ВИД или помощники вида...
    Ответ написан
    Комментировать
  • Где может понадобиться трейт в PHP?

    @novrm
    Пример номер один - трейт для внедрение через сеттер и геттер сервис менеджера.
    ... или других сервисов в другие сервисы.

    use Zend\ServiceManager\ServiceLocatorInterface;
    
    /**
     * ServiceManagerAwareTrait trait.
     */
    trait ServiceManagerAwareTrait
    {
        /**
         * $serviceManager instance.
         * @var ServiceLocatorInterface
         */
        protected $serviceManager = null;
    
        /**
         * Set $serviceManager.
         *
         * @param  ServiceLocatorInterface $serviceManager
         * @return self
         */
        public function setServiceManager(ServiceLocatorInterface $serviceManager)
        {
            $this->serviceManager = $serviceManager;
    
            return $this;
        }
    
        /**
         * Retrieve $serviceManager.
         *
         * @return ServiceLocatorInterface $serviceManager
         */
        public function getServiceManager()
        {
            return $this->serviceManager;
        }
    
    }


    Номер два - наследовать вы можете только ОДИН класс, а трейтов - МИЛЛИОН и тележку...
    Вот у вас есть сервис, который вы обязаны унаследовать от некого стандартного класса...
    ... но желаете добавить еще несколько методов...
    Что тогда?
    Стандартный класс - кем то написан и является неизменяемой частью некого модуля - править нельзя.
    Нужно - унаследовать ДВА раза - один раз наследовать расширенный класс, другой раз - непосредственно от расширенного - наследовать рабочий класс...
    ... или использовать трейты - элегантное решение.

    Правда - есть несколько но - говорят, что при внедрении сложного трейта - тяжело писать тесты, ну и старые версии php их не поддерживают...
    А так - очень даже упрощает жизнь.
    Ответ написан
    1 комментарий
  • Как можно убрать html теги с базы данных средствами php?

    @novrm
    Реализацию можете подсмотреть в любом фреймворке.
    Например: Zend\Filter\StripTags
    Ответ написан
    Комментировать
  • Что нужно возвращать: null или false?

    @novrm
    Странно, конечно, но...
    Методы репозитория должны возвращать сущность или нуль или массив сущностей или пустой массив.
    На то он и репозитории.

    То, что вы пишите true, false или null - должны возвращать сервисы, которые есть посредником между репозиториями и контроллерами.
    Ответ написан
    Комментировать
  • В модели MVC вывод своих страниц ошибок нужно осуществлять через специальный ErrorController?

    @novrm
    403 - это не есть ошибка в коде - это ограничение в правах доступа.
    Как вариант - вы можете просто перенаправить на другую страницу - например на страницу авторизации...
    Для этого нужен только вид, а не контроллер.
    В вики предлагают, еще такой вариант:
    800px-%D0%91%D1%80%D0%B0%D1%83%D0%B7%D0%
    Ответ написан
    Комментировать
  • Есть ли способ удаления лишних закрывающих тегов при парсинге?

    @novrm
    Вам нужно фильтр html-разметки.
    При правильной настройке htmlpurifier - подойдет.
    Ответ написан
    Комментировать
  • Как Заменить все слэши в ссылках на тире?

    @novrm
    $href = '/privet/vova/love/';
    $result = '/' . implode('_', array_diff(explode('/', $href), [''])); // privet_vova_love
    Ответ написан
    Комментировать
  • Как въехать в программирование (ООП, паттерны)?

    @novrm
    Если вы начали дублировать одинаковый код в проекте - значит вы не до конца поняли ООП и патерны проектирования.
    Избавление от дублирования одинакового кода в проекте - главный мотиватор искать решение в ООП и шаблонах.
    Ответ написан
    4 комментария
  • Как найти значение в многомерном массиве и вернуть полный путь?

    @novrm
    Не уверен, но вы не в тут степь идете.
    Извините, если не правильно понял.

    В вашем случае, как мне кажется, нужно делать нечто другое.

    $array = [
        [
            'id' => '100', //допустим, id
            'name' => 'Фрукты', //Название
            'sub_category' => [
                'id' => '101',
                'name' => 'Цитрусовые',
                'product' => [
                    [
                        'id' => '102',
                        'name' => 'Апельсин'
                    ],
                    [
                        'id' => '103',
                        'name' => 'Мандарин',
                    ]
                ]
            ]
        ],
        [
            'id' => '103',
            'name' => 'Овощи',
            'sub_category' => [
                'id' => '104',
                'name' => 'Корнеплоды',
                'product' => [
                    [
                        'id' => '105',
                        'name' => 'Картофель'
                    ],
                    [
                        'id' => '106',
                        'name' => 'Морковь',
                    ]
                ]
            ]
        ],
    ];


    ... и копать здесь...

    $iterator = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($array));
    
    $names = [];
    foreach ($iterator as $name) {
        $depth = floor($iterator->getDepth()/2);
    
        $names[$depth] = $name;
    
        echo implode(' > ', array_slice($names, 0, $depth + 1)), '<br>', PHP_EOL;
    }
    Ответ написан
  • Как вывести элементы в разных div классах?

    @novrm
    Почему бы код не переписать как-то так:

    <?php $caritem = ["car__item_left", "car__item_left-bottom", "car__item_middle", "car__item_middle-bottom"]; ?>
    <div class="car__items">	
        <?php foreach($caritem as $key1 => $value): ?>
            <?php foreach ($arResult['ITEMS'] as $key2 => $arItem): ?>
            <div class="<?= 'car__item' . $value ?>">
                <div class="car__button"></div>
                <div class="car__hover car__hover_mobile">
                    <h3 class="car__title"><?= $arItem['NAME'] ?></h3>
                    <div class="car__text">
                        <p><?= $arItem['PREVIEW_TEXT'] ?></p>
                    </div>
                    <a class="link link_car" href="<?= $arItem['DETAIL_PAGE_URL']?>">Подробнее</a>
                </div>
            </div>
            <?php endforeach ?>
        <?php endforeach ?>
    </div>
    Ответ написан
    Комментировать
  • Как заменить устаревшую функцию?

    @novrm
    У вас проблема не с функцией, а с модификатором.
    Список изменений.
    Ответ написан
    Комментировать
  • Как загрузить классы с помощью __autoload?

    @novrm
    Устарел __autoload

    Функция __autoload была заменена на spl_autoload_register ещё в версии 5.1.
    Основным преимуществом spl_autoload_register является возможность использовать несколько автозагрузчиков. В php 7.2 будет выбрасываться Deprecation notice на стадии компиляции.

    /**
     * Включаем автозагрузку классов в PHP с использованием SPL.
     */
    spl_autoload_extensions('.php');
    spl_autoload_register();
    Ответ написан
    3 комментария
  • Создание сущности или в каких случаях оправданы сеттеры?

    @novrm
    Смотри на контроллер и понимай, что если внедрений нужно сделать тысяча - контроллер раздуешь до беспредела.
    Сеттеры - лучшее решение.
    Кроме того сеттеры и геттеры можно легко засунуть в трейт - кода станет меньше.
    А внедрение сделать не через фабрику - а через общий делегатор с общим ServiceManager.
    Ответ написан
  • Как удалить пробелы на каждой новой строке?

    @novrm
    Не изобретай велосипед, смотри, как это устроено в фреймворках.
    Например, в ZF3:
    Zend\Filter\StringTrim
    https://framework.zend.com/manual/2.2/en/modules/z...
    Ответ написан
    Комментировать
  • Существует ли файловый менеджер для TinyMCE как в WordPress?

    @novrm
    Извините, если не в тему.
    Почему вы выбрали TinyMCE? Как по мне уж больно он так же как и CKEditor тяжелый в настройке.
    Просто из опыта - долго мучался прикрутить эти WISIWIG к блогу на Zend Framework, пока не попробовал summernote.
    Свобода настроек вас поразит.
    Ответ написан
  • Ошибка в php коде.Что нужно изменить?

    @novrm
    Разве трудно понять?
    Где-то вы передаете в конструктор НОЛЬ переменных, а требуется лишь ОДНА.

    Кстати - так чисто удовлетворить любопытство?
    Вам некуда тратить свое драгоценно время, чем на переизобретение CMS?
    Ответ написан
  • Html код внутри php файлов?

    @novrm
    В большинстве php-фреймворков присутствуют помощники видов.
    Это некий класс, который смешивает html-теги и php-логику, а потом выдает в вид готовую html-разметку.
    Это то, что по вашему зло - очень прогрессивно в php-фреймворках.
    Например - Zend\Form\View\Helper.

    С другой стороны это смешение имеет обратную сторону медали.
    Пока вы работает в проекте только с php - все в порядке.
    Вы довольны!
    Но! Как только появляется желание поиграться и прикрутить к проекту JavaScript и AJAX - вы понимаете, что попали в то самое место у женщины...

    Почему? Потому, что по AJAX дает выигрыш во времени в сравнении с php только, когда из сервера приходит ответ в виде массива данных...
    А у вас что? Посылаете на сервер запрос по AJAX... и получаете в ответ целую разметку html!!!
    Так же, как и при обычном запросе БЕЗ AJAX...

    Итак как правильно.
    Если только php - то код html внутри php - это не проблема, даже удобство...
    Но если php+AJAX - то html внутри php вам принесет массу неудобств. В этом случае передавайте в html-разметку только данные.
    Ответ написан
    Комментировать
  • Нужно вывести на сайт информацию товара с описанием. Как правильно реализовать через phpMyAdmin?

    @novrm
    Вы взяли в руки лопату и спрашиваете, как мне при помощи лопаты стать таксистом.

    Единственно что дельно - картинки в БД не хранят.
    Картинки хранят на сервере, а ссылки на картинки хранят в БД.
    Ответ написан
    Комментировать
  • Чем array_walk лучше foreach?

    @novrm
    Работая по ссылке с foreach можете налететь на очень неприятны грабли, которые незаметны и сильно попортят вам нервы.
    Особенно когда разработчики неопытные.
    И именно - ссылку после foreach нужно удалять.
    array_walk для работы по ссылке - само-то, лишь тем и лучше.
    В других случаях — будь попроще — используй foreach.

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

    Пример:
    array_walk($guide['postInGuides'], function (&$postInGuide, $key) use ($guide, $viewRenderer) {
        $postInGuide['post']['url'] = [
            'read' => $viewRenderer->url('guide/guide/post', [
                'slugGuide' => $guide['name'],
                'slugPost'  => $postInGuide['post']['slug'],
            ]),
            'update' => $viewRenderer->url('post/post/action', [
                'slugPost'  => $postInGuide['post']['slug'],
                'action' => 'update',
            ]),
            'delete' => $viewRenderer->url('post/post/action', [
                'slugPost'  => $postInGuide['post']['slug'],
                'action' => 'delete',
            ]),
        ];
    });
    Ответ написан
    Комментировать