丝绸之路php

Silm routing php

我在 mySql 中创建了一个数据库,并且有一个用于投资组合项目的页面。但是,当我尝试通过 id 为投资组合的项目创建 link 时,我不断收到错误消息。

苗条的我看过了docs

我还查看了 Whosebug 上已有的各种问题,包括;

这个question

我还查看了一些关于组路由的内容,但仍然感到困惑。我已经在互联网上阅读过关于使用 PDO 的信息,但还没有涉及到。我正在徘徊是否有一种方法可以在单击模板时路由投资组合项目,其中 url 将使用 mysql table?[= 中行的 ID 号19=]

这是我的索引文件,如果您需要查看更多,请告诉我。 非常感谢

<?php

require __DIR__ . '/vendor/autoload.php';
date_default_timezone_set ( "Europe/London" );


$app = new \Slim\Slim( array(
  'view' => new \Slim\Views\Twig()
));


$view = $app->view();
$view->parserOptions = array(
    'debug' => true,

);

$view->parserExtensions = array(
    new \Slim\Views\TwigExtension(),
);

$dbc = mysqli_connect('localhost','root','pass','tom_db')
or die('Error Connecting to mysql server');

$query = "SELECT id  FROM documentaries";
$result = mysqli_query($dbc,$query);

while ($row = mysqli_fetch_assoc($result)){
        $data[] = $row["id"];
}



//what happens here is what will run with our object
$app->get('/', function() use($app){
  $app->render('about.twig');
});


//portfolio page
    $app->get('/portfolio', function() use ($app) {
        $app->render('portfolio.twig');
    });

    $app->get('portfolio/{id}', function ($id) {
        $app->render('portfolioitem.twig', array(
            'data' => $data
        ));
    });

$app->get('/contact', function() use($app){
  $app->render('contact.twig');
})->name('contact');

$app->run();


?>

EDIT/UPDATE:

我遇到的错误是,当单击投资组合 link 时,它不会呈现 url portfolio/1 但是如果我手动输入 url浏览器呈现 html 没有样式。我正在渲染一个树枝文件,但它似乎不起作用

这是我更新的索引文件;

<?php

require __DIR__ . '/vendor/autoload.php';
date_default_timezone_set ( "Europe/London" );

\Slim\Slim::registerAutoloader();
$app = new \Slim\Slim();

$app = new \Slim\Slim( array(
  'view' => new \Slim\Views\Twig()
));


$view = $app->view();
$view->parserOptions = array(
    'debug' => true,

);

$view->parserExtensions = array(
    new \Slim\Views\TwigExtension(),
);

//what happens here is what will run with our object
$app->get('/', function() use($app){
  $app->render('about.twig');
});

//portfolio page
$app->get('/portfolio', function() use($app){
  $app->render('portfolio.twig');
})->name('portfolio');

//this is function where the problem is, when in the portfolio.twig file it does not link to this
$app->get('/portfolio/:id', function ($id) use ($app) {
    // include out mysql connection code and make the connection
    $db = mysqli_connect('localhost', 'root', 'pass', 'tom_db');


    // query the database
    $rs = mysqli_query($db, "SELECT id FROM documentaries WHERE id=$id" );

    // convert the record set into an associative array so we can work with it easily
    $data = mysqli_fetch_assoc($rs);


    $app->render('portfolioitem.twig', array(
            'data' => $data
        )
    );
});


$app->get('/contact', function() use($app){
  $app->render('contact.twig');
})->name('contact');

$app->run();


?>

编辑:添加了额外的树枝文件

这是我的portfolioitem.twig

{% extends 'main.twig' %}

{% block nav %}
     <ul>
        <li><a href="{{ baseUrl() }}" >About</a></li>
        <li><a href="{{ siteUrl('/portfolio') }}" class="selected">Portfolio</a></li>
        <li><a href="{{ siteUrl('/clients') }}">Clients</a></li>
        <li><a href="{{ siteUrl('/teaching') }}">Teaching</a></li>
        <li><a href="{{ siteUrl('/contact') }}">Contact</a></li>
     </ul>
 {% endblock nav %}
{% block content %}

  <section>
    <h2>This is a test</h2>
  </section>

{% endblock content %}

这是我的portfolio.twig

{% extends 'main.twig' %}

{% block nav %}
     <ul>
        <li><a href="{{ baseUrl() }}" >About</a></li>
        <li><a href="{{ siteUrl('/portfolio') }}" class="selected">Portfolio</a></li>
        <li><a href="{{ siteUrl('/clients') }}">Clients</a></li>
        <li><a href="{{ siteUrl('/teaching') }}">Teaching</a></li>
        <li><a href="{{ siteUrl('/contact') }}">Contact</a></li>
     </ul>
 {% endblock nav %}

{% block content %}

      <section>
        <div class="showreel-container">
         <iframe src="https://player.vimeo.com/video/148640837?title=0&byline=0&portrait=0" width="500" height="281" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
        </div>
      </section>

      <section>

        <div id="controls" id="Controls">

            <button class="filter" data-filter="all">All</button>
            <button class="filter" data-filter=".documentaries">Documentary</button>
            <button class="filter" data-filter=".commercial">Commercial</button>
            <button class="filter" data-filter=".charity">Charity/NGO/Commisions</button>
            <button class="filter" data-filter=".music">Music</button>
            <button class="filter" data-filter=".drama">Drama</button>

        </div>



        <div id="Container" class="container">

          <div class="mix documentaries" data-myorder="1"><a href="portfolio/{{ data.id }}"><img src="img/numbers-01" alt="Image one"/></a></div>
          <div class="mix commercial" data-myorder="2"><a href=""><img src="img/numbers-02" alt="Image two"/></a></div>
          <div class="mix commerical" data-myorder="3"><a href=""><img src="img/numbers-06" alt="Image six"/></a></div>
          <div class="mix charity" data-myorder="4"><a href=""><img src="img/numbers-09" alt="Image nine"/></a></div>
          <div class="mix music" data-myorder="5"><a href=""><img src="img/numbers-12" alt="Image twelve"/></a></div>
          <div class="mix drama" data-myorder="6"><a href=""><img src="img/numbers-01" alt="Image one"/></a></div>
          <div class="mix music" data-myorder="5"><a href=""><img src="img/numbers-12" alt="Image twelve"/></a></div>
          <div class="mix charity" data-myorder="5"><a href=""><img src="img/numbers-12" alt="Image twelve"/></a></div>

          <div class="gap"></div>
          <div class="gap"></div>

        </div>


      </section>

{% endblock content %}

最后这是我的 main.twig 文件;

<!DOCTYPE html>
<html>
  <head>
    {% block head %}
      <meta charset="utf-8">
      <title>Tom Turner - Director of Photography</title>
      <link rel="stylesheet" href="css/normalize.css">
      <link href='https://fonts.googleapis.com/css?family=Changa+One|Open+Sans:400,400italic,700,700italic,800' rel='stylesheet' type='text/css'>
      <link rel="stylesheet" href="css/main.css">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
      <script type="text/javascript" src="js/jquery.mixitup.min.js"></script>
      <script type="text/javascript" src="js/main.js"></script>
      <script type="text/javascript" src="js/responsivemenu.js"></script>

    {% endblock head %}
  </head>

  <body>
    <header>
      <a href="index.html" id="logo">
        <h1>Tom Turner</h1>
        <h2>Director of Photography</h2>
      </a>
      <nav>
        {% block nav %}
          <ul>
            <li><a href="{{ baseUrl() }}" class="selected">About</a></li>
            <li><a href="{{ siteUrl('/portfolio') }}">Portfolio</a></li>
            <li><a href="{{ siteUrl('/clients') }}">Clients</a></li>
            <li><a href="{{ siteUrl('/teaching') }}">Teaching</a></li>
            <li><a href="{{ siteUrl('/contact') }}">Contact</a></li>
          </ul>
        {% endblock nav %}
      </nav>
    </header>

    <div id="wrapper">

      {% block content %}
      {% endblock content %}

    </div>

     <footer class="main-footer">
       {% block footer %}


        <div id="footer-notes">
          <p>Tom Turner - Director of Photography</p>
          <p>&copy; Tom Turner - All Rights Reserved</p>
        </div>
       <div id="mayur">
          <p>&copy; 2015 Website by <a href="https//:www.mayurpande.com">Mayur Pande</a></p>

        </div>

        <div class="social-media">
          <ul>

              <li><a href="mailto:tom@allritesreversed.co.uk"><img src="img/mail_circle.png" alt="Email Logo" /></a></li>
              <li><a href="https://www.facebook.com/tom.turner.397501?fref=ts"><img src="img/fbcircle.png" alt="Facebook Logo" /></a></li>
              <li><a href="https://vimeo.com/user6107855"><img src="img/vimeo_circle.png" alt="Vimeo Logo" /></a></li>
              <li><a href="https://twitter.com/intent/tweet?screen_name=mayurpandeuk"><img src="img/twitter_circle.png" alt="Twitter Logo" /></a></li>

            </ul>
          </div>
       {% endblock footer %}
      </footer>

      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
      <script type="text/javascript" src="js/jquery.mixitup.min.js"></script>
      <script type="text/javascript" src="js/main.js"></script>
      <script type="text/javascript" src="js/responsivemenu.js"></script>

  </body>
</html>

我的 htaccess 文件;

RewriteEngine On

# Some hosts may require you to use the `RewriteBase` directive.
# If you need to use the `RewriteBase` directive, it should be the
# absolute physical path to the directory that contains this htaccess file.
#
# RewriteBase /

RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

您的样式表是相对于当前 URL 路径的,因此当您位于

/portfolio,它会寻找/portfolio/main.css。更新您的 link 元素以包含站点 URL,或者使用 /main.css 使它们相对于根目录(注意开头的 /)。

这同样适用于模板中的 links,portfolio/{{ data.id }} 将尝试指向 /portfolio/portfolio/{{ data.id }},再次将站点 url 添加到开头,或添加斜杠。

如果您使用的是 Slim V3,请考虑使用 https://github.com/slimphp/Twig-View
或者对于 V2,使用 https://github.com/slimphp/Slim-Views编辑: 刚刚注意到您已经在使用它。

它允许您命名路线,例如:

$app->get('/portfolio/:id', function ($id) use ($app) {
    ...

    $app->render('portfolioitem.twig', array(
            'data' => $data
        )
    );
})->name('portfolio.id');

然后用

引用模板中的 url
{{ urlFor('portfolio.id', {"id": 17 }) }}

这意味着如果您的 URL 发生变化,所有引用它的 link 都会同时自动更新。

您还需要确保 .htaccess 文件配置正确。如 http://docs.slimframework.com/routing/rewrite/ 的 Slim 文档所示,它应该包含

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [QSA,L]

第 2 期

您是 运行 您的查询,它在 $data 中产生一组结果,但是您正尝试使用 {{ data.id }} 访问第一个结果,首先,您需要循环数据使用

{% for item in data %},那么你就可以使用{{ item.id }}了。或者,从您的 PHP 中获取第一项,例如 $data = $data[0],然后将其传递到您的模板中。