• Можно ли в разместить в шапке шесть якорных ссылок, ведущих на якори одной и той же страницы с разными анкорами?

    @BLM21 Автор вопроса
    Adamos, Признателен от всего сердца за ответы. Аргументация и пояснения самые здравые и убедительные.
  • Можно ли в разместить в шапке шесть якорных ссылок, ведущих на якори одной и той же страницы с разными анкорами?

    @BLM21 Автор вопроса
    Adamos, да, но это навигация по странице, а у меня навигация по сайту. Всё-таки нечего бояться?
  • Можно ли в разместить в шапке шесть якорных ссылок, ведущих на якори одной и той же страницы с разными анкорами?

    @BLM21 Автор вопроса
    Одиночка Айс, да, якоря точно приведут туда, куда нужно, 100%. если якорь про цену груш, то придёт на H2 с заголовком соответствующим и ценами груш.
  • Можно ли в разместить в шапке шесть якорных ссылок, ведущих на якори одной и той же страницы с разными анкорами?

    @BLM21 Автор вопроса
    Adamos, то есть по Вашему мнению ничего страшного нет в том, в <HEADER> я сделаю эти шесть якорных ссылок одной страницы с разными анкорами?
  • Можно ли в разместить в шапке шесть якорных ссылок, ведущих на якори одной и той же страницы с разными анкорами?

    @BLM21 Автор вопроса
    Adamos, Доброго утра. Но это не лендинг. Это многостраничный сайт. Страница прайса отдельная. Отсюда и вопрос мой, стоит ли так делать в шапке или поисковый робот на такое отреагирует плохо?
  • Почему номер телефона приходит в Telegram не кликабельным?

    @BLM21 Автор вопроса
    MrColdCoffee, Нет, при таком раскладе портится внешний вид пришедшего сообщения, а номер кликабельным всё равно не становится. Проверено только что.
  • Почему номер телефона приходит в Telegram не кликабельным?

    @BLM21 Автор вопроса
    Посмотрел Вашу ссылку.
    Но в той статье не выглядит, как шаблон, а смотрится, будто преобразован конкретный номер телефона. И ещё не ясно, куда это вставлять для реализации. Перебор, конечно, может ответить на этот вопрос.
  • Почему номер телефона приходит в Telegram не кликабельным?

    @BLM21 Автор вопроса
    Имеете в виду, заменить строку $txt = str_replace('+','%2B',$txt); на urlencode($txt) = str_replace('+','%2B',$txt); ?

    Насколько мне известно, %2B это и есть urlencode.
  • Почему в конце og:url для главной добавляется в конце два слэша?

    @BLM21 Автор вопроса
    Лучший ответ с популярнейшим объяснением. Признателен.
    Позвольте вопрос. А как всё-таки лучше со слешем на конце или без для главной или остальных страниц? Посмотрел у Youtube, например, canonical главной со слешем на конце. Но это не аргумент ЗА, а просто к слову. Даже у таких сайтов валидация прихрамывает. Интересно мнение специалиста на этот счёт - про лучше или хуже.
  • Почему в конце og:url для главной добавляется в конце два слэша?

    @BLM21 Автор вопроса
    Александр Васильев, да, изменил схему url на "abs", однако, это тоже не избавило от слэшей. Более того, присмотрелся, у меня после домена и на неглавных страницах так же в canonical подтягивается двойной слэш. Уже в хостинг написал. Такого точно не было до переезда на https, который они сами мне сделали. Жду ответ от них.
  • Почему в конце og:url для главной добавляется в конце два слэша?

    @BLM21 Автор вопроса
    Александр Васильев, я сейчас прикреплю скрин настроек и код .htaccess. Может, там что-то не то заметите.
    # For full documentation and other suggested options, please see
    # http://svn.modxcms.com/docs/display/MODx096/Friendly+URL+Solutions
    # including for unexpected logouts in multi-server/cloud environments
    # and especially for the first three commented out rules
    
    RewriteEngine on
    
    # The Friendly URLs part
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
    
    RewriteCond %{REQUEST_URI} ^(.*?)\/{2,}(.*?)$
    RewriteRule . %1/%2 [L,R=301]
    RewriteCond %{THE_REQUEST} //
    RewriteRule .* /$0 [R=301,L]
     
    RewriteCond %{HTTP_HOST} ^www\.(.*)$ [NC]
    RewriteRule ^(.*)$ https://%1/$1 [R=301,L]
     
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [NC,R=301,L]
    
    #php_flag register_globals Off
    #AddDefaultCharset utf-8
    #php_value date.timezone Europe/Moscow
    
    Options +FollowSymlinks
    RewriteEngine On
    RewriteBase /
    
    <ifModule mod_gzip.c>
      mod_gzip_on Yes
      mod_gzip_dechunk Yes
      mod_gzip_item_include file .(html|img|flv|gif|jpg|jpeg|png|ico|swf|js|css|webp|pdf|txt|php|pl)$
      mod_gzip_item_include handler ^cgi-script$
      mod_gzip_item_include mime ^html/.*
      mod_gzip_item_include mime ^text/.*
      mod_gzip_item_include mime ^application/x-javascript.*
      mod_gzip_item_exclude mime ^image/.*
      mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
    </ifModule>
    
    <IfModule mod_rewrite.c>
         RewriteEngine On
         RewriteCond %{HTTP_ACCEPT} image/webp
         RewriteCond %{REQUEST_URI}  (.*)(\.(jpe?g|png))$
         RewriteCond %{DOCUMENT_ROOT}/%1\.webp -f
         RewriteRule .* %1\.webp [L,T=image/webp]
     </IfModule>
     <IfModule mod_headers.c>
         Header append Vary Accept env=REDIRECT_accept
     </IfModule>
     <IfModule mod_mime.c>
       AddType image/webp .webp
     </IfModule>
    
    <FilesMatch ".(html|img|flv|gif|jpg|jpeg|png|ico|swf|js|css|webp|pdf|txt|php|pl)$">  
    Header set Cache-Control "max-age=10368000"  
    </FilesMatch>
    
    
    <IfModule mod_expires.c>
    ExpiresActive On
    ExpiresByType text/url "access plus 180 days"
    </IfModule>
    
    # Fix Apache internal dummy connections from breaking [(site_url)] cache
    RewriteCond %{HTTP_USER_AGENT} ^.*internal\ dummy\ connection.*$ [NC]
    RewriteRule .* - [F,L]
    
    # Exclude /assets and /manager directories and images from rewrite rules
    RewriteRule ^(manager|assets)/*$ - [L]
    RewriteRule \.(jpg|jpeg|png|gif|ico)$ - [L]
    
    # For Friendly URLs
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^(.*)$ index.php?q=$1 [L,QSA]
    
    # Reduce server overhead by enabling output compression if supported.
    #php_flag zlib.output_compression On
    #php_value zlib.output_compression_level 5
    
    RewriteEngine on
    RewriteRule ^sitemap\.xml$ /google_sitemap.php [L]


    621a603e1f721586549352.jpeg
  • Почему в конце og:url для главной добавляется в конце два слэша?

    @BLM21 Автор вопроса
    Александр Васильев, мои извинения. при обновлении страницы даже не показался в Вашем комментарии код приведённый Вами. Только сейчас обновил страницу и увидел.

    Ваша формула кода у меня не действует, к сожалению. Я дописал описание к вопросу.
  • Почему в конце og:url для главной добавляется в конце два слэша?

    @BLM21 Автор вопроса
    Александр Васильев, пардон, не сразу понял, что имели в виду модифицировать данный код, убрав [[++site_url]]

    Но нет, это не спасает. А в config.inc.php всё в порядке.

    Кстати, canonical в чанке head имеет эту же формулу
    <link href="[[++site_url]][[~[[*id]]]]" rel="canonical">
    И с ним у главной такая же беда.
  • Почему в конце og:url для главной добавляется в конце два слэша?

    @BLM21 Автор вопроса
    Александр Васильев, Доброго вечера, Александр. Признателен, что откликнулись. Вот этот сайт-нэйм, если прописан по пути файла core/config/config.inc.php , то тут нет лишних слэшей, даже одного. Выходит, сайт-нэйм подтягивается не отсюда. А вот откуда, вопрос.
  • Знает ли кто-нибудь, как отвязать открытие кнопки формы от ID? Или как делать нелимитированное количество разных кнопок формы для сайта?

    @BLM21 Автор вопроса
    Ankhena,
    Я логически понимаю отличие div от button. Внимательно изучил пример Вашего HTML, CSS и JS. Но так как это не точная копия моего модального окна, то слизывать себе Ваш пример мне придётся достаточно долго, нудно, а, к сожалению, не факт, что получится.

    Я кое-как понимаю HTML и CSS, но Java для меня - сложнейший тёмный лес. Я понятия не имею, что, как и в какой последовательности нужно вставить, уже не вдаваясь в синтаксис ошибок, из-за которых JS-код может не работать.

    Мне не под силу изменить JS моего модального окна под HTML моего модального окна, чтобы всё заработало корректно из-под class, а не #. Я еле-еле сотнями разных вариантов, стирая по одному символу, сохраняя изменения, очищая кеш в CMS, очищая кеш браузера, - и так попытка за попыткой - смог достичь вызова модального окна любым количеством кнопок, используя Ваш вариант.

    Но сделать так, чтобы модальное окно закрывалось нормально, как это было в старом варианте, у меня не выходит.

    Отчаявшись, я пошёл на костыль и попросту совместил старое и новое. В идеале, считаю, весь JS должен быть в файле JS. Но так как не выгорает, то костыль выглядит у меня так ( по крайней мере, этот костыль работает ).

    HTML

    <div class="modal closed" id="modal" aria-hidden="true" role="dialog">
      <button class="close-button" id="close-button">Закрыть</button>
      <div class="modal-guts" role="document">
    	<div class="form__wrapper">
    	  <form id="form-contact" method="POST" class="form-element" autocomplete="off">
    		<p class="form-title">вызвать компьютерного мастера на дом или в офис<br>в Москве | МО</p>
    		<p class="form-message"></p>
    		<input name="name" type="text" class="form-input__name" tabindex="0" placeholder="Введите ваше имя" required>
    		<input name="phone" id="phone" type="tel" class="form-input__phone" tabindex="0" placeholder="Введите ваш телефон">
    		<input name="theme" type="hidden" class="form-input__theme"  value="Заявка с сайта">
    		<input type="submit" class="form-input__button" onclick="ym(52794661, 'reachGoal', 'zayavka'); return true;" value="Жду звонка!">
    	  </form>
    	</div>
      </div>
    </div>


    JS ( полностью не копирую, только использованную Вашим советом часть )

    <script>
      var modal = document.querySelector("#modal"),
    	closeButton = document.querySelector("#close-button");
    	  
    	closeButton.addEventListener("click", function() {
    	modal.classList.toggle("closed");
    	modalOverlay.classList.toggle("closed");
      });
    </script>


    Я просто подумал так: раз старый вариант закрывал модальное окно, но не давал создавать безлимитное количество отзывчивых и открывающихся кнопок, в то время, как Ваш новый вариант позволяет создавать безлимитно открывающие модальное окно кнопки, но не даёт закрыть модальное окно, значит, в JS оставляю Ваш вариант, а в HTML выношу кусок старого кода, раз уж такая песня.
    Как ни крути, рабочий костыль. Без Вас и его бы не было. Так что, признателен Вам. недаром 65% решений у Вас. А я в JS, как слепой кот. Я реально не знаю, как вынести костыль в JS файл.

    P.S.

    И вот дописал я Вам это письмо... И задумался - отправить... или ещё одна попытка... Сел пытать дальше, а текст набран, просто не нажата кнопка отправить. Увлёкся, одной попытки не хватило. И думаю - хватит... или ещё одна? И снова пробую вынести этот рабочий костыль из HTML в JS.

    Получилось. Но суть-таки в том, что код смешанный - Ваш метод + старый код.
    Поставил костыль над Вашим кодом - вуаля, заработало закрытие. На выходе - безлимитное количество кнопок, вызывающих отлично модальное окно безо всякой привязки к конченным #ID - благодаря Богу JS Ankhena, и главное - закрывается модальное окно теперь тоже спокойно. Признателен Вам, таинственная незнакомка.

    var modal = document.querySelector("#modal"),
    	  closeButton = document.querySelector("#close-button");
    
      closeButton.addEventListener("click", function() {
    	modal.classList.toggle("closed");
    	modalOverlay.classList.toggle("closed");
      });
    
      const  openButtons = document.querySelectorAll(".modal-btn");
      
      openButtons.forEach(btn=> {
        btn.addEventListener("click", () => {
           modal.classList.toggle("closed");
           modalOverlay.classList.toggle("closed");
        });
    })
    
      const  modalOverlay = document.querySelector(".modal-overlay");
    
      modalOverlay.forEach(btn=> {
        modalOverlay.addEventListener("click", () => {
           modal.classList.toggle("closed");
           modalOverlay.classList.toggle("closed");
        });
    })
  • Знает ли кто-нибудь, как отвязать открытие кнопки формы от ID? Или как делать нелимитированное количество разных кнопок формы для сайта?

    @BLM21 Автор вопроса
    Ankhena,
    Вы не просто знаток, Вы - учитель. Мне пришлось перебрать кучу вариантов, пока я расположил данный Вами код, как следует.
    Благодаря Вам, мне удалось вызывать форму так:

    <div class="modal-btn call-computer-master"><p>вызвать мастера на дом</p></div>


    Я убрал часть старого кода из JS и прописал:

    const  openButtons = document.querySelectorAll(".modal-btn");
      
      openButtons.forEach(btn=> {
        btn.addEventListener("click", () => {
           modal.classList.toggle("closed");
           modalOverlay.classList.toggle("closed");
        });
    })
    
      const  modalOverlay = document.querySelector(".modal-overlay");
    
      modalOverlay.forEach(btn=> {
        modalOverlay.addEventListener("click", () => {
           modal.classList.toggle("closed");
           modalOverlay.classList.toggle("closed");
        });
    })


    Но аналогичным методом не хочет закрываться форма при нажатии кнопки "Закрыть".
    То есть вот так не закрывается:

    const  closeButton = document.querySelectorAll(".close-button");
    
      closeButton.forEach(btn=> {
        closeButton.addEventListener("click", () => {
           modal.classList.toggle("closed");
           modalOverlay.classList.toggle("closed");
        });
    })


    Ищу ответ, пока не нахожу. Перепробовал много вариантов, пока безуспешно. Убрать или прибавить all пробовал, заменить точку на ID тоже пробовал.
  • Знает ли кто-нибудь, как отвязать открытие кнопки формы от ID? Или как делать нелимитированное количество разных кнопок формы для сайта?

    @BLM21 Автор вопроса
    Я попробовал следующие правки, кнопки становятся некликабельны. Если у Вас найдётся время как-то, поправьте, пожалуйста, что я сделал не так. Кроме Вас никто не откликнулся. Либо сложно-таки, либо по другим неизвестным причинам. Интернет ответами на вопрос не кишит.

    Так я изменил HTML в футере.

    <div class="modal-overlay closed"></div>
    
        <div class="modal-btn closed" aria-hidden="true" role="dialog">
          <button class="close-button" title="">Закрыть</button>
          <div class="modal-guts" role="document">
              <div class="form__wrapper">
              <form id="form-contact" method="POST" class="form-element" autocomplete="off">
                <p class="form-title" style="color:#191970">вызвать компьютерного мастера на дом или в офис<br />в Москве | МО</p>
                <p class="form-message"></p>
                  <input name="name" type="text" class="form-input__name" tabindex="0" placeholder="Введите ваше имя" required>
                  <input name="phone" id="phone" type="tel" class="form-input__phone" tabindex="0" placeholder="Введите ваш телефон" required>
                  <input name="theme" type="hidden" class="form-input__theme"  value="Заявка с сайта">
                  <input type="submit" style="color:#191970" class="form-input__button" onclick="ym(52794661, 'reachGoal', 'zayavka'); return true;" value="Жду звонка!">
              </form>
              </div>
          </div>
        </div>


    Так я изменил JS.

    $(document).ready(function () {
        $(".form-element").submit(function () {
            var formID = $(this).attr('id');
            var formNm = $('#' + formID);
            var message = $(formNm).find(".form-message");
            var formTitle = $(formNm).find(".form-title");
            $.ajax({
                type: "POST",
                url: 'https://blm21.com/callback-form/telegramform/php/send-message-to-telegram.php',
                data: formNm.serialize(),
                success: function (data) {
                  // Вывод сообщения об успешной отправке
                  message.html(data);
                  formTitle.css("display","none");
    			    $('input','.form-element').not(':input[type=submit], :input[type=hidden], :reset').val('');
    				$(".form-element input[type=submit]").attr('disabled','disabled');
                  /* setTimeout(function(){
                    formTitle.css("display","block");
                    message.html('');
                    $(".form-element input[type=submit]").attr('enabled','enabled');				
                  }, 30000); */
                },
                error: function (jqXHR, text, error) {
                    // Вывод сообщения об ошибке отправки
                    message.html(error);
                    formTitle.css("display","none");
                    setTimeout(function(){
                      formTitle.css("display","block");
                      message.html('');
                      $('input').not(':input[type=submit], :input[type=hidden]').val('');
                    }, 3000);
                }
            });
            return false;
        });	
    	
    });
    
    const  openButtons = document.querySelectorAll(".modal-btn"),
    	  modalOverlay = document.querySelectorAll(".modal-overlay"),
    	  closeButton = document.querySelectorAll(".close-button"),
    	  openButton = document.querySelectorAll(".all-computer-master");
          openButton2 = document.querySelectorAll(".call-pc-master");
          openButton3 = document.querySelectorAll(".call-computer-wizard");
          openButton4 = document.querySelectorAll(".phone-computer-wizard");
          openButton5 = document.querySelectorAll(".computer-wizard-call");
          openButton6 = document.querySelectorAll(".call-pc-wizard");
          
          
    openButtons.forEach(btn=> {
        closeButton.addEventListener("click", () => {
           modal.classList.toggle("closed");
           modalOverlay.classList.toggle("closed");
        });
        modalOverlay.addEventListener("click", () => {
           modal.classList.toggle("closed");
           modalOverlay.classList.toggle("closed");
        });
        openButton.addEventListener("click", () => {
           modal.classList.toggle("closed");
           modalOverlay.classList.toggle("closed");
        });
        openButton2.addEventListener("click", () => {
           modal.classList.toggle("closed");
           modalOverlay.classList.toggle("closed");
        });
        openButton3.addEventListener("click", () => {
           modal.classList.toggle("closed");
           modalOverlay.classList.toggle("closed");
        });
        openButton4.addEventListener("click", () => {
           modal.classList.toggle("closed");
           modalOverlay.classList.toggle("closed");
        });
        openButton5.addEventListener("click", () => {
           modal.classList.toggle("closed");
           modalOverlay.classList.toggle("closed");
        });
        openButton6.addEventListener("click", () => {
           modal.classList.toggle("closed");
           modalOverlay.classList.toggle("closed");
        });
    
      
      $(function(){
    	$("#phone").mask("+7 (999) 999-99-99");
      });
      })
  • Знает ли кто-нибудь, как отвязать открытие кнопки формы от ID? Или как делать нелимитированное количество разных кнопок формы для сайта?

    @BLM21 Автор вопроса
    Ankhena, первым делом просто добавил в конец селектора all. Это привело к тому, что все кнопки перестали открываться. Заменил в HTML и JS modal на modal-btn, дальше попробовал перебрать forEach ( возможно неверно перебрал как-то ). Словом, не получилось.
    Я не сразу понял, что Вы имели в виду под модалкой, потом заподозрил, что Вы имели в виду модальное окно. Да, оно на сайте одно - у формы вот этой заказа звонка.

    Попытаюсь объяснить.

    Вот код, как выводится кнопка формы в поле страницы конкретной.

    <div id="phone-computer-wizard" class="phone-computer-wizard"><p>вызывайте мастера</p></div>


    Вот код в футере, который, так сказать, базовый, то есть содержимое формы показывает.

    <div class="modal-overlay closed" id="modal-overlay"></div>
    
    <div class="modal closed" id="modal" aria-hidden="true" role="dialog">
      <button class="close-button" id="close-button">Закрыть</button>
      <div class="modal-guts" role="document">
    	<div class="form__wrapper">
    	  <form id="form-contact" method="POST" class="form-element" autocomplete="off">
    		<p class="form-title">вызвать компьютерного мастера на дом или в офис<br>в Москве | МО</p>
    		<p class="form-message"></p>
    		<input name="name" type="text" class="form-input__name" tabindex="0" placeholder="Введите ваше имя" required>
    		<input name="phone" id="phone" type="tel" class="form-input__phone" tabindex="0" placeholder="Введите ваш телефон" required>
    		<input name="theme" type="hidden" class="form-input__theme"  value="Заявка с сайта">
    		<input type="submit" class="form-input__button" onclick="ym(52794661, 'reachGoal', 'zayavka'); return true;" value="Жду звонка!">
    	  </form>
    	</div>
      </div>
    </div>


    Код JS Вы уже видели выше. Вот я бы хотел, чтобы выводимая кнопка не зависела от ID. По сути, JS делает кнопку кликабельной и открываемой. И этот ID нужен только для JS, и то не до бесконечности, как опыт показал. А как реализовать, чтобы не был привязан к JS и чтоб на любых страницах без ограничения выводить кнопку и лишь в div-ке вывода кнопки задавать текст кнопки, чёрт его знает.

    И как найти несложный выход... Легко сделать кнопку ссылкой вывода WhatsApp чата, таких кнопок можно набубенить безлимитно и на каждой странице, даже если их будет 1000, но это неблагоприятно для скорости загрузки сайта. А форма Telegram вообще не режет скорость. Однако загвоздка с неограниченным выводом из-за ID.

    В любом случае, признателен, что уделили время. Вы верно подметили - душераздирающая история, реально крик души. Такая мелочь создаёт такую сложность. А ведь форма - штука нужная на сайте.

    +7 не было , верно. Но я нашёл код, и у меня ввод номера был. Последние версии браузеров перестали стали явно хуже. Я с большим трудом откопал код для +7. Теперь даже не знаю, найду ли что-то, чтоб новые версии браузеров не портили картину.