• Как установить каноническую ссылку на страницах пагинации Битрикс?

    @ZardoZAntony
    программист, сис. админ
    Главная ошибка использования для подобного AddHeadString в том, что возможны ситуации, когда на одной странице в нескольких местах будет разный canonical. А в части решений забыли использовать второй параметр true, так будут выводиться дубли одного и того же, в случае если такой подход используется в разных компонентах. А так же вы получите дубляж при уже добавленном canonical от стандартных компонентов, которые такой подход не используют.

    Правильно использовать свойства страницы, как это делают стандартные компоненты битрикса
    Например catalog.element это делает так:
    $APPLICATION->SetPageProperty('canonical', $arResult["CANONICAL_PAGE_URL"]);


    Для страниц навигации правильно устанавливать canonical так:
    для шалонов используемого system.pagenavigation создаете файл component_epilog.php

    use Bitrix\Main\Web\Uri;
    $context = \Bitrix\Main\Application::getInstance()->getContext();
    $uri = new Uri($context->getRequest()->getRequestUri());
    $uri->deleteParams(['PAGEN_' . $arResult['NavNum']]);
    
    $protocol = $context->getRequest()->isHttps() ? 'https://' : 'http://';
    $href = $protocol . $context->getServer()->getHttpHost() . $uri->getUri();
    
    $APPLICATION->SetPageProperty('canonical', $href);


    В последних версиях ничего делать больше не нужно, если в header.php есть вызов
    <?php $APPLICATION->ShowHead()?>
    В других случаях надо явно указывать
    <?php $APPLICATION->ShowLink("canonical")?>

    В админке проверьте, что в "управлении структурой" добавлено данное свойство.
    Данный метод можно использовать в любых ситуация, даже без ЧПУ, т.к. остальные параметры из строки не удаляются.

    Задача, которую опционально требуется решать - проверить, а не установлен ли canonical до вас. В таком случае вы его перетрёте, а это часто не то что нужно. Оставлю её на домашнее задание.
    Ответ написан
    1 комментарий
  • Как добавить на 1С Битрикс ссылку canonical?

    tomgif
    @tomgif
    Веб-разработчик
    $APPLICATION->SetPageProperty('canonical', $arResult["CANONICAL_PAGE_URL"]);
    Ответ написан
    Комментировать
  • Как установить utf8 локаль для postgresql?

    @whats
    Сам долго с этим боролся.
    Включаешь консоль
    Удаляем старый кластер базы данных
    pg_dropcluster --stop 9.1(версия кластера) main(имя кластера, получить можно pg_lsclusters)

    Создаем новый кластер
    pg_createcluster --locale de_DE.UTF-8 --start 9.3 main

    При этом локаль должна быть установлена
    dpkg-reconfigure locales
    Ответ написан
    Комментировать
  • Как сохраненить файл с символом слеш в названии?

    @zapimir
    Лучше конечно сохранять без слэша, заменять его к примеру на ` (или другой редкоиспользуемый в названиях файлов символ). Или хранить название в базе.
    Но если совсем тупой заказчик, можно использовать какой-нибудь unicode символ похожий на слэш, к примеру
    FRACTION SLASH
    www.fileformat.info/info/unicode/char/2044/index.htm
    визуально он похож, но это уже не обычный слэш и в названиях файлов его использовать можно, по крайней мере в винде.
    Ответ написан
    Комментировать
  • Как найти место определения функции в PHP?

    BuriK666
    @BuriK666
    Компьютерный псих
    <?php
    function test() {
    }
    
    $ref = new ReflectionFunction('test');
    echo $ref->getFileName().':'.$ref->getStartLine().PHP_EOL;
    Ответ написан
    2 комментария
  • Когда использовать protected, private, public и static методы?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Есть такая штука в ООП как инкапсуляция. С этого стоит начать и в принципе можно было бы закончить, если бы не static и не protected.

    public
    Публичные методы класса. Логично да? Какие методы у нас должны быть публичными - те которые составляют интерфейс класса. То есть для, например, класса кеширования у нас должен быть такой интерфейс:
    interface Cache {
        public function get($name);
        public function set($name, $value);
        public function has($name);
        public function remove($name);
        public function removeAll();
    }


    Давайте введем понятие "клиентский код". Это тот код который будет использовать ваш код, ваши объекты. Что он должен знать о реализации ваших классов? Да ничего он знать не должен. Он должен знать только как им пользоваться. Это как раз таки интерфейс и регламентирует. Мол "этот объект позволяет вам брать/сохранять/удалять данные в/из кэша. Клиентский код не знает где кэш находится, есть ли он вообще... да и ему и не нужно.

    private
    Внутренние методы классов. Те которые не входят в интерфейс но нужны, скажем, для уменьшения дублирования реализации.

    class FileCache implements Cache{
        public function has($name) {
              return is_file($this->getCacheFilePath($name));
        }
    
        public function get($name) {
             if (!$this->has($name)) {
                  return null;
             }
     
             return unserialize(file_get_contents($this->getCacheFilePath($name)));
        }
    
        private function getCacheFilePath($name) {
             return $this->cacheDir . '/' . $name;
        }
    }


    protected
    Иногда у вас появляется необходимость вынести общую реализацию внутренних методов в базовый какой-то абстрактный класс. Например у вас есть несколько реализаций кеша для одного и того же хранилища или что-либо такое. Тогда вы заводите абстрактный класс, выносите туда всю общую реализацию в protected методах ну и т.д. Придумывать пример лень... Придумайте сами. Суть в том что protected методы желательно использовать только в абстрактных классах (но не как абстрактные методы, хотя всякое может быть) или если вы планируете дать возможность расширять ваш класс (но если честно, это крайне редко бывает).

    static
    Статические методы, это всяческие методы хелперы. Например в языках типа Java есть такое понятие как именованные конструкторы. Мол когда для конструирования объектов нужно много данных переделать или что-то еще, для удобства заводят статический метод какой а в нем уже реализуют какую-то логику. Желательно вообще что бы статический метод не содержал много логики, но... всякое бывает. Вообще тут стоит еще поподробнее почитать о том как себя ведут статические методы и свойства, в чем их особенность и т.д. Попробуйте тот же сингелтон сделать к примеру.

    class Template($content) {
        public static fromFile($path) {
             return new static(file_get_contents($path));
        }
    }


    Вот... Возможно человеки вроде FanatPHP разгромят мой ответ, или дополнят его...

    Так же если вам хочется научиться правильно составлять интерфейсы классов, следует почитать про low coupling и high cohesion. Эти два принципа должны заставить вас соблюдать баланс и держать в интерфейсе класса только то, что там должно быть. Так же к вопросу о наследовании можно подключить принцип подстановки Барбары Лисков. Даже на той же википедии почитайте. А там если станет интересно в принципе можно поискать интересные материалы по GRASP и SOLID.
    Ответ написан
    4 комментария
  • Что за ошибки при загрузке сайта (this.root.createShadowRoot is not a function)?

    @webhero
    Если вдруг еще актуально, yobject.js принадлежит расширению Яндекс.Карточка, отключите его, и ошибки в консоли не будет
    Ответ написан
    Комментировать