Установка счетчика на страницу

Автор Lado, 10 июля 2005, 02:36:56

« предыдущая - следующая »

0 Пользователей и 4 гостей просматривают эту тему.

Lift-man

Ниже цитата ответа от автора вставки:

Отвечу словами Линуса Торвальдса:

Talk is cheap, show me your code.

По существу вопроса.

Берём исходный код:
Код
function optimus_admin_areas(&$admin_areas)
{
    global $txt;

    $counter = array_search('featuresettings', array_keys($admin_areas['config']['areas'])) + 1;

    $admin_areas['config']['areas'] = array_merge(
        array_slice($admin_areas['config']['areas'], 0, $counter, true),
        array(
            'optimus' => array(
                'label'    => $txt['optimus_title'],
                'function' => create_function(null, 'optimus_area_settings();'),
                'icon'     => 'maintain.gif',
                'subsections' => array(
                    'common'       => array($txt['optimus_common_title']),
                    'extra'        => array($txt['optimus_extra_title']),
                    'verification' => array($txt['optimus_verification_title']),
                    'counters'     => array($txt['optimus_counters']),
                    'robots'       => array($txt['optimus_robots_title']),
                    'map'          => array($txt['optimus_sitemap_title']),
                ),
            ),
        ),
        array_slice($admin_areas['config']['areas'], $counter, count($admin_areas['config']['areas']), true)
    );
}
Что здесь есть из перечисленного автором?

Может быть есть проверка, что в исходном хэше $admin_areas существуют элементы ['config']['areas']? Нет, проверки нет.

Результат возврата array_search не анализируется - а он может вернуть и false, в случае если элемент featuresettings не был найден среди ключей $admin_areas['config']['areas'].

И в этом случае придется сложить false + 1, и получить 1. А мы уверены, что в случае отсутствия этого индекса мы все ещё хотим продолжать выполнение?

А может быть в этом случае следует вставить элемент в начало массива или прицепить в хвост, а не ставить его на вторую позицию?


Следуя собственным правилам автора (инициализации, проверки и т.д.) первую строку следовало бы переписать хотя бы так:
Код
$counter = 0;
if ( isset( $admin_areas['config'] )

   && isset( $admin_areas['config']['areas'] )

   && is_array( $admin_areas['config']['areas'] )

   )

{

    $counter = array_search('featuresettings', array_keys($admin_areas['config']['areas']));

    if ( $counter !== false )

    {

       $counter += 1;

    }

}
Далее, использование array_slice конкретно в рамках конкретного форума с $admin_areas['config']['areas'] приводит к тому, что получается

Код
array_merge ( null, array( 'optimus'=>array( ... ) ), null )

и из-за этого все остальные элементы пропадают из меню.


Мне не с руки распутывать загадку, почему происходит именно это конкретно конкретной бордой, т.к. за 5 минут без погружения в код SMF и принятых конвенций  проще тривиально переписать вставку элемента с наивным for ( $i=0; $i < $len; $i++), а не тратить время на поиски в дампах переменных.

При этом я не полагаюсь на версию php (preserve_keys в array_slice начал работать только с 5.0.2), зная, что такой вариант гарантированно работать даже на php 4 (который конечно в наше время уже должен был выпилиться отовсюду).

Не спорю, это может быть не академично - вместо внутреннего итератора массива использовать внешний индекс, но честное слово - лучше так, когда работает, чем "вроде бы по правилам" и получать на выходе кривой результат.

Разумеется, можно было бы переписать и с помощью foreach или next, prev, но я вроде бы решал простую практическую задачу, а не боролся за чистоту кода, всячески его причёсывая.

Кстати, если говорить про "хороший код", то в этой строке
Код
array_slice($admin_areas['config']['areas'], $counter, count($admin_areas['config']['areas']), true)

count($admin_areas['config']['areas'])
явно лишний.

Нет нужды зачем считать элементы массива, если нам необходимо взять элементы с заданной позиции до конца. По документации вместо конкретного значения можно передать null, тогда будет получен именно тот результат, который ожидается.

--
Best regards,
AV

digger®

Это все демагогия, насчет придирок к оригинальному коду мода. Он не идеален, но там как раз не требуется проверять существования упомянутых элементов - так как это мод для SMF, они всегда существуют. И не надо мне набрасывать на вентилятор, не я автор этого мода.

Решение из этого сообщения https://www.simplemachines.ru/index.php?topic=8.msg168533#msg168533 , все равно нерабочее, так что смысла его обсуждать особо и нет

S.T.A.L.K.E.R.

@Lift-man на выбор - сюда или сюда не поленитесь и отпишите автору мода о проблемах с которыми Вы столкнулись,или дайте просто ссылку на эту тему почитать как я сделал во втором месте.Так пользы будет больше.

Lift-man

digger®, что значит "всё равно не рабочие"?
По факту с этой вставкой как раз и работает. Признаёте аргументы только свои собственные.

digger®

Цитата: Lift-man от 22 апреля 2017, 09:28:13digger®, что значит "всё равно не рабочие"?
По факту с этой вставкой как раз и работает.
У вас там потеряно что-то. Если один код заменить на другой, как в вашем сообщении указано - будет синтаксическая ошибка (третий раз уже про это пишу).

Lift-man

Где отображается эта синтаксическая ошибка? В логе ошибок нет записи указывающей на это.

digger®

Цитата: Lift-man от 22 апреля 2017, 09:55:51Где отображается эта синтаксическая ошибка?
Она у любого, кто хотя бы бейсик в школе учил, отображается в голове, глядя на код.
Надоело уже переливать из пустое в порожнее. Возьмите и сделайте ту замену которую предлагаете, увидите что отобразится.

digger®

Цитата: S.T.A.L.K.E.R. от 22 апреля 2017, 09:00:55@Lift-man на выбор - сюда или сюда не поленитесь и отпишите автору мода о проблемах с которыми Вы столкнулись,или дайте просто ссылку на эту тему почитать как я сделал во втором месте.Так пользы будет больше.
Еще больше пользы было бы сюда написать https://github.com/realdigger/SMF-Optimus/issues но я уже уже в курсе :)

S.T.A.L.K.E.R.

Цитата: digger® от 22 апреля 2017, 10:18:06Еще больше пользы было бы сюда написать https://github.com/realdigger/SMF-Optimus/issues
Знаю
Цитата: digger® от 22 апреля 2017, 10:18:06но я уже уже в курсе :)
Ну как бы да,по этому этот вариант и не был предложен.
Цитата: digger® от 22 апреля 2017, 10:04:00Возьмите и сделайте ту замену которую предлагаете, увидите что отобразится.
Ошибка 500 отобразится.

Bugo


Lift-man

Замена была сделана тогда, когда была озвучена - никаких ошибок не отображается.
Когда я учился в школе, бэйсик ещё не преподавали - персональных компьютеров в природе не было.
Как пользователь я и не обязан его знать, я должен воспользоваться теми средствами, которые предлагает разработчик. Если эти средства по каким либо причинам не работают, я хочу получить техническую поддержку в понятной форме, что и где нужно сделать. Если вы не хотите возится с пользователями, нет терпения - так не стоит браться. Удобно перевернули с ног на голову, моды это ваши проблемы, колупайтесь как хотите - а мы тут специалисты. В моем понимании система должна быть для пользователя, а не наоборот. В своё время наступал на те же грабли. С 27 летним опытом терпеливо помогаю независимо от уровня начальной подготовки, в этом одна из задач форума. Людям в регионах порой просто больше не у кого искать помощи.
Спасибо данному форму я нашёл здесь очень много полезных решений для себя как пользователя не знакомого с бэйсиком. Но вот подобное данному конкретному случаю отношение - для меня неприятная неожиданность.
Bugo конкретная помощь в решении проблемы от Вас, как от автора.

Bugo

После предлагаемого кода пункт «Свойства и параметры» теряется. В моде я лишь реализовал, чтобы пункт Оптимуса выводился не в самом низу списка, а на определенной позиции, для удобства пользователей, но если это значения не имеет, то можно и так:

Код
function optimus_admin_areas(&$admin_areas)
{
 global $txt;
 
 $admin_areas['config']['areas']['optimus'] =
 array(
 'label'    => $txt['optimus_title'],
 'function' => create_function(null, 'optimus_area_settings();'),
 'icon'     => 'maintain.gif',
 'subsections' => array(
 'common'       => array($txt['optimus_common_title']),
 'extra'        => array($txt['optimus_extra_title']),
 'verification' => array($txt['optimus_verification_title']),
 'counters'     => array($txt['optimus_counters']),
 'robots'       => array($txt['optimus_robots_title']),
 'map'          => array($txt['optimus_sitemap_title'])
 )
 );
}

Lift-man

Bugo, спасибо за помощь, поправил как Вы написали - меню "Конфигурация" стало отображаться полностью, "Поисковая оптимизация" внизу. "Свойства и параметры.." действительно выпало.

supmener

Вставил в Оптимус Браве коды Гугл Аналитики и Яндекс Метрики. Что и куда вписать в Оптимус Браве, чтобы в «Адрес страницы» и «Страницы выхода» в Яднекс Метрике отображались названия тем, а не урлы типа site.ru/index.php/topic,203.0.html?PHPSESSID=5f03c632794c7580684cb293d3777421?

GeorG

Если я всё правильно понял, то думаю это вопрос к Яндексу (т.е., это их "мастеров" надо материть, что они выводят URL, вместо названия тем). :)
Верстка тем по шаблону, их доработка/переработка, переделка тем с версии smf 1.1 на smf 2.0. Примеры работ - insidestyle.ru
Установка модов (заточка под ваш форум); Моды под заказ; Обновление форума; Правильный перенос; Удаление/лечение вирусов; Устранения ошибок.
Обращаться в ЛС
Мой форум
Модуль анти-спама CleanTalk, сам пользуюсь
Сервера которыми сам пользуюсь - cadedic.ru

supmener

Гугл Аналитика тоже так показывает. Чем тогда пользоваться, чтобы было удобнее?

Camden84

эх, вот скоро экзамен по инфе, как бы сдать