Проблема с пользовательской панелью управления Concrete5 single_page / admin - PullRequest
1 голос
/ 20 октября 2011

У меня возникли проблемы с правильной взаимодействием моей настраиваемой панели мониторинга single_page с базой данных.

Снимок экрана: http://i54.tinypic.com/2lvh45d.jpg

Код отзыва (single_pages / dashboard / testimonials.php): http://pastebin.com/PK4ziRih

newTestimonials.php Код:

<?php
defined('C5_EXECUTE') or die("Access Denied.");
$testimonial_name = $_POST['testimonial_name'];
$testimonial_content = $_POST['testimonial_content'];
$url = "http://www.eurofloors.co.nz/dashboard/testimonials/";

$con = mysql_connect('localhost', 'username', 'password');
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("eurofloo_website", $con);

$sql = "INSERT INTO testimonials (id, name, content) VALUES " . $testimonial_name . $testimonial_content;

mysql_query($sql);

/* Redirect browser */
header("Location:" .$url);
/* Make sure that code below does not get executed when we redirect. */
exit;
?>

save_testimonials.php Код:

<?php
defined('C5_EXECUTE') or die("Access Denied.");

$existing_testimonials_update = $_POST['data'];

$con = mysql_connect('localhost', 'username', 'password');
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("eurofloo_website", $con);

$sql = "INSERT INTO testimonials VALUES " . $existing_testimonials_update;

$result = mysql_query($sql);


mysql_close($con);

?>

Моя проблема с этой страницей заключается в том, что, когда я отправляю новую форму отзыва или нажимаю «Сохранить» в сетке данных внизу. Я получаю сообщение об ошибке Страница не найдена, потому что concrete5 не может видеть php-файлы, установленные в атрибуте action форм. Есть ли очевидная причина, по которой это происходит, или это потому, что я не использовал подход MVC?

Не могли бы вы указать мне правильное направление? Главное, что я ищу, это какая-то документация примеров синтаксиса контроллера и модели для взаимодействия с БД и обработки данных формы.

Любой предоставленный совет или ресурсы очень ценятся.

ps: я все еще новичок в PHP, поэтому, возможно, я неправильно подхожу к коду.

1 Ответ

1 голос
/ 21 октября 2011

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

http://www.concrete5.org/documentation/how-tos/developers/build-a-single-page-powered-editing-interface-for-concrete5/

Когда вы говорите, что вы новичок в PHP, вы новичок в веб-программировании в целом или вы уже знакомы с другими языками и средами MVC? Если последнее, то я предупреждаю, что в вышеприведенной статье происходит действительно ужасная вещь, когда разные представления для действий контроллера находятся в одном файле представления, разделенном большой инструкцией «если». Если это оскорбляет ваши чувства так же, как мои, я нашел способ улучшить эту работу, дайте мне знать, если вы хотите это увидеть. [РЕДАКТИРОВАТЬ: См. https://github.com/jordanlev/c5_boilerplate_crud для лучшей техники. Он работает из коробки на Concrete5.5.0 и выше. Если вы застряли на 5.4.x, вы можете применить этот патч к вашей системе, чтобы он работал правильно: https://github.com/concrete5/concrete5/pull/147/files]. Если вы новичок в программировании в целом, вы можете полностью игнорировать этот параграф, так как он не будет иметь особого смысла:)

Что касается кода базы данных, который вы используете, если вы взаимодействуете с базой данных Concrete5, не используйте все эти вещи mysql_connect - C5 уже устанавливает соединение с базой данных и использует библиотеку ADODB для взаимодействия с ней, например так:

$db = Loader::db();
$sql = "INSERT INTO testimonials (name, content) VALUES ?, ?";
$vars = array($testimonial_name, $testimonial_content);
$db->query($sql, $vars);

Обратите внимание, что я пропустил "id" из списка полей вашего оператора вставки - я предполагаю, что id - это поле первичного ключа с автоинкрементом в таблице MySQL, что означает, что вы этого не делаете вставьте что-нибудь для этого (база данных просто волшебным образом создаст свой собственный номер). Это общая вещь MySQL, кстати - не имеет ничего общего с C5 конкретно.

Если вы хотите подключиться к другой базе данных , то код «Загрузчик» будет немного другим - см. Раздел «Подключение к другим базам данных» на этой странице: http://www.concrete5.org/documentation/developers/system/database-connectivity (и особенно обратите внимание на последнюю строку в примере кода, которая сбрасывает соединение, когда это будет сделано - вы должны сделать это, иначе Concrete5 потерпит неудачу после выполнения вашего пользовательского кода).

Удачи!

...