1

Тема: Доступ к посту по паролю

Периодически возникает необходимость показывать текущую работу заказчику.
В идеале один раз высылаешь пароль и ссылку на пост, и не надо никаких писем и прочего. И процесс идёт.

Я представляю себе это таким образом.
При включенном плагине добавляется поле «пароль» в редакторе поста.
Пароль показывается постоянно, если есть. Снятие флажка отключает проверку.

http://6.firepic.org/6/images/2014-04/17/an8j3tl95wm7.png

Для пользователя показываем заголовок поста и просьбу ввести пароль.
При этом хочется показывать выдержку к посту после заголовка.

Роман, а подскажите как лучше это организовать?

2

Re: Доступ к посту по паролю

Это делается через такое расширение.

При установке создаются дополнительные поля в таблице articles для хранения состояния флажка и пароля. С помощью хуков их значения редактируются через новые поля ввода в редакторе. Посмотреть, как это делается, можно в расширении s2_seo: http://s2cms.ru/trac/browser/extensions … nifest.xml

В простейшем случае при вводе пароля на страницах сайта он или его хеш записывается через JS в cookies. Тогда он автоматом будет передаваться на сервер.

После выборки информации из БД (где-то здесь:  http://s2cms.ru/trac/browser/trunk/_inc … s.php#L974) нужно проверить правильность пароля, и, если он неправилен, подменить текст страницы на код формы с полем ввода пароля.

3

Re: Доступ к посту по паролю

Отлично! То есть надо будет изменять articles.php, если я правильно понял.
Вы замечательно объясняете!

Буду пробовать.

17.04.2014 18:07:54. Текст был изменен (boo).

4

Re: Доступ к посту по паролю

Кажется, что напрямую редактировать не надо, можно обойтись хуком fn_s2_parse_page_url_pre_get_tpl или каким-нибудь другим.

5

Re: Доступ к посту по паролю

Понял, благодарю! Посмотрю на имеющиеся хуки.

6

Re: Доступ к посту по паролю

Роман, посмотрел в исходники расширения s2seo.
Через плагин получается добавить поле в расширенный редактор (как у boo на скриншоте),
записать значение этого поля в таблицу articles.pwd, но вывести его не получается.

Делаю так:

name="page[pwd]" value="<?php echo s2_htmlencode($page['pwd']); ?>"

Значение в input поле не выводится, хотя оно есть в таблице. Что я делаю не так ? (это значение лежит в другом массиве, не в $page?)

7

Re: Доступ к посту по паролю

А что в логе ошибок? Скорее всего неинициализированная переменная.

Надо убедиться, что поле pwd выбирается из таблицы в этом запросе: http://s2cms.ru/trac/browser/trunk/_admin/edit.php#L171

В s2_seo для этого используется хук fn_output_article_form_pre_page_get_qr:
http://s2cms.ru/trac/browser/extensions … st.xml#L39

8

Re: Доступ к посту по паролю

Надо убедиться, что поле pwd выбирается из таблицы в этом запросе: http://s2cms.ru/trac/browser/trunk/_admin/edit.php#L171

да, передается.

Вот код manifest.xml:

    <install>
        <![CDATA[
            // Create password field.
            if (!$s2_db->field_exists('articles', 'pwd'))
            $s2_db->add_field('articles', 'pwd', 'TEXT', true);
        ]]>
    </install>
    <uninstall>
        <![CDATA[
            $s2_db->drop_field('articles', 'pwd');
        ]]>
    </uninstall>
        
    <hooks>
        <hook id="fn_toolbar_end">
            <![CDATA[
                // Add text field to wysiwyg.
                $s2_custom_toolbar .= '<img class="separator" src="i/1.gif" alt="" />';
                $s2_custom_toolbar .= '<input type="text" name="page[pwd]" title="Пароль" value="'.$page["pwd"].'" />';
                $toolbar = str_replace('</div>', $s2_custom_toolbar.'</div>', $toolbar);
            ]]>
        </hook>
        <hook id="fn_output_article_form_pre_page_get_qr">
            <![CDATA[
                // Add pwd to select.
                $query['SELECT'] .= ', pwd';
            ]]> 
        </hook>
        
        <hook id="fn_save_article_pre_upd_qr">
            <![CDATA[
                $query['SET'] .= ', pwd = \''.$s2_db->escape($page['pwd']).'\'';
            ]]>
        </hook>
    </hooks>

В итоге - создается поле pwd. В режиме редактирования статьи выводится input поле с name=page[pwd].
При сохранении записи, значение сохраняется в таблицу articles, но не выводится в input поле (атрибут value пустой).

Если же заместо хука fn_toolbar_end использовать хук fn_output_article_form_pre_mkeys:

        <hook id="fn_output_article_form_pre_mkeys"><![CDATA[
?>
            <tr>
                <td class="label">Пароль</td>
                <td><input type="text" name="page[pwd]" size="100" 
                    value="<?php echo s2_htmlencode($page['pwd']); ?>" /></td>
            </tr>
<?php
        ]]></hook>

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

9

Re: Доступ к посту по паролю

Проблема в том, что хук fn_toolbar_end определен в функции s2_toolbar(). В ее теле нет доступа к переменной $page (это локальная переменная функции s2_output_article_form()).

Вы можете занести значение $page['pwd'] в глобальную переменную в функции s2_output_article_form(), и обращаться к ней из s2_toolbar(). Код примерно такой, я его не тестировал:

        <hook id="fn_output_article_form_pre_output"><![CDATA[
global $page_passwords_cur_pwd;
$page_passwords_cur_pwd = $page['pwd'];
        ]]></hook>

        <hook id="fn_output_article_form_pre_mkeys"><![CDATA[
?>
            <tr>
                <td class="label">Пароль</td>
                <td><input type="text" name="page[pwd]" size="100" 
                    value="<?php echo s2_htmlencode($page_passwords_cur_pwd); ?>" /></td>
            </tr>
<?php
        ]]></hook>

(Чтобы избежать возможных конфликтов имен, к глобальным переменным лучше добавлять префикс из id расширения, как page_passwords в моем примере.)

Другой способ - оставить вывод поля где-то в функции s2_output_article_form(), и поместить в нужное место страницы за счет абсолютного позиционирования в CSS.

10

Re: Доступ к посту по паролю

есть простой первобытный вариант: взять и поставить htpasswd

11

Re: Доступ к посту по паролю

Роман пишет:

Проблема в том, что хук fn_toolbar_end определен в функции s2_toolbar(). В ее теле нет доступа к переменной $page (это локальная переменная функции s2_output_article_form()).

Вы можете занести значение $page['pwd'] в глобальную переменную в функции s2_output_article_form(), и обращаться к ней из s2_toolbar(). Код примерно такой, я его не тестировал:

        <hook id="fn_output_article_form_pre_output"><![CDATA[
global $page_passwords_cur_pwd;
$page_passwords_cur_pwd = $page['pwd'];
        ]]></hook>

        <hook id="fn_output_article_form_pre_mkeys"><![CDATA[
?>
            <tr>
                <td class="label">Пароль</td>
                <td><input type="text" name="page[pwd]" size="100" 
                    value="<?php echo s2_htmlencode($page_passwords_cur_pwd); ?>" /></td>
            </tr>
<?php
        ]]></hook>

(Чтобы избежать возможных конфликтов имен, к глобальным переменным лучше добавлять префикс из id расширения, как page_passwords в моем примере.)

Другой способ - оставить вывод поля где-то в функции s2_output_article_form(), и поместить в нужное место страницы за счет абсолютного позиционирования в CSS.

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

12

Re: Доступ к посту по паролю

Готовое решение для чего? Что вы хотите сделать? Что сделали? Что ожидаете? Что получилось на самом деле?

13

Re: Доступ к посту по паролю

Роман пишет:

Готовое решение для чего? Что вы хотите сделать? Что сделали? Что ожидаете? Что получилось на самом деле?

готовое решение (расширение) для ограничения доступа к контенту по паролю.
хочу в Вашем движке реализовать функцию ограничения доступа к конкретным статьям.
что сделал: попробовал прикрутить скрипты аутентификации к шаблону, попробовал организовать хуки.
ожидаю, что Вы вдруг дадите готовое решение)
что получилось: ничего.

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

14

Re: Доступ к посту по паролю

У меня готового решения нет. Это надо программировать. Идея изложена выше. Конкретная реализация зависит от того, как вы хотите спрашивать пароль, в какую форму его вводить, запоминать или нет.