Создание отдельной страницы

Главные вкладки

Аватар пользователя Egoist01 Egoist01 24 января 2013 в 16:42

есть такой вопрос, вот допустим что бы создать калбековскую страницу в модуле стоит в хук меню прописать путь $items['путь'] и уже внутри массива перечислить что нам надо, заголовок, какую функцию вызывать для работы на этой странице и т.д. Скажите пожалуйста как можно без модуле может в файле темы template.php можно это сделать, что бы создать такую страницу и туда выводить все необходимое что мне надо, без создания материала "Страница" куда потом в тело кидать код php.

Комментарии

Аватар пользователя Egoist01 Egoist01 24 января 2013 в 17:41

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

Аватар пользователя Egoist01 Egoist01 31 января 2013 в 13:29

актуально, кто-то скажет как правильно создавать статические страницы, куда выводить информацию, без материала страница и без помощи вьювса, по сути можно конечно аля модуль сделать и там прописать хук_меню, но может можно и без модуля прописать где-то ? )

Аватар пользователя mlmvn mlmvn 31 января 2013 в 14:04

только нода походу должна существовать... а там пишешь свой пхп код и вместо содержимого будет отображатся все что ты там напихаешь!!!!

Аватар пользователя Green Chest Green Chest 2 февраля 2013 в 19:15

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

Делаю вот так:

<?php
function forum_menu(){
    
$items = array();
    
$res db_query('SELECT id, title FROM {forum_rzd}');
    if (
db_affected_rows($res))
    {
        while(
$row db_fetch_object($res))
        {
            
$items['frm-'.$row->id] = array(
              
'title' => $row->title,
              
'page callback' => 'forum_rzd_page',
              
'access callback' => TRUE,
              
'type' => 'MENU_CALLBACK',
              
'page arguments' => array($row->id),
            );
        }
    }
    return 
$items;
}
?>

Но это срабатывает один раз при включении модуля и в процессе работы модуля, новые страницы не работают. Чтобы они заработали - модуль нужно включить, выключить. Какой инструмент, позволяет так же удобно на лету создавать в своём модуле страницы, как блоки? Перерыл api - ничего не могу найти.

Помогите, пожалуйста.

Аватар пользователя mlmvn mlmvn 2 февраля 2013 в 21:43

1. создай одну ноду с форматом ввода php
2. приинклюдь в нее свой код
3. вызывай ноду с разными параметрами с помощью GET
4. в соответствии к параметрам будут подгружатся разные данные из таблиц
5. не хочешь адреса вида http://yoursite/node/777?mymodule=paremetr1, то пропиши в .htaccess правило и будет http://mysite/node/777/mymodule/parametr1

Не могу понять, зачем Вам модуль из созданием своих страниц???????????????????

Аватар пользователя Green Chest Green Chest 3 февраля 2013 в 11:05

mlmvn wrote:
1. создай одну ноду с форматом ввода php
2. приинклюдь в нее свой код
3. вызывай ноду с разными параметрами с помощью GET

Ну ты даёшь!

1. Если уж я через свой модуль ноды создаю, то я сразу в него нужную инфу засуну и без php и при загрузке или изменении могу её так же легко обновить, много лет уже не использую формат ввода php, не зачем он - проще блок в своём модуле сделать, когда это нужно или в конце концов в теме снипет, но не прям на страницы же код, ещё и программно в своём модуле совать.
2. Если формат ввода php, то можно и не инклюдить файлов - в body в node засунуть php-код да и всё.
3. А стандартные arg()? Проще тогда обращаться вот так node/34546/param1/param2 - и вид нормальный и arg() всё удобно вернёт. (хотя в основе конечно же обычный GET)
4. Наконец-то дошли до единственного, что мне нужно.
5. Программно это делать в модуле для всех 500 тыс. страниц, да? .htaccess будет весить больше чем все файлы сайта, не говоря уже об общей дикости такого решения - прописать в .htaccess полмиллиона синонимов.

А теперь самое главное - ответ абсолютно не имеет отношения к тому что я спрашивал. Дело в том что я не хочу создавать ноду, но я хочу по обычному, нормальному адресу показать на сайте страницу. Например, по адресу мой-сайт.ру/lekarstva-na-bukvu-a.
Я не знаю заранее этих адресов, сколько их будет. Но будет их очень много (ок. 0,5 млн.) Зачем это нужно? Например, делать страницы, подобные тому что делает views. Конкретный пример - алфавитный указатель лекарств с краткими описаниями - в базе хранится в три поля - id, название, описание. Если для каждого лекарства (из ок. 3 млн) создавать ноду - получится огромное количество ненужной информации в базе, страницы для каждого препарата и т.д. А препараты каждые полчаса некоторые обновляются с другого сервера, сайт это не знает. Соответственно, вариант, когда я программно создаю ноду и в ней вывожу, например, по 6 лекарств с описаниями - не подходит. Не известно когда какое лекарство изменилось (в таблице в базе) и нужно обновить содержимое ноды. Можно сверять все 6 при каждом показе ноды. Но какие это ужасные решения.

Ладно, буду ковырять килобайты кода views в поисках того как на самом деле модулями создаются свои страницы динамически (нода в данном случае не создаётся вообще! Нет ноды, но есть страница! И кеш не нужно чистить и модуль включать-выключать!). Главное, в куче модулей это делается, я не знаю как и не нашёл как в поиске, не нашёл нужных api-функций. И им необходимо это и они это делают, а вы вместо решения задачи, предлагаете не решать её, т.е. вместо того как починить сеялку на тракторе вы предлагаете его продать и нанять на эти деньги рабочих, которые будут вместо трактора копать (! хотя в задаче - сеялку починить и ничего копать не нужно).

Аватар пользователя mlmvn mlmvn 3 февраля 2013 в 11:28

Green Chest wrote:
mlmvn wrote:
1. создай одну ноду с форматом ввода php
2. приинклюдь в нее свой код
3. вызывай ноду с разными параметрами с помощью GET

Ну ты даёшь!

1. Если уж я через свой модуль ноды создаю, то я сразу в него нужную инфу засуну и без php и при загрузке или изменении могу её так же легко обновить, много лет уже не использую формат ввода php, не зачем он - проще блок в своём модуле сделать, когда это нужно или в конце концов в теме снипет, но не прям на страницы же код, ещё и программно в своём модуле совать.
2. Если формат ввода php, то можно и не инклюдить файлов - в body в node засунуть php-код да и всё.
3. А стандартные arg()? Проще тогда обращаться вот так node/34546/param1/param2 - и вид нормальный и arg() всё удобно вернёт. (хотя в основе конечно же обычный GET)
4. Наконец-то дошли до единственного, что мне нужно.
5. Программно это делать в модуле для всех 500 тыс. страниц, да? .htaccess будет весить больше чем все файлы сайта, не говоря уже об общей дикости такого решения - прописать в .htaccess полмиллиона синонимов.

А теперь самое главное - ответ абсолютно не имеет отношения к тому что я спрашивал. Дело в том что я не хочу создавать ноду, но я хочу по обычному, нормальному адресу показать на сайте страницу. Например, по адресу мой-сайт.ру/lekarstva-na-bukvu-a.
Я не знаю заранее этих адресов, сколько их будет. Но будет их очень много (ок. 0,5 млн.) Зачем это нужно? Например, делать страницы, подобные тому что делает views. Конкретный пример - алфавитный указатель лекарств с краткими описаниями - в базе хранится в три поля - id, название, описание. Если для каждого лекарства (из ок. 3 млн) создавать ноду - получится огромное количество ненужной информации в базе, страницы для каждого препарата и т.д. А препараты каждые полчаса некоторые обновляются с другого сервера, сайт это не знает. Соответственно, вариант, когда я программно создаю ноду и в ней вывожу, например, по 6 лекарств с описаниями - не подходит. Не известно когда какое лекарство изменилось (в таблице в базе) и нужно обновить содержимое ноды. Можно сверять все 6 при каждом показе ноды. Но какие это ужасные решения.

Ладно, буду ковырять килобайты кода views в поисках того как на самом деле модулями создаются свои страницы динамически (нода в данном случае не создаётся вообще! Нет ноды, но есть страница! И кеш не нужно чистить и модуль включать-выключать!). Главное, в куче модулей это делается, я не знаю как и не нашёл как в поиске, не нашёл нужных api-функций. И им необходимо это и они это делают, а вы вместо решения задачи, предлагаете не решать её, т.е. вместо того как починить сеялку на тракторе вы предлагаете его продать и нанять на эти деньги рабочих, которые будут вместо трактора копать (! хотя в задаче - сеялку починить и ничего копать не нужно).

Молодец! Ты по техническим моментам хорошо прошелся - а я тебе всего лишь подсказал один из вариантов решения - и я уверен что это самый простой вариант в твоем случае. Иначе тебе просто придется отказаться от Друпала и сделать вывод через свою CMS если ты так уверен что пол миллиона страниц в твоей таблице будут еффективнее обрабатыватся в БД.

В моем случае также ноды можно не использовать. Сделай доступную только для администратора страницу и через php поставь форму добавления в твою таблицу.

Теперь я вкартце опишу что ты хочешь
"Я ХОЧУ ДОБАВЛЯТЬ НОДЫ НЕ ИСПОЛЬЗУЯ НОДЫ ДРУПАЛА"

Аватар пользователя Green Chest Green Chest 3 февраля 2013 в 14:04

mlmvn][quote=Green Chest][quote=mlmvn wrote:

В моем случае также ноды можно не использовать. Сделай доступную только для администратора страницу и через php поставь форму добавления в твою таблицу.

Теперь я вкартце опишу что ты хочешь
"Я ХОЧУ ДОБАВЛЯТЬ НОДЫ НЕ ИСПОЛЬЗУЯ НОДЫ ДРУПАЛА"

А вот и нет! Ещё раз. В мою таблицу на сайте не нужно ничего добавлять. К базе подключается сервер (реально их несколько) удалённо и сам меняет данные. Без сайта.

Теперь про добавлять ноды. Если бы единственный вариант вывода страниц в друпале был - ноды, то вопроса бы не было и я бы был согласен. Но есть страницы, которые не являются нодами, которые создаёт views, а так же страницы, например, входа в систему, регистрации, восстановления пароля - это не ноды!

По поводу эффективней - разумеется таблица с тремя столбцами, под работу с которой настроен удалённый сервер удобней, чем создавать ноду (три таблицы - нода, версии, синонимы путей - в сумме под тридцать столбцов, в которых будет во всех одно и тоже, кроме title и body). Здесь даже сомнения не может быть. Что лучше хранить три столбца, чем тридцать и не переделывать софт на удалённых серверах, чем переделывать его.

От того что мой модуль использует свою таблицу в базе и ему не нужно создавать нод - что теперь уже от всех функций друпала отказаться?! Всё остальное на сайте использует друпал, даже строковые фукнции - друпаловские, работа с базой через друпаловскую обёртку, пользователи, вывод других страниц, администрирование, управление блоками и модулями - всё красиво и удобно сделано средствами друпала и из-за не понимания одного вопроса - как создавать так же как в модуле views динамически страницы - отказаться от всего-всего и друпала в том числе - ну нет!

Аватар пользователя mlmvn mlmvn 3 февраля 2013 в 18:19

Понял!!!
Вот модулек быстренько склепал - проверял у себя все работает.
Скачать можешь тут http://byshev.ru/wp-content/uploads/2013/02/dpages.rar

Вот исходник:
dpages.info

<?php; $Id$
name = dpages
description = Модуль позволяет создавать динамичесские страницы, которые принимают значения в аргументе. Сам код обработки прописывается в dpages.module
core = 6.x?>

dpages.module

<?php
function dpages_menu() {
     
$items['dpages/%'] = array(
         
'title' => t('@var',array('@var' => $var)),
         
'page callback' => 'url_page_callback',
         
'access callback' => TRUE,
         
'page arguments' => array(1),
         
'type' => MENU_CALLBACK,
     );
         return 
$items;

function 
url_page_callback($var NULL) {
drupal_set_title(t('@var',array('@var' => $var)));
return 
t('@var'.'<br>Сэ тим аргументом делаешь что хочешь!!!! С тебя пиво!!!!',array('@var' => $var));
}
?>

Не забывай, что файлы должны быть в UTF8 без ВОМ

Аватар пользователя Green Chest Green Chest 3 февраля 2013 в 20:02

Да, это такой же код, как в моём сообщении, 5 постов выше. И я написал в чём проблема его использования. Аргументы у меня тоже передаются, страницы тоже создаются. Ладно, я наконец-то разобрался с личными делами и сейчас за работу - ковырять views и пытаться понять как же он создаёт страницы.

Динамически нужно создавать страницы, где в $items['dpages'] значений, которое здесь 'dpages' - полмиллиона и они постоянно меняются, мне не нужны пути вида dpages/1, dpages/2, иначе я бы сделал блок на одной ноде, которую создал бы вручную и там были бы пути node/56233/1, node/56233/2, node/56233/3, а мой блок висящий на этой страницы брал бы в arg() нужные параметры. Но я же хочу страницы типа:
preparati-ot-gripa, novie-sredstva-lechenia, oborudovanie-dlya-inectsiy и так далее (полмиллиона ориентировочно). В задаче этой я почти всё знаю (как передать параметры, как вывести то что мне нужно, как это хранить в базе, как преобразовать заголовки в пути с помощью модуля path и так далее), кроме того как создавать эти пути динамически. Я могу их создать вот эти кодом, что и я и ты привёл - но они создадутся единожды, при включении модуля и в процессе работы новые не будут добавляться, пока модуль не выключишь и снова включишь.

P.S. Касперский кстати твою ссылку блокирует, посмотри что у тебя там не так, может вирусня какая.

Аватар пользователя mlmvn mlmvn 10 ноября 2015 в 11:48

Да, есть такая проблемка)
А если страниці плодить параметрами УРЛок /dpages/1 ... /dpages/100000000
а чистый УРЛ решить модулем Path (Проверял - работает)
Посмотри скриншоты!

http://www.drupal.ru/files/1_219.jpg
http://www.drupal.ru/files/2_131.jpg
http://www.drupal.ru/files/3_49.jpg

Аватар пользователя Green Chest Green Chest 4 февраля 2013 в 0:24

Воооот! Это уже решение! Это я понимаю! Спасибо большое! Т.к. в views столько кода, что я ничего найти по теме не смог пока, последнее твоё решение мне вполне нравится. Спасибо! Системный путь будет всегда один (меняются параметры), а реальные пути через добавление/удаление/изменение синонимов делать. Так и сделаю сейчас.

Скрин на почту выслал.

(Всё, сделал это решение! Так просто и красиво получилось! С помощью hook_menu создаём одну страницу с одним параметром, а в синонимы записываем когда нужно реальные адреса страниц. Ещё раз большое спасибо!)